Android Project在windows下的增量更新


本项目最初参考的是SmartAppUpdates,开头声明,尊重作者。

本项目github地址

本篇文章是介绍在windwos下进行增量更新的方法,这个windows的说明是由于以下原因:

  • 拆包 :是利用的bsdiff.exe进行的拆包,所以才声明是windows,勿喷
  • 合并 :合并还是用的bspatch算法
  • 工具 已经上传到我的github 点击查看项目下的bsdiff4.3-win32-src是win版本的拆包工具,项目下的Demo,是一个使用示例。

增量更新简介

我的理解,增量更新是一种利用bsdiff算法将新旧apk分割,然后利用bspatch算法将patch到的增量包与原有包合并成心的apk,然后安装,就成了增量更新,这种增量更新可以减少最少一般的APK大小,所以比较实用。

拆包合并

bsdiff最新的windows版本应该是bsdiff4.3-win32-src,这个我的Github的项目中已经上传,可以直接下载使用。

-拆包用法 bsdiff.exe所在文件夹下运行bsdiff oldfile newfile patchfile 就可以讲旧apk和新apk对比,形成一个新的patch文件, 这个文件应该是不限制命名的。
-合并用法 这里的合并只是用来说明下,你可以验证自己所拆的包是不是可用的,具体在项目中的合并还是使用的bspatch算法,这里运行bspatch oldfile newfile patchfile ,如果patch不能用,会提示corrupt patch. 注意,这里只做校验用。

项目说明

ApkUtils.java

ApkUtils里面有三个方法 主要是对apk做相关操作

-isInstalled 是判断是否安装了这个apk ,这个一般是第三方lib来判断的,自己项目肯定是安装了自己的apk的
-getSourceApkPath 这个最重要,是拿到现有的apk的路径。
-installApk 发送请求安装

SignUtils.java

SignUtils主要是签名判断相关方法 主要是对已安装和未安装APK签名对比

-getUnInstalledApkSignature 获取未安装的apk的签名 就是那个patch的签名
-InstalledApkSignature 获取已经安装的apk的签名

PatchUtils.java

这里就是本地native的patch方法

NDK

jni文件夹内是bzip和patch的算法,合并patch以来bzip,里面的Application.mk我配置的是全平台,可以根据自己的选择使用,Android.mk是so的相关配置,使用在自己项目的时候请注意改名。

-com_wedcel_utils_PatchUtils.h patch合并方法头文件 声明本地调用的方法
-com_wedcel_utils_PatchUtils.c 头文件的实现,主要实现了合并算法并返回一个int值,返回0表示合并成功

使用方法

参考项目中的使用方法主要是在MainActivity,为了简便期间,我将所有声明都写在了main中,并且简历了一个SecondActivity来生成一个新的apk.在main中,点击升级按钮,老apk里会提示升级,新apk提示已经是最新版本来区别,可以看我在AlertDialog中注释掉的代码。

updae方法中调用了asynctask来执行合并

PatchAsyncTask 是调用的核心所在,我这里面写死了patch和新apk的路径,使用时候请根据实际情况来使用,先拿到老apk的源文件,这个Androd会在data里保存一份,并且提供了可以拿到的方法,在apkutils的getSourceApkPath方法里面。如果拿不到,请下载完整包,如果拿到了,那就拿这个apk和patch合并成一个新的apk,并且比较旧apk和合成后的apk的签名是否一致,如果一致就可以安装了如果不一致,请下载完整包。

反馈与建议


感谢阅读这篇博客。