Android 热修复方案--阿里百川HotFix

概述

我们都知道一旦我们的应用被发布到各大平台上面之后修复bug是一件很麻烦的事情,如果要重新发布审核周期之长,用户肯定不接受,虽然也可以在应用中自检更新,但是一个小小的bug动辄就更新应用实在是大材小用,但是不更新用户怎么办?这时就有人就想到了热修复方案,热修复的方案有很多,但是找到一个相对比较优秀的方案就显得尤为重要了,下图是各大方案的对比:
这里写图片描述(图片来源:阿里百川官网)
tip:
阿里百川地址:http://baichuan.taobao.com/product/hotfix.htm
快速集成地址:
http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.I8PCvL&treeId=234&articleId=106531&docType=1

Part1准备工作

2.1 android studio集成方式

gradle远程仓库依赖, 打开项目找到app的build.gradle文件,添加如下配置:
添加maven仓库地址

repositories {
   maven {
       url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories"
   }
}

添加gradle坐标版本依赖:

dependencies {
    compile 'com.taobao.android:alisdk-hotfix:2.0.9'
}

如果远程仓库访问失败那么可以选择本地库 这是HotFix集成的SDK下载链接解压,粘贴到libs目录下即可。然后更新模块下的build.gradle文件

2.2 eclipse集成方式
  • 下载sophix-sdk-2.0.9.zip,解压出alisdk-hotfix-2.0.9.aar文件后再解压这- 个aar文件
  • 复制解压文件jni目录下的libsophix.so到自己的jni目录下, eclipse jni目录一般指的就是项目libs目录
  • 复制utdid4all-1.1.5.3_proguard.jar和alicloud-android-utils-1.0.1.jar文件到项目libs目录下
  • 重命名classes.jar为alisdk-hotfix-2.0.9.jar并复制到项目libs目录下
  • 合并AndroidManifest.xml文件中的内容到本项目AndroidManifest.xml文件
  • 编译期间报utdid类重复异常, 那么步骤2中添加的utdid4all-1.1.5.3_proguard.jar从项目libs目录移除即可
2.3 权限说明
<! -- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<! -- 外部存储读权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

tip:6.0以及以上的设备注意权限问题

2.4 配置AndroidManifest文件
        <meta-data
            android:name="com.taobao.android.hotfix.IDSECRET"
            android:value="App ID" />
        <meta-data
            android:name="com.taobao.android.hotfix.APPSECRET"
            android:value="App Secret" />
        <meta-data
            android:name="com.taobao.android.hotfix.RSASECRET"
            android:value="RSA密钥" />

RSA密钥

2.5 混淆设置
#基线包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路径下,移动到/app路径下 
#修复后的项目使用,保证混淆结果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
2.6 特别申明

检查当前项目结构是否存在jniLibs,如果没有将不需要做任何操作。 如果有就需要添加armeabi-v7a/arm64-v8a目录,请下载SDK地址解压放入

SDK接口使用

3.1 接入范例

尽量在Application进行初始化操作,查询补丁也在初始化之后就操作。

SophixManager.getInstance().setContext(this)
                .setAppVersion(appVersion)
                .setAesKey(null)
                .setEnableDebug(true)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 补丁加载回调通知
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明补丁加载成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后应用自杀
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 内部引擎异常, 推荐此时清空本地补丁, 防止失败补丁重复加载
                            // SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                        }
                    }
                }).initialize();
SophixManager.getInstance().queryAndLoadNewPatch();
3.2 接口说明
3.2.1 queryAndLoadNewPatch方法

该方法主要用于查询服务器是否有新的可用补丁. SDK内部限制连续两次queryAndLoadNewPatch()方法调用不能短于3s, 否则的话就会报code:19的错误码. 如果查询到可用的话, 首先下载补丁到本地, 然后

应用原本没有补丁, 那么如果当前应用的补丁是热补丁, 那么会立刻加载(不管是冷补丁还是热补丁). 如果当前应用的补丁是冷补丁, 那么需要重启生效.
应用已经存在一个补丁, 首先会把之前的补丁文件删除, 然后不立刻加载, 而是等待下次应用重启再加载该补丁

补丁在后台发布之后, 并不会主动下行推送到客户端, 需要手动调用queryAndLoadNewPatch方法查询后台补丁是否可用.

只会下载补丁版本号比当前应用存在的补丁版本号高的补丁, 比如当前应用已经下载了补丁版本号为5的补丁, 那么只有后台发布的补丁版本号>5才会重新下载.

3.2.2 cleanPatches()方法

清除本地补丁

3.2.3 PatchLoadStatusListener接口

该接口需要自行实现并传入initialize方法中, 补丁加载状态会回调给该接口, 参数说明如下:

  • mode: 补丁模式, 0:正常请求模式 1:扫码模式 2:本地补丁模式
  • code: 补丁加载状态码, 详情查看PatchStatusCode类说明
  • info: 补丁加载详细说明, 详情查看PatchStatusCode类说明
  • handlePatchVersion: 当前处理的补丁版本号, 0:无 -1:本地补丁 其它:后台补丁

这里列举几个常见的code码说明, 详情查看SDK中PatchStatus类的代码,其中有具体说明

  • code: 1 补丁加载成功
  • code: 6 服务端没有最新可用的补丁
  • code: 11 RSASECRET错误,官网中的密钥是否正确请检查
  • code: 12 当前应用已经存在一个旧补丁, 应用重启尝试加载新补丁
  • code: 13 补丁加载失败, 导致的原因很多种, 比如UnsatisfiedLinkError等异常, 此时应该严格检查logcat异常日志
  • code: 16 APPSECRET错误,官网中的密钥是否正确请检查
  • code: 18 一键清除补丁
  • code: 19 连续两次queryAndLoadNewPatch()方法调用不能短于3s

tip:应用当前版本号是1.1.0, 那么只能在后台查询到1.1.0版本对应发布的补丁, 而查询不到之前1.0.0旧版本发布的补丁

Part2 生成patch补丁

patch补丁包生成需要使用到打补丁工具BCFixPatchTools-XXX.jar, 如还未下载打包工具,请前往文档SDK下载&版本更新记录下载Android打包工具。

一般我都是利用工具来生成补丁的,图形工具使用方便简单。

这里写图片描述

这里写图片描述
也可以签名哦!

利用cmd生成
  • -c, -cmd: 值为patch: 打补丁命令 值为help: 查看使用说明
  • -s, -src_apk:填写本地的原始APK(有问题的APK). 必选
  • -f, -fixed_apk:已经修复过该问题APK. 必选
  • -w, -wp:输出patch的路径, 最后如果打补丁成功会在wp目录下自动创建的hotfix-working目录生成baichuan-hotfix-patch.jar补丁文件. 必选
  • -k, -sign_file_url:本地的签名文件的路径,不输入则不做签名. 可选
  • -p, -sign_file_pass: 证书文件的密码, 可选
  • -a, -sign_alias: 证书的别名. 可选
  • -e, -sign_alias_pass: 证书别名的密码. 可选
  • -y, -aes_key: 自定义aes秘钥, 必须是16位. 可选
  • -l, -filterClassFilePath:本地的白名单类列表文件的路径,放进去的类不会再计算patch,文件格式: 一行一个类名. 可选

示例

java -jar BCFixPatchTools-1.3.0.jar -c patch -s old.apk -f new.apk -w patch-out -k test.keystore -p test123 -a test123 -e test123 -y 1234567891234567 -l filterClass.txt

调试工具使用说明

详情见

Android接入常见问题归纳

详情见

大功告成

参考:

阿里百川官网

阿里百川快速集成

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴唐人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值