Android增量更新 – Apk差分合并算法服务端设计
bsdiff简介
Android增量更新需要用到二进制差分工具:bsdiff
bsdiff and bspatch are tools for building and applying patches to binary files.
官方网站:http://www.daemonology.net/bsdiff/
bsdiff for windows:http://www.pokorra.de/coding/bsdiff.html
编译bsdiff差分合并算法的so库
创建bsdiff差分与合并算法的so库文件,以便Java层通过JNI的方式调用。
bsdiff编译需要bzip库支持,需要引入bzip2的源文件
bzip2:http://www.bzip.org/
Makefile
cn_appblog_diffpatchserver_BsDiffAndPatch.c
Java层调用so库实现diff和patch
Java层采用JNI方式调用so库封装的diff和patch方法
native方法声明
public class BsDiffAndPatch {
/**
* 差分
* @param oldApkPath
* @param newApkPath
* @param patchPath
* @return
*/
public native static int diff(String oldApkPath, String newApkPath, String patchPath);
/**
* 合并
* @param oldApkPath
* @param newApkPath
* @param patchPath
* @return
*/
public static native int patch(String oldApkPath, String newApkPath, String patchPath);
static {
System.loadLibrary("BsDiffAndPatch");
}
}
主函数调用
public class DiffPatchServer {
// patch存储路径
public static final String PATCH_FILE_PATH = "diff.patch";
// 使用旧版本+patch包,合成的新版本
public static final String OLD_TO_NEW_APK_PATH = "generated.apk";
private static String oldApkPath = null;
private static String newApkPath = null;
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("抱歉,参数不正确!");
return;
}
System.out.println("\n\n------ Android Apk差分合并算法服务端演示 ------");
String os = System.getProperty("os.name");
System.out.println("操作系统:" + os);
oldApkPath = args[0];
newApkPath = args[1];
System.out.println("旧版Apk:" + oldApkPath);
System.out.println("新版Apk:" + newApkPath);
System.out.println();
generateDiff();
System.out.println();
applyPatch();
System.out.println();
}
public static void generateDiff() {
System.out.println("正在生成差分文件,请稍后...");
BsDiffAndPatch.diff(oldApkPath, newApkPath, PATCH_FILE_PATH);
}
public static void applyPatch() {
System.out.println("正在创建合并文件,请稍后...");
BsDiffAndPatch.patch(oldApkPath, OLD_TO_NEW_APK_PATH, PATCH_FILE_PATH);
try {
System.out.println("新版Apk MD5值:" + MD5Util.getFileMD5String(newApkPath));
System.out.println("合并Apk MD5值:" + MD5Util.getFileMD5String(OLD_TO_NEW_APK_PATH));
} catch (IOException e) {
e.printStackTrace();
}
}
}
生成jar包
注意指定 Main Class
执行差分合并算法
通过参数传入旧版Apk和新版Apk名称,生成差分包:diff.patch和合并Apk:generated.apk
比较新版Apk与合并Apk的MD5值是一致的,表明bsdiff差分合并成功!
java -Djava.library.path=. -jar BsDiffAndPatch.jar DiffUpdate_v1.apk DiffUpdate_v2.apk
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/05/01/android-incremental-update-apk-differential-merge-algorithm-server-design/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论