Android(安卓)bsdiff 实现增量更新
16lz
2021-01-24
首先了解一下什么是增量更新,引用百度百科
增量更新是指在进行更新操作时,只更新需要改变的地方,不需要更新或者已经更新过的地方则不会重复更新,增量更新与完全更新相对。
Android 增量更新可以使用bsdiff
首先下载bsdiff之后解压,进入文件夹执行make,如果报以下错误需要下载bzip2然后解压进入bzip2目录执行make编译
cc -O3 -lbz2 bspatch.c -o bspatch/tmp/ccUIgKAP.o:在函数‘main’中:bspatch.c:(.text.startup+0x142):对‘BZ2_bzReadOpen’未定义的引用bspatch.c:(.text.startup+0x1ac):对‘BZ2_bzReadOpen’未定义的引用bspatch.c:(.text.startup+0x216):对‘BZ2_bzReadOpen’未定义的引用bspatch.c:(.text.startup+0x2ff):对‘BZ2_bzRead’未定义的引用bspatch.c:(.text.startup+0x3eb):对‘BZ2_bzRead’未定义的引用bspatch.c:(.text.startup+0x474):对‘BZ2_bzRead’未定义的引用bspatch.c:(.text.startup+0x4b4):对‘BZ2_bzReadClose’未定义的引用bspatch.c:(.text.startup+0x4c3):对‘BZ2_bzReadClose’未定义的引用bspatch.c:(.text.startup+0x4d2):对‘BZ2_bzReadClose’未定义的引用collect2: error: ld returned 1 exit status<内置>: recipe for target 'bspatch' failedmake: *** [bspatch] Error 1
编译之后在bsdiff.c 和 bspatch.c 中加入以下代码
#include "bzip2/bzlib.c"#include "bzip2/crctable.c"#include "bzip2/compress.c"#include "bzip2/decompress.c"#include "bzip2/randtable.c"#include "bzip2/blocksort.c"#include "bzip2/huffman.c"
之后再执行make 不出意外就会生产bsdiff 和 bspatch 文件,这两个文件用于命令行执行。
Android端使用bsdiff
由于Android端只需要将生成的增量包和旧的apk合成新的apk所以只需要引入bspatch.c就可以了
环境: ndk20 + android studio
- bsdiff 生成差分包
./bsdiff old.apk new.apk patch.patch
- bspatch 生成新的apk,所以我们导入bspatch.c 文件到我们Android 项目目录.
Android项目集成bspatch:
- 首先新建ndk项目,把bspatch.c文件拷贝到cpp目录下,由于 bspatch.c中使用了bzip2,所以我们导入bzip2 中如下这些文件拷贝到cpp/bzip2目录下
然后配置CMakeLists文件
file(GLOB bzip2 bzip2/*.c) add_library( native-lib SHARED ${bzip2} bspatch.c native-lib.cpp )find_library( log-lib log )include_directories(bzip2)target_link_libraries(native-lib ${log-lib} )
修改bspatch.c文件中的main方法名字改成bspatch.这样库已经导入成功了.
- 编写JNI函数
extern "C"JNIEXPORT jint JNICALLJava_com_example_bsdiff_MainActivity_generateNewApk(JNIEnv *env, jobject instance, jstring oldPath_, jstring newPath_, jstring patchPath_) { const char *oldPath = env->GetStringUTFChars(oldPath_, 0); const char *newPath = env->GetStringUTFChars(newPath_, 0); const char *patchPath = env->GetStringUTFChars(patchPath_, 0); char * args[4]; args[0]="bsdiff"; args[1] = (char *)oldPath; args[2] = (char *)newPath; args[3] = (char *)patchPath; int res = bspatch(4,args); env->ReleaseStringUTFChars(oldPath_, oldPath); env->ReleaseStringUTFChars(newPath_, newPath); env->ReleaseStringUTFChars(patchPath_, patchPath); return res;}
在Java层调用次方法就可以成功生成新的apk了.
更多相关文章
- Flutter(三):实现Flutter代码调用Android原生代码(创建WebView Plu
- 手把手教你打造一个Material Design风格的App(一)
- [Android(安卓)开源项目学习]Android的UITableView(1)
- 如何加快Android(安卓)Studio 编译app 的速度
- 教你用电脑从 Google Play 下载 Android(安卓)程序 apk 文件
- Android(安卓)Tomcal SSL Https 单向篇
- [Android] 问题记录 - Cupcake & Donut, Sdcard 正确使用方法
- Android(安卓)----制作自己的Vendor
- GitHub最常用的开源库总结