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

概述

我们都知道一旦我们的应用被发布到各大平台上面之后修复bug是一件很麻烦的事情,如果要重新发布审核周期之长,用户肯定不接受,虽然也可以在应用中自检更新,但是一个小小的bug动辄就更新应用实在是大材小用,但是不更新用户怎么办?这时就有人就想到了热修复方案,热修复的方案有很多,但是找到一个相对比较优秀的方案就显得尤为重要了,下图是各大方案的对比:

0818b9ca8b590ca3270a3433284dd417.png(图片来源:阿里百川官网)

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 权限说明

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

2.4 配置AndroidManifest文件

android:name="com.taobao.android.hotfix.IDSECRET"

android:value="App ID" />

android:name="com.taobao.android.hotfix.APPSECRET"

android:value="App Secret" />

android:name="com.taobao.android.hotfix.RSASECRET"

android:value="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打包工具。

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

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

也可以签名哦!

利用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接入常见问题归纳

大功告成

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值