zoukankan      html  css  js  c++  java
  • 【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:downloadsdiff-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:downloadsdiff-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);
        }

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

    又是一年七夕

    祝大家

  • 相关阅读:
    Linux的find命令
    Shell环境变量文件
    Spring事务配置的五种方式 巨全!不看后悔,一看必懂!
    高性能C++网络库libtnet实现:Connection
    log4j的一些配置
    MySQL的表分区
    MySQL中的datetime与timestamp比较
    如何成为一名优秀的web前端工程师
    双机热备份
    MySQL错误“Specified key was too long; max key length is 1000 bytes”的解决办法
  • 原文地址:https://www.cnblogs.com/lovewaits/p/15140748.html
Copyright © 2011-2022 走看看