【Android增量更新】bsdiff增量更新测试记录

在安卓更新这块,我目前已知的 从dll更新,APK强更,到后面需要支持Google商城64需求,so文件更新,到现在高版本的Unity不支持so文件更新

所以开始尝试使用bsdiff增量更新,特此做记录,方便后面查阅

======================================================================

参考文档:Android 如何实现增量更新

什么是增量更新
现在的APP安装包体积越来越大,几百兆甚至上G的,当APP更新时不再是消耗大量的流量下载一个完整安装包,而是消耗相对很少的流量下载一个增量包(差分包),采用谷歌Smart App Updates更新机制,就能实现APP的更新了。

用户手机上已经安装着某个APP,然后只需下载一个增量包,手机上的APP和增量包合并生成完整的新APP,并引导用户安装,这个过程就是增量更新。

一.生成增量更新文件

1.下载bsdiff-v4.3-win-x64.zip

2.将需要生成增量包的两个版本包放在bsdiff解压文件夹下

3.使用cmd命令生成增量文件

E:\download\bsdiff-v4.3-win-x64>bsdiff.exe release1.11.0.apk release1.12.0.apk v11_12update.patch

 

 

 

v11_12update.patch就是生成的增量文件

 

二.合并增量文件

1在pc测试合并

在上面的目录下使用cmd命令合并新的apk

E:\download\bsdiff-v4.3-win-x64>bspatch.exe release1.11.0.apk new.apk v11_12update.patch

 

 

 

 

new.apk就是合并的新apk

测试结果:测试正常,合并的新包和高版本包内容一致(测试内容不方便截图)

2在Android测试合并

1)在project的build.gradle添加下面代码

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

2)下载导入libbspatch.so

可以去 github.com/jiyouliang2/smartupdatedemo 下载,上面还有实例

 

 

 这里根据我当前项目需要我只导入了arm64-v8a和armeabi-v7a

3)添加存储读写权限

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4)导入合并代码PatchUtil

package com.itheima.updatelib;

public class PatchUtil {

    static {
        System.loadLibrary("bspatch");
    }

    /**
     * 合并生成新版本apk
     * <p>
     * 返回:0,说明操作成功
     *
     * @param oldApkPath 旧版本apk路径
     * @param newApkPath 新版本apk路径
     * @param patchPath  差分包/更新包 路径
     * @return
     */
    public static native int patch(String oldApkPath, String newApkPath,
                                   String patchPath);
}

5)从服务器下载你打出来的差量文件(这步略过,自己实现)

6)合并差量文件

a.获取当前版本包

PackageManager pMgr = context.getPackageManager();
ApplicationInfo appInfo = pMgr.getApplicationInfo(context.getPackageName(),0);
final String oldPath = appInfo.sourceDir;

b.获取下载下来的差量文件路径(这里就是上面下载下来的存放位置)

final File patchFile = new File(patchFolder, "patch.patch");

c.合并完的新apk存放位置(经过实验,不要放在系统磁盘下面,安装的时候会有权限问题)

File fileRootPathFile = context.getExternalFilesDir("/apkFile");
if (!fileRootPathFile.exists())
    fileRootPathFile.mkdir();
File newApkFolder = new File(fileRootPathFile.getAbsolutePath() + "/"+ targetVersion);
if (!newApkFolder.exists())
    newApkFolder.mkdir();
final File newApkFile = new File(newApkFolder , "/new.apk");

d.开启子线程进行合并操作

new Thread(new Runnable() {
                @Override
                public void run() {
                    int result = PatchUtil.patch(oldPath, newApkFile.getAbsolutePath(), patchFile.getAbsolutePath());
                    if (result == 0){
                        installApk(newApkFile.getAbsolutePath());
                    }
                    else
                    {
                        SDebug.Log("合并失败!");
                    }
                }
            }).start();

e.合并完成安装

    private void installApk(String apkPath) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse("file://" + apkPath), "application/vnd.android.package-archive");

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

 =========================================================================

又是一年七夕

祝大家

 

posted @ 2021-08-14 14:12  lovewaits  阅读(270)  评论(0编辑  收藏  举报