本文demo和参考例子参考-传送 门:http://blog.csdn.net/duguang77/article/details/17676797
一.增量更新优点:节省客户端和服务器端流量
增量更新和热修复是不同的两个技术
学习要求:学会jni相关操作,例如androidstudio如何生成和应用.so文件
这里有.so文件的生成和应用的简单介绍 http://www.cnblogs.com/mrszhou/p/6859137.html
二.增量更新原理-APK的查分合成
差分包:比如old.apk(大小是4M)要升级到new.apk(大小是10M),在服务器(或者手动生成old-new.patch(差分包的大小是6M)
开源工具
bsdiff下载http://www.daemonology.net/bsdiff/
bzip2下载http://www.bzip.org/downloads.html
bsdiff:
bsdiff.c 二进制比较代码生成差分包.patch用的 在命令窗口生成patch用的命令 ./bsdiff old.apk new.apk old-to-new.patch
bspatch.c 二进制文件合成代码合成新apk用的 在命令窗口合成新apk用的命令./bspatch old.apk new2.apk old-to-new.patch
bzip2:放到客户端的jni包里面的文件有以下13个:
blocksort.c bzip2.c bzip2recover.c bzlib_private.h bzlib.c bzlib.h compress.c crctable.c decompress.c dlltest.c huffman.c randtable.c spewG.c
在生成.so文件的时候可能报错:Error:(70) multiple definition of `main'
这时候把报错的main函数的名字改成main1,main2等等就行了
1.在服务端生成新旧apk的差分包
(注意:要生成每个旧版本和新版本的差分包,根据客户端传过来该客户端当前的VersionCode来查找服务端是否有该版本和新客户端的差分包,
如果没有的话就生成差分包)
例如:
1.0->4.0 生成1.0和4.0的差分包;
2.0->4.0 生成2.0到4.0的差分包
2.在客户端使用已经安装的旧版apk,使用已安装的旧版apk和old-new.patch合成新apk
3.对比合成的apk的签名、md5是否一样,一样的话就能提示安装
三.客户端实现
服务端上面传送门有demo例子下载
客户端:按照http://www.cnblogs.com/mrszhou/p/6859137.html这里生成jni包内的example.h文件,再复制.h文件到jni包里面,改文件类型为example.c 文件
并在该文件的native函数内编写
JNIEXPORT jint JNICALL Java_service_update_app_myzenglianupdate_MainActivity_zengliangu
(JNIEnv* env,object othis, jstring argv1, jstring argv2, jstring argv3){
char ** argv;
int loopVar,result; //__android_log_print(ANDROID_LOG_INFO, "bspatch.c", "开始打包之。。。。。。");
argv = (char**) malloc( * sizeof(char*));
for (loopVar = ; loopVar < ; loopVar++) {
argv[loopVar] = (char*) malloc( * sizeof(char));
}
argv[] = "bspatch";
argv[] = (*env)->GetStringUTFChars(env, argv1, );
argv[] = (*env)->GetStringUTFChars(env, argv2, );
argv[] = (*env)->GetStringUTFChars(env, argv3, ); result=bspatch(argv); //Important:释放内存,防止内存泄露
(*env)->ReleaseStringUTFChars(env, argv1, argv[]);
(*env)->ReleaseStringUTFChars(env, argv2, argv[]);
(*env)->ReleaseStringUTFChars(env, argv3, argv[]);
return result; };
然后在app/src/mian内新建jniLibs包,在包生成的.so文件拖进去
这些步骤是在前人的例子里自己亲自学习过程中,.so文件的生成和NDK的版本,报错很多,基本生成.so文件后面的就简单很多