[Android实例] 【第一节】android增量升级之生成so文件
来源:互联网 发布:中国空巢老人数据 编辑:程序博客网 时间:2024/05/17 05:13
转载: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工具类,在类中增加方法
- private native static int patchApk(String oldApkPath, String newApkPath,
- String patchPath);
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_smartapp_update_BatchUtils */
- #ifndef _Included_com_smartapp_update_BatchUtils
- #define _Included_com_smartapp_update_BatchUtils
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_smartapp_update_BatchUtils
- * Method: patchApk
- * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
- */
- JNIEXPORT jint JNICALL Java_com_smartapp_update_BatchUtils_patchApk
- (JNIEnv *, jclass, jstring, jstring, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
- blocksort.c
- bzip2.c
- bzip2recover.c
- bzlib_private.h
- bzlib.c
- bzlib.h
- compress.c
- crctable.c
- decompress.c
- dlltest.c
- huffman.c
- mk251.c
- randtable.c
- spewG.c
- unzcrash.c
- #if 0
- __FBSDID("$FreeBSD: src/usr.bin/bsdiff/bspatch/bspatch.c,v 1.1 2005/08/06 01:59:06 cperciva Exp [ DISCUZ_CODE_3 ]quot;);
- #endif
- #include <bzlib.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <err.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <err.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <android/log.h>
- #include <jni.h>
- #include "bzlib.c"
- #include "crctable.c"
- #include "compress.c"
- #include "decompress.c"
- #include "randtable.c"
- #include "blocksort.c"
- #include "huffman.c"
- #include "com_smartapp_update_BatchUtils.h"
- JNIEXPORT jint JNICALL Java_com_smartapp_update_BatchUtils_patchApk(JNIEnv *env,
- jobject obj, jstring old, jstring new, jstring patch) {
- char * ch[4];
- ch[0] = "bspatch";
- ch[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0));
- ch[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0));
- ch[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0));
- __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "old = %s ", ch[1]);
- __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "new = %s ", ch[2]);
- __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "patch = %s ", ch[3]);
- int ret = applypatch(4, ch);
- __android_log_print(ANDROID_LOG_INFO, "ApkPatchLibrary", "applypatch result = %d ", ret);
- (*env)->ReleaseStringUTFChars(env, old, ch[1]);
- (*env)->ReleaseStringUTFChars(env, new, ch[2]);
- (*env)->ReleaseStringUTFChars(env, patch, ch[3]);
- return ret;
- }
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := SmartAppUpdate
- LOCAL_SRC_FILES := com_smartapp_update_BatchUtils.c
- LOCAL_LDLIBS := -lz -llog
- include $(BUILD_SHARED_LIBRARY)
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文件进行增量升级
android,解决方案, android, 增量升级, android, android
bsdiff-4.3.zip
8.8 KB, 下载次数: 5, 下载积分: e币 -3 元
bzip2-1.0.6.zip
786.8 KB, 下载次数: 7, 下载积分: e币 -3 元
SmartAppUpdateSo.zip
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方法是私有方法,所以我们需要在该类中增加下面的方法去调用该方法第三步:在新项目中的libs文件夹下新建文件夹armeabi,并将libSmartAppUpdate.so文件拷贝到该文件夹下,并在MainActivity.java类中增加以下代码,去加载该so文件复制代码- public static int applyPatchToOwn(Context context, String newApkPath,
- String patchPath) throws IOException {
- String old = context.getApplicationInfo().sourceDir;
- return patchApk(old, newApkPath, patchPath);
- }
第四步:添加逻辑代码,在项目中,我做了两个布局,分别是升级前的和升级后的展示界面,升级前的界面为activity_main.xml,升级后的界面为activity_main_new.xml,在onCreate方法中注释不同的代码实现不同的界面效果。复制代码- static {
- System.loadLibrary("SmartAppUpdate");
- }
新增Utils类添加相应的一些方法。复制代码- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- beforeUpdate();
- afterUpdate();
- }
新增UpdateApkTask类进行旧apk和差异包合成操作。(备注:该差异包需要手动拷贝到手机指定路径下)
不要忘记添加权限第五步:用工具去生成差异包,并拷贝到手机指定路径下,在此提供一个window电脑使用的差分差异包工具bsdiff4.3-win32,请在附件中下载。该工具何以进行差分差异包,也可以进行合并就apk和差异包生成新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工具所在位置
拆分差异包命令如下:我们就能看见在指定位置下生成了差异包SmartAppUpdate.patch 合成新APK命令如下:复制代码- 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
我们就能看见在指定位置下生成了新apk SmartAppUpdate_new_patch.apk复制代码- 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增量升级之提供服务端代码,整理项目android,android, android, android【第三节】apk.zip
855.94 KB, 下载次数: 4
bsdiff4.3-win32.zip
73.52 KB, 下载次数: 4
SmartAppUpdate.zip
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上运行,下载的接口为服务端运行的顺序是,先使用DiffApk类获取差异包,然后启动服务器,这样就能调用接口下载差异包了。 二、SmartAppUpdate项目,该项目在第二节项目的基础上增加了FileDownloadThread.java类,可以进行差异包下载操作。增加权限复制代码- http://localhost:8080/ApkPatchServer/rest/download
备注:ApkPatchServer项目中代码里一些路径是根据本人的电脑设置的,所以需要童鞋们根据自己的电脑进行修改复制代码- <uses-permission android:name="android.permission.INTERNET" />
android,服务端, 项目, android, androidapk.zip
951.64 KB, 下载次数: 4
ApkPatchServer.zip
5.98 MB, 下载次数: 5
SmartAppUpdate.zip
0 0
- [Android实例] 【第一节】android增量升级之生成so文件
- 【第一节】android增量升级之生成so文件
- 【第二节】android增量升级之使用so文件进行增量升级
- 用android studio 生成增量更新的.so文件
- android NDK入门实例,生成.so文件
- Android Studio 更新升级之增量升级
- android生成so文件
- android生成so文件
- Android增量升级功能
- Android应用增量升级
- android 增量升级
- Android增量升级
- android 增量升级
- Android应用增量升级
- Android应用增量升级
- Android应用增量升级
- android应用增量升级
- Android-增量升级
- 最短路径算法介绍(转载)floyd+dijkstra
- Handler
- 单点登录与消息队列以及在J2EE中的实现方案
- 支付宝集成-iOS
- Android之ListView实现图文信息混排(服务器端)(一)
- [Android实例] 【第一节】android增量升级之生成so文件
- 【FineUI自学笔记】2.搭建环境
- CSS 笔记1
- [UIScreen mainScreen].scale
- boost shared_ptr 及C++内存管理的一些总结
- CentOS 7 创建程序(FireFox)桌面快捷方式
- sql语句添加删除外键
- mysql主从配置大体总结
- 用VB连接MySQL数据库模块(详解)