插件化更新用到的一个工具类 :bsdiff
下载: bisdiff
网页链接很简单
下载完成后解压缩,会得到一些.c等文件,里面有个Makefile文件,跳转到这个目录,执行make命令
如果出现一些报错可以参考这个链接,里面写的很全
执行成功后,我们就得到了一个bsdiff文件
然后把新包和老包放在这个文件里面,执行 MAC: ./bsdiff old.apk new.apk patch 最后会生成一个差分包patch
可以把这个差分包传到服务器,然后通过APP下载.
开始写Demo了
创建一个Android C工程,然后把bspatch.c放入到cpp目录下,引入肯定会报红,因为有个#include <bzlib.h>这个找不到,我们这时就要把之前下载好的bzip2引入到项目,下载链接,需要翻墙,
下载完后,打开里面的Makefile文件可以看到以下内容
然后把这些相关的文件引入到项目中,最后项目就是这样
当然Cmake文件我们也要配置一下看图
配置基本就完成了,最后就是代码,
创建native方法
private native void native_updataApk(String oldapk, String newpak,String path);
C方法
extern "C"
JNIEXPORT void JNICALL
Java_com_ancely_play_AncelyPlayer_native_1updataApk(JNIEnv *env, jobject instance, jstring oldapk_,
jstring newpak_, jstring path_) {
const char *oldapk = env->GetStringUTFChars(oldapk_, 0);
const char *newpak = env->GetStringUTFChars(newpak_, 0);
const char *path = env->GetStringUTFChars(path_, 0);
const char *argv[] = {"", oldapk, newpak, path};
p_main(4, argv);
env->ReleaseStringUTFChars(oldapk_, oldapk);
env->ReleaseStringUTFChars(newpak_, newpak);
env->ReleaseStringUTFChars(path_, path);
}
看到这个p_main,这个方法是bspatch.c里面的main方法,我把他改成p_main,好区别
一个插件化更新就这么集成完了,然后测试的化就是传参数,我简单处理,就是把老的apk和差分分全部都丢到SD卡里面,
File oldApk = new File(Environment.getExternalStorageDirectory(), "old.apk");
File newApk = new File(Environment.getExternalStorageDirectory(), "bisdiff.apk");
File path = new File(Environment.getExternalStorageDirectory(), "path");
mAncelyPlayer.updataApk(oldApk.getAbsolutePath(), newApk.getAbsolutePath(), path.getAbsolutePath());
结束.