【Android增量更新】bsdiff增量更新测试记录
在安卓更新这块,我目前已知的 从dll更新,APK强更,到后面需要支持Google商城64需求,so文件更新,到现在高版本的Unity不支持so文件更新
所以开始尝试使用bsdiff增量更新,特此做记录,方便后面查阅
======================================================================
参考文档:Android 如何实现增量更新
什么是增量更新?
现在的APP安装包体积越来越大,几百兆甚至上G的,当APP更新时不再是消耗大量的流量下载一个完整安装包,而是消耗相对很少的流量下载一个增量包(差分包),采用谷歌Smart App Updates更新机制,就能实现APP的更新了。
用户手机上已经安装着某个APP,然后只需下载一个增量包,手机上的APP和增量包合并生成完整的新APP,并引导用户安装,这个过程就是增量更新。
一.生成增量更新文件
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); }
=========================================================================
又是一年七夕
祝大家