热修复火了这么久,然而我最近才开始尝试使用它,原因是看了微信公众号上推送了一篇关于微信tinker热修复使用的文章,然后网上一搜,就开始使用hotfix了,它是andfix的优化版。
关于几种热修复的对比,网上有很多文章,我看的是这篇
1、配置build.gradle
仓库
repositories {
maven { url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories" }
}
或者
repositories {
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
}
以及依赖包
compile 'com.taobao.android:alisdk-hotfix:2.0.9'
或者
compile 'com.aliyun.ams:alicloud-android-hotfix:3.0.2'
2、配置manifest.xml
基本权限
<! -- 网络权限 -->
<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"/>
基本参数配置
<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密钥" />
以上三个值存在于阿里百川热修复控制台,用淘宝账号登陆的,这里可能需要申请一个什么公测资格的,反正填写个人及应用相关信息即可申请成功,很快。
3、初始化热修复,这段代码放在自定义Application的onCreate方法的最前面
SophixManager.getInstance().setContext(this)
.setAppVersion(BuildConfig.VERSION_NAME)
.setEnableDebug(true)
.setEnableFullLog()
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(int mode, int code, String info, 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();
}
4、生成补丁包,利用阿里百川提供的补丁生成工具,如下图所示
设置密钥信息等
这里输入相关密钥信息就好,点击确定回到上面的对话框,再次点击GO
最后会生成一个 sophix-patch.jar 格式的补丁文件
5、把这个补丁文件上传到阿里百川控制台你创建的应用里,经过调试工具调试后,选择全量发布即可
出现上图这种情况意味着code: 12 当前应用已经存在一个旧补丁, 应用重启尝试加载新补丁
只有code为1时才是加载补丁成功
其他注意点:
1、版本号
用户自行输入,版本号是为以.分割的多段数字,如1.0.1。版本号必须与用户App内的appVersion相同,如果不相同将导致补丁发布不成功。
2、Android Studio打包时要注意两个都选,像我之前只选择了第二个就无法成功安装,参考这里
使用扫码模式时就会出现以上错误,可能原因是控制台没有相应版本的补丁包
3、PatchLoadStatusListener接口回调说明
参数说明
- mode: 补丁模式, 0:正常请求模式 1:扫码模式 2:本地补丁模式
- code: 补丁加载状态码, 详情查看PatchStatusCode类说明
- info: 补丁加载详细说明, 详情查看PatchStatusCode类说明
- handlePatchVersion: 当前处理的补丁版本号, 0:无 -1:本地补丁 其它:后台补丁
code说明:
code: 1 补丁加载成功
code: 6 服务端没有最新可用的补丁
code: 11 RSASECRET错误,官网中的密钥是否正确请检查
code: 12 当前应用已经存在一个旧补丁, 应用重启尝试加载新补丁
code: 13 补丁加载失败, 导致的原因很多种, 比如UnsatisfiedLinkError等异常, 此时应该严格检查logcat异常日志
code: 16 APPSECRET错误,官网中的密钥是否正确请检查
code: 18 一键清除补丁
code: 19 连续两次queryAndLoadNewPatch()方法调用不能短于3s
4、对我来说有一个比较大的坑就是热修复时不要改变versionName的值,我几次测试都是改来改去versionName的值,当然我也不知道我为啥要改,可能是觉得热修复也属于版本迭代,然后版本就要变吧,总之一句话,热修复打补丁时,versionName不要变,最后成功的打上了补丁。
5、可以简单参考其他类似文章,都是大同小异,自己试过了成功了就明白了
http://www.jianshu.com/p/4ce6ae88b6b4
http://blog.youkuaiyun.com/wu996489865/article/details/70842319