概述
我们都知道一旦我们的应用被发布到各大平台上面之后修复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-dataandroid:name="com.taobao.android.hotfix.IDSECRET"android:value="App ID" /><meta-dataandroid:name="com.taobao.android.hotfix.APPSECRET"android:value="App Secret" /><meta-dataandroid: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() {@Overridepublic 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接入常见问题归纳
详情见
大功告成
参考:
阿里百川官网
阿里百川快速集成