Android热修复-HotFix2.0
别等到用户卸载,Bug还没有修复
相比发版到应用市场,等待通过审核,再等到用户下载更新的冗长路径,有的用户甚至对频繁发版的APP会有抵触而不更新,热修复技术可以帮助我们在第一时间修复线上Bug。
欢迎Star or Follow我的GitHub
欢迎搜索微信公众号SamuelAndroid关注我,文章末尾有公众号二维码。
写在前面
为了方便大家先有个直观的感受,我把自己的新老包和path补丁,放到服务器上,大家可以直接下载感受一下。
点我下载
步骤一:安装old.apk;
步骤二:打开热修复测试界面,点击TOAST,此时为old;
步骤三:稍等片刻,再次点击,查看弹出提示是否为new。
热修复方案对比
| 平台|HotFix| AndFix|Tinker|Qzone|Robust|
| :----: | :--: | :--: |:--: |:--: |:--: |:--: |
| 即时生效| 是| 是|否|否|是|
| 性能消耗| 较小| 较小 |较大|较大|较小|
| 侵入式打包| 否| 否 |是|是|是|
| Rom体积 |较小| 较小|较大|较小|较小|
|接入复杂度| 傻瓜式| 简单|复杂|简单|复杂|
| 补丁大小| 较小| 较小|较小|较大|一般|
| 全平台支持| 是| 是|是|是|是|
|类替换| 是| 是|是|是|否|
|so替换| 是| 否|是|否|否|
|资源替换| 是| 否|是|是|否|
以上仅是我的个人看法,个人感觉商用的HotFix会更加稳定,再者阿里的AndFix是开源的,他们的团队也会支持HotFix。本人也尝试过使用Tinker,看了gradlew配置,就感觉头疼,最终还是选择使用HotFix。
准备
- 添加maven仓库地址:
repositories {
//HotFix
maven { url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories" }
}
- 添加gradle坐标版本依赖:
dependencies {
//热修复
compile 'com.taobao.android:alisdk-hotfix:2.0.6'
}
- 添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<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" />
- meta-data 配置
<!-- HotFix -->
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="85942-1" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="7632072f94bc1a3f7961b2874d85dba7" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCBpUZZxyCPY/GvmLG+MsIUWRW4HDgDn2FqFwL3XxSaGpwO+UivVRPggX6C2ASwO6KYo05sESiTmJ7wjzzlHZCLluuc4tyHM1VC6dmKfBBvzw4iisKTJdYh8I+oICnzQTzijxK+J9x3QAOJ7jMyQJm96EVqsGR1ylz+nJueCT79KUYXTwS93+tCgF+G4I+KT9Lo8RFywHvpn8x/z0IiELYIfWdzj90QylGnX0RdTHFfEld1Rll9/NfM960cMo4TFfoOz4fX9loGh9WtfAXfcGWwvCliWHeLil1KmJ8u/2YfR8mgcZlHCAU1FJZDDQgRaTQ7/1ALFn97WFryg1gM9pmJAgMBAAECggEADmpJGzxn42myetrYkJRmPgr1vkXs+IIlO72ZR9YbnVLuHUAck9o63pCnd3b7dnj7CEvIMX3q7BZhPdA/bh5Obyb1xbj32lSb21fTJ3HKBhSYtsCFCAWB/L4ZyxDgeTq8wVg1Nk2KVvwYKKMCsEi8j4AfD9DTKsG4e1sAdp8CkPV4So9MM5oS8cdhD5hV9CWQWiAfZn4DqZN7Kcq+uunkkuOoimiuxQlGOlXLPdNmXTQSZKfURDWsvHRooNeX7txxHUijTbIieoWLuVcV0HbGpD//0T9dlqcoJvO+dwgFrr/Jqh4mUtW6/763GybEPobHMUYKivdsQtJMbJfdKXBZTQKBgQDCouAieUUhPbrWzomSra44a1o9r5H9KWpimQCyOO6EBZqYJtodslkygRxboE2CmOtiwm78+fSGiUE6nSBdb8WFpyKdIewBX1DuxTBWBO8u6M11x1RUYLnHSN6vNLuwfzj/YvAzUvAfjnAthe4t6fWKUqySCFPWuTbYjnbrGh7THwKBgQCqhP6LCoX47HwUpeHOb8/sf1Q8QXaUH/iKbGDdWfzeei7RebR5/rVNQU+/MQvasWjXO7Q7qra+unNYEapHvPtePzaTJxykuVdavQ5Xub3qr6tjW4cllzP6g0sVk2I2mW/Fti/p8P/6iYdTazwIPFqgCauzVKbuzRJ28R/uklHmVwKBgQCYnZYZ8fUex4SFgpWlCcKeQq8Tx2M1mw/sGATPuoxrwOkjfPNybbI7Q7m0rtGYIcgQPF1Cx8vQ4jbfeu0x1r6OuisOAtdHjDGtx7jK+juCENFqFM4vC1kgxia2QycYkeljd3TZCaN3Wvzi9S15mwYJXCIsr5Ltv3UeATeFyYl6CQKBgGO3lHdQ9xmjicg1XYBwiKIfr+3wxlxG+fxQ9rBbMHIV940OZAk3d2SvPehr0SfZuZqsUnDWGzocJNmqsu5yyHjL9KlHJQv7SudISbvpZfN5OXvICZdk/cOQxfbfEn8laWSwbwKaqcckZ9vTiO60BLc0EJG1fk2F5TdjOK42KOjPAoGAESCVRHlqpu7fAa/EmSyuVNu9JsPWZA6hKFNp1ckghboWJimkOExbyVWPylgjJ/8emB+WuIni/uLPqCGp6Nei3jEXRUCfMZ0326oN6V9iOQDWpbB96aVbY+XWWdOWkFXpgFbnViYxTdunWy4qwjOnaJcEA1z4whHwrD6AvM6G/Xo=" />
- 混淆配置:minifyEnabled 为false时,下面内容可以忽略。
#生成老安装包时打开,生成mapping.txt, 并将mapping.txt,移到/app下
-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.**{*;}
- SDK接入
SophixManager.getInstance().setContext(this)
.setAppVersion(BuildConfig.VERSION_NAME)
.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();
- 生成patch补丁
下载工具,该工具有图形界面,使用起来很简单,我这里就不多介绍。
如下图:
- 上传补丁
打开阿里百川管理后台,选择应用--->管理--->查看详情-->上传补丁--->查看详情--->确认发布(确认发布前可以使用阿里提供的工具,验证补丁是否有效)
详细内容可以查看我的GitHub, 测试代码在HotFixActivity
公众号欢迎搜索 SamuelAndroid 或者扫描下面的二维码关注我的公众号,即可查看更多内容和及时收到更新内容