抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Android 热修复主流方案对比以及 Bugly 踩坑记录

目前存活的方案仅剩:腾讯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’.

参考:最新版本不支持java 8了吗

要么降为java7,要么在gradle.properties中添加

# tinker recommend
android.enableD8.desugaring = true
android.useDexArchive = true

PS:尽量使用命令行方式生成补丁,避免错误信息显示不全。对于部分无法解决的warning导致的补丁生成失效在 tinkerSupport 中增加ignoreWarning = true

注意事项

  • tinkerid要唯一,基准包tinkerid必须与待修复的包(线上包)一致。

关于加固

目前最新版已支持加固,经过测试的加固产品:

  1. 腾讯乐固
  2. 爱加密
  3. 梆梆加固
  4. 360加固(SDK 1.3.1之后版本支持)
  • 加固步骤:在tinker-support配置当中设置isProtectedApp = true,以未加固时的包作为基准包生成补丁,上线的apk需要在加固后重签名,其余操作与普通打包无异,仅需将加固后的apk重签名
  • 可能存在的问题
    • 可能导致生成补丁失败,可能导致部分补丁/版本失效。
    • 需要持续跟进,加固平台更新需要等待bugly更新。

根据github issue得知部分加固问题,需要更新至最新版本进行验证,目前issue还未关闭

热修复引入导致的其他问题

  • 由于存在不同渠道的情况,对于基准包 以及 补丁包 的维护和管理需要制定规范。
  • 要考虑构建产物(基准包)及mappingresource_mapping等文件的保存
  • Gradle插件版本暂不支持升级到4.0

参考汇总

热修复选择(bugly+tinker、robust、sophix)

Android 补丁技术学习总结(五) 技术选型及实践流程

有赞移动热修复平台建设

Tinker – 微信开源的 Android 热修复框架

Tinker issues:https://github.com/Tencent/tinker/issues

Bugly issues:https://github.com/BuglyDevTeam/Bugly-Android-Demo/issues


0条评论

发表评论