浅谈 安卓增量更新
- 增量更新跟热修复是两码事,目前很多app貌似已经看不到增量更新这东西了。说实在的,挺好用,但是bug也不少,拆包简单,并包问题就可能各种各样了。
- 增量更新,blog上面很多文章了,其实再写一遍也没多大意义,就留着自己平时巩固下知识好了。
- 增量更新步骤:
- 拆分->原理就是根据旧版本apk以及新版本apk,进行算法比较差别,生成一个补丁包(命名随意吧),主要依赖BsDiff开源项目,记得依赖的是Bzip2,常规的拆分需要在服务器上面做操作,所以这里要依赖服务器做拆包,需要保存所有的版本号,进行版本对比拆分,进而生成补丁包。
拆包过程中,建议参考源码bsdiff.cpp源文件 - 合并、有了拆包,那么必须要有合并包的操作,这里都是对BsDiff进行开源的使用而已,不过多解释
- 建议在AS上面进行CMAKE开发。效率感觉比较快,而且现在也知道jni的debug模式了
- -
拆包与并包的相关代码`
//合并
JNIEXPORT void JNICALL Java_com_dongnaoedu_appupdate_utils_BsPatch_patch
(JNIEnv *env, jclass jcls, jstring oldfile_jstr, jstring newfile_jstr,
jstring patchfile_jstr) {
int argc = 4;
char oldfile = (char ) (*env)->GetStringUTFChars(env, oldfile_jstr, NULL);
char newfile = (char ) (*env)->GetStringUTFChars(env, newfile_jstr, NULL);
char patchfile = (char ) (*env)->GetStringUTFChars(env, patchfile_jstr, NULL);
//参数(第一个参数无效)
char *argv[4];
argv[0] = "bspatch";
argv[1] = oldfile;
argv[2] = newfile;
argv[3] = patchfile;
bspatch_main(argc, argv);//这里主要是算法合并
(*env)->ReleaseStringUTFChars(env, oldfile_jstr, oldfile);
(*env)->ReleaseStringUTFChars(env, newfile_jstr, newfile);
(*env)->ReleaseStringUTFChars(env, patchfile_jstr, patchfile);
}
//拆分
JNIEXPORT jint JNICALL Java_com_dongnaoedu_appupdate_utils_BsPatch_generateDiffApk
(JNIEnv *env, jclass type, jstring oldPath_,
jstring newPath_, jstring patchPath_) {
int argc = 4;
char *argv[argc];
argv[0] = (char *) “bspatch”;
argv[1] = (char *) (*env)->GetStringUTFChars(env, oldPath_, 0);
argv[2] = (char *) (*env)->GetStringUTFChars(env, newPath_, 0);
argv[3] = (char *) (*env)->GetStringUTFChars(env, patchPath_, 0);
jint result = generateDiffApk(argc, argv);//算法拆分
(*env)->ReleaseStringUTFChars(env, oldPath_, argv[1]);
(*env)->ReleaseStringUTFChars(env, newPath_, argv[2]);
(*env)->ReleaseStringUTFChars(env, patchPath_, argv[3]);
return result;
}`
- 好像没有写什么,因为增量更新本身依赖开源进行二次开发。技术还是多去尝试。才能知道其中一二。才会有所提高吧,讲真,难度在服务端。客户端只是做并包