转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=903590&highlight=增量&_dsign=f69e6238
对于android项目,我们常常会遇到这样一种情况,比如某一版本的线上应用,突然发现了一个BUG,修改后发现不值当为这个BUG进行一次版本升级,那么怎么去解决在同一版本上修改线上应用的BUG呢,Google给了我们一种解决方案 Smart App update,也就是应用增量升级。 那么,何谓增量升级呢?简单的来说,也就是把同一版本的新旧两个apk进行差分,得到一个差异包,然后在旧的应用中下载该差异包和旧的apk进行合并成新的apk,然后去安装新的apk,该合成的apk和差分前新apk是一样的,这样就可以做到应用的增量升级。一般来说,获取到的差异包较之新的apk来说小了很多,这样就可以减少用户的下载流量。 增量升级需要用到jni开发,所以我们需要去生成合并差异包的so文件,这里我们需要准备的工具有:eclipse,NDK环境(这里用的是ndk9以上的版本),bsdiff文件,bzip2文件(这两个文件在下面附件中给出)。 第一步:创建一个android项目,比如SmartAppUpdateSo,设定好包名(此处为以后引用so文件的方法做准备),例如com.smartapp.update。右键点击项目 -> Android tools -> Add Native Support...,在弹出窗里填写你要生成的so文件名称,如SmartAppUpdate,这样我们就能在项目中看到jni和obj两个文件夹了,删除jni文件夹下的SmartAppUpdate.cpp文件。 第二步:新建BatchUtils工具类,在类中增加方法
2. 选择Main标签,在Location一栏中点击Browse File System,选择你NDK安装路径下的ndk-build.cmd文件,Working Directory一栏中点击Browse Workspace,选择该项目的jni文件夹 3. 选择Refresh标签,勾选Refresh resources upon completion,选择The entire workspace,勾选上Recursively include sub-folders 4. 选择BuildOptions,勾选Allocte Console,After a "Clean",During manual builds,During auto builds,Specify working set of relevant resources ,点击Specify Resources,在弹出窗中勾选该项目jni文件夹,点击Apply,点击OK,这样我们就能在Buiders列表中看见新建的SmartAppUpdateBuilder,点击OK 第七步:等待片刻,我们会发现在obj文件夹下自动编译出一些文件,而其中obj\local\armeabi下的libSmartAppUpdate.so文件就是我们需要的so文件,那么生成增量升级的so文件的教程到此为止,至于如何去使用该so文件进行增量升级,请看 【第二节】android增量升级之使用so文件进行增量升级 |
-
8.8 KB, 下载次数: 5, 下载积分: e币 -3 元
![](http://www.eoeandroid.com/static/image/filetype/zip.gif)
-
786.8 KB, 下载次数: 7, 下载积分: e币 -3 元
![](http://www.eoeandroid.com/static/image/filetype/zip.gif)
-
911.28 KB, 下载次数: 4, 下载积分: e币 -3 元
-
【第二节】
-
在第一节中,我讲了如何生成增量升级的so文件,没看的童鞋点【第一节】android增量升级之生成so文件 ,在这一节中,我讲一下如何去使用so文件进行增量升级。
第一步:建立一个新项目,如SmartAppUpdate,包名命名为com.smartapp.update,为什么要这么命名包名,是因为在第一节中,我们的BatchUtils文件是建立在com.smartapp.update包下的,而里面native方法生成的com_smartapp_update_BatchUtils.h文件也是以此包名命名的,所以为了调用so文件中的该native方法,所以我们需要在新项目中增加com.smartapp.update包,并将第一个项目中的BatchUtils.java文件拷贝到该包下
第二步:因为BatchUtils.java中的native方法是私有方法,所以我们需要在该类中增加下面的方法去调用该方法
- public static int applyPatchToOwn(Context context, String newApkPath,
- String patchPath) throws IOException {
- String old = context.getApplicationInfo().sourceDir;
- return patchApk(old, newApkPath, patchPath);
- }
- static {
- System.loadLibrary("SmartAppUpdate");
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- beforeUpdate();
- afterUpdate();
- }
新增UpdateApkTask类进行旧apk和差异包合成操作。(备注:该差异包需要手动拷贝到手机指定路径下)
不要忘记添加权限
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
先获取两个不同的apk,如该项目中先在oncreate方法中注释掉afterUpdate()方法,生成一个apk,然后再注释掉beforeUpdate()方法,生成另一个apk,将两个apk拷贝到电脑指定路径下。
然后打开cmd,进入到bsdiff4.3-win32工具所在位置
拆分差异包命令如下:
- bsdiff 旧apk地址 新apk地址 生成差异包地址
- 如:bsdiff C:\Users\krubo\Desktop\aaa\SmartAppUpdate.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate_new.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate.patch
- bspatch 旧apk地址 新apk地址 差异包地址
- 如:bspatch C:\Users\krubo\Desktop\aaa\SmartAppUpdate.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate_new_patch.apk C:\Users\krubo\Desktop\aaa\SmartAppUpdate.patch
比较SmartAppUpdate_new.apk和SmartAppUpdate_new_patch.apk,就会发现,这两个apk是一模一样的。
第六步:将第五步中生成的差异包SmartAppUpdate.patch拷贝到手机的指定路径下,然后安装旧的apk,也就是注释掉afterUpdate()方法生成的apk,然后点击升级按钮,等待片刻,我们就能看见新apk安装界面,安装完成后,点击进入,发现里面的界面已改变,至此,使用so文件进行增量升级教程已结束。【第三节】android增量升级之提供服务端代码,整理项目-
855.94 KB, 下载次数: 4
-
73.52 KB, 下载次数: 4
-
1.59 MB, 下载次数: 1
- public static int applyPatchToOwn(Context context, String newApkPath,
-
-
在之前的两节中分别讲了 【第一节】android增量升级之生成so文件 和【第二节】android增量升级之使用so文件进行增量升级,没看的童鞋可以去看一下,这一节,我这边提供一个下载差异包的服务端,并且增加app中下载合并差异包的操作。
一、ApkPatchServer项目,该项目的使用springmvc粗略架构的一个项目,项目里总共只有两个类,一个是DiffApk.java,另一个是ApkPatchController.java
DiffApk.java是调用电脑里的bsdiff.exe工具进行差分新旧apk获取差异包的,我们可以直接run as -> java application运行。
ApkPatchController.java是提供接口的类,里面有一个提供下载差异包的方法,调用接口需要先将该项目部署到tomcat上运行,下载的接口为
- http://localhost:8080/ApkPatchServer/rest/download
- <uses-permission android:name="android.permission.INTERNET" />
-
![](http://www.eoeandroid.com/static/image/filetype/zip.gif)