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

您需要先支付 2元 才能查看此处内容!

立即支付
已支付?点击这里查询

cn_appblog_diffpatchserver_BsDiffAndPatch.c

您需要先支付 2元 才能查看此处内容!

立即支付
已支付?点击这里查询

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

image

执行差分合并算法

通过参数传入旧版Apk和新版Apk名称,生成差分包:diff.patch和合并Apk:generated.apk

比较新版Apk与合并Apk的MD5值是一致的,表明bsdiff差分合并成功!

java -Djava.library.path=. -jar BsDiffAndPatch.jar DiffUpdate_v1.apk DiffUpdate_v2.apk

image

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/05/01/android-incremental-update-apk-differential-merge-algorithm-server-design/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Android增量更新 – Apk差分合并算法服务端设计
bsdiff简介 Android增量更新需要用到二进制差分工具:bsdiff bsdiff and bspatch are tools for building and applying patches to binary files. 官方网站:h……
<<上一篇
下一篇>>
文章目录
关闭
目 录