最近项目推进app的增量更新方案,特意看了几篇文章,先来两个博客地址
主要是通过使用bsdiff和bspatch,实现Android应用的增量更新
. 增量更新的原理非常简单,就是将手机上已安装apk与服务器端最新apk进行二进制对比,并得到差分包,用户更新程序时,只需要下载差分包,并在本地使用差分包与已安装apk,合成新版apk。
例如,当前手机中已安装微博V1,大小为12.8MB,现在微博发布了最新版V2,大小为15.4MB,我们对两个版本的apk文件查分比对之后,发现差异只有3M,那么用户就只需要要下载一个3M的差分包,使用旧版apk与这个差分包,合成得到一个新版本apk,提醒用户安装即可,不需要整包下载15.4M的微博V2版apk。
接下来,我们分开说,需要做3件事。
1.在服务器端,生成这两个版本微博的差分包;
2.在手机客户端,使用已安装的旧版apk与这个差分包,合成为一个新版微博apk;
3.校验新合成的微博客户端文件是否完成,
例如: 你的apk已经发布了3个版,V1.0、V2.0、V3.0,这时候你要在后台发布V4.0,那么,当你在服务器上传最新的V4.0包时,服务器端就应该立即生成以下差分包:
V1.0 ——> V4.0的差分包;
V2.0 ——> V4.0的差分包;
V3.0 ——> V4.0的差分包;
ApkPatchLibraryServer工程即为Java语言实现的服务器端查分程序。
我们直接通过bsdiff工具完成【实际开发中由服务端生成差分包】
需要在手机客户端实现,ApkPatchLibrary工程封装了这个过程。
ApkPatchLibrary/jni/bzip2目录中所有文件都来自bzip2项目。
ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c、ApkPatchLibrary/jni/com_cundong_utils_PatchUtils.c实现文件的合并过程,其中com_cundong_utils_PatchUtils.c修改自bsdiff/bspatch.c。
我们需要用NDK编译出一个libApkPatchLibrary.so文件,生成的so文件位于libs/armeabi/ 下,其他 Android 工程便可以使用该libApkPatchLibrary.so文件来合成apk。
com.cundong.utils包,为调用C语言的Java实现;
调用,com.cundong.utils.PatchUtils中patch()方法,可以通过旧apk与差分包,合成为新apk。
/** * 类说明: APK Patch工具类 * * @author Cundong * @date 2013-9-6 * @version 1.0 */ public class PatchUtils { /** * native方法 * 使用路径为oldApkPath的apk与路径为patchPath的补丁包,合成新的apk,并存储于newApkPath * @param oldApkPath * @param newApkPath * @param patchPath * @return */ public static native int patch(String oldApkPath, String newApkPath, String patchPath); }
新包和成之后,还需要对客户端合成的apk包与最新版本apk包进行MD5或SHA1校验,如果校验码不一致,说明合成过程有问题,新合成的包将不能被安装。
增量更新的前提条件,是在手机客户端能让我们读取到当前应用程序安装后的源apk,如果获取不到源apk,那么就无法进行增量更新了。
另外,如果你的应用程序不是很大,比如只有2、3M,那么完全没有必要使用增量更新,增量更新适用于apk包比较大的情况,比如游戏客户端。
源码中,包含以下文件:
1.ApkPatchLibraryServer:Java语言实现的,服务器端生成差分包工程;
2.ApkPatchLibrary:客户端使用的apk合成库;
3.ApkPatchLibraryDemo:引用ApkPatchLibrary Library 的Demo,以新浪微博客户端的升级为例,假设手机上安装的是V4.5.0,最新版是V4.5.5,用户需要从V4.5.0升级到V4.5.5。
4.TestApk:用于测试的,旧版本的微博客户端,以及使用ApkPatchLibraryServer生成的新旧新浪微博差分包;
我把我使用到的工具和操作的DEMO传了上来可以看看