目前存活的方案仅剩:腾讯Bugly(Tinker) 、阿里Sophix、美团Robust
具体对比:
方案选择
- 对于付费方案
首选阿里Sophix,且接入简单,参考:SDK稳健接入,产品定价
- 对于免费方案
首选腾讯Bugly(Tinker),社区活跃,经验丰富,有微信背书,几亿日活验证。
参考:常见问题汇总,Bugly Android热更新使用指南
- 对于自建热修复后台(Tinker + 自建后台)
可参考:有赞移动热修复平台建设
Bugly(Tinker)一直以来存在的问题
- Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);
- 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
- 在Android N上,补丁对应用启动时间有轻微的影响;
- 不支持部分三星android-21机型,加载补丁时会主动抛出
"TinkerRuntimeException:checkDexInstall failed"
;
- 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。
Bugly(Tinker)接入
Bugly Android热更新使用指南:
https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/
官方demo:
https://github.com/BuglyDevTeam/Bugly-Android-Demo
已验证,可正常运行,可生成patch,可应用成功。
常见错误码wiki:Tinker 自定义扩展
所有的错误码都定义在ShareConstants.java,加载过程的具体的错误类型与错误码可查看DefaultLoadReporter.java的注释。
由于需要考虑到项目结构,最后以enableProxyApplication = true
接入,改动最小。
测试补丁生成情况
基于enableProxyApplication = true
的形式,步骤:
- 模拟一个ui崩溃,生成基准包,安装到手机,测试崩溃情况。
- 修复崩溃,并更改界面布局。
- 使用右侧gradle task进行补丁构建
在生成过程中,遇到的问题如下:
- Execution failed for task ‘:app:tinkerProcessDebugResourceId’.java.io.FileNotFoundException:app\build\intermediates\tinker_intermediates\values_backup
解决办法:保存基准包,clean项目,重新生成补丁。
- com.tencent.tinker.build.util.TinkerPatchException: loader classes are found in old secondary dex. Found classes: {Lcom/photoeditor/app/AppApplication;}
主要原因:tinker只能放在main dex
参考:https://blog.csdn.net/qq_29870299/article/details/84194002
结论:minSDK>=21,最后依旧没能打包到maindex,选择了忽略。
- Java 8 language support, as requested by ‘android.enableD8.desugaring= true’ in your gradle.properties file, is not supported when ‘android.useDexArchive= false’.
要么降为java7,要么在gradle.properties
中添加
# tinker recommend android.enableD8.desugaring = true android.useDexArchive = true
PS:尽量使用命令行方式生成补丁,避免错误信息显示不全。对于部分无法解决的warning导致的补丁生成失效在 tinkerSupport 中增加ignoreWarning = true
注意事项
- tinkerid要唯一,基准包tinkerid必须与待修复的包(线上包)一致。
- 关于资源混淆:Tinker热更新与AndResGuard资源混淆的结合
- 不能完全依赖Bugly的补丁分发,需自行记录更新时间,避免patch间来回打补丁。
参考:path1/2/3修复包轮流下发,轮流修复的问题Bugly热更新下发补丁策略有问题
关于加固
目前最新版已支持加固,经过测试的加固产品:
- 腾讯乐固
- 爱加密
- 梆梆加固
- 360加固(SDK 1.3.1之后版本支持)
- 加固步骤:在tinker-support配置当中设置isProtectedApp = true,以未加固时的包作为基准包生成补丁,上线的apk需要在加固后重签名,其余操作与普通打包无异,仅需将加固后的apk重签名。
- 可能存在的问题
- 可能导致生成补丁失败,可能导致部分补丁/版本失效。
- 需要持续跟进,加固平台更新需要等待bugly更新。
根据github issue得知部分加固问题,需要更新至最新版本进行验证,目前issue还未关闭
热修复引入导致的其他问题
- 由于存在不同渠道的情况,对于基准包 以及 补丁包 的维护和管理需要制定规范。
- 要考虑构建产物(基准包)及
mapping
、resource_mapping
等文件的保存
- 热修复分支规范,何时使用热修复进行开发,后续进行新版本的开发,代码如何处理。
- Gradle插件版本暂不支持升级到4.0
参考汇总
热修复选择(bugly+tinker、robust、sophix)
Tinker issues:https://github.com/Tencent/tinker/issues
Bugly issues:https://github.com/BuglyDevTeam/Bugly-Android-Demo/issues
本站由以下主机服务商提供服务支持:
0条评论