-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Home
shwenzhang edited this page Sep 30, 2016
·
35 revisions
Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用Tinker来更新你的插件。
它主要包括以下几个部分:
- gradle编译插件:
tinker-patch-gradle-plugin
- 核心sdk库:
tinker-android-lib
- 非gradle编译用户的命令行版本:
tinker-patch-cli.jar
市面的热补丁方案有很多,其中比较出名的有淘宝的Dexposed、支付宝的AndFix以及QZone的超级补丁方案。但它们都存在无法解决的问题,这也是正是我们推出Tinker的原因。
Tinker | QZone | AndFix | Dexposed | |
---|---|---|---|---|
类替换 | yes | yes | no | no |
So替换 | yes | no | no | no |
资源替换 | yes | yes | no | no |
全平台支持 | yes | yes | yes | no |
即时生效 | no | no | yes | yes |
性能损耗 | 较小 | 较大 | 较小 | 较小 |
补丁包大小 | 较小 | 较大 | 一般 | 一般 |
开发透明 | yes | yes | no | no |
复杂度 | 较低 | 较低 | 复杂 | 复杂 |
gradle支持 | yes | no | no | no |
接口文档 | 丰富 | 较少 | 一般 | 较少 |
Rom体积 | Dalvik较大 | 较小 | 较小 | 较小 |
成功率 | 较高 | 最高 | 一般 | 一般 |
总的来说:
- Dexposed无法支持全平台,并不适合应用到商业产品中。
- AndFix作为native解决方案,首先面临的是稳定性与兼容性问题,更重要的是它无法实现类替换,它是需要大量额外的开发成本的。
- QZone方案主要问题是插桩带来Dalvik的性能问题,以及为了解决Art下内存地址问题而导致补丁包急速增大的。
Tinker热补丁方案不仅支持类、So以及资源的替换,它还是2.X-7.X的全平台支持。它无需插桩,补丁大小也远远小于其他方案。Tinker已运行在微信的数亿Android设备上,那么为什么你不使用Tinker呢?
由于原理与系统限制,Tinker有以下已知问题:
- Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
- 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
- 由于apk-parser issue, TinkerId不能设置为非常短的数字,例如“1.0”;
- 在Android N上,补丁对应用启动时间有轻微的影响;
- 不支持部分三星android-21机型,加载补丁时会主动抛出
"TinkerRuntimeException:checkDexInstall failed"
; - 关于渠道包的问题,若使用flavor编译渠道包,会导致不同的渠道包由于BuildConfig变化导致classes.dex差异。这里建议的方式有:
a. 将渠道信息写在AndroidManifest.xml或文件中,例如channel.ini;
b. 将渠道信息写在apk文件的zip comment中,这种是建议方式;
c. 若不同渠道存在功能上的差异,建议将差异部分放于单独的dex或采用相同代码不同配置方式实现。
Tinker为了实现“高可用”的目标,在接入成本上做了妥协。热补丁并不简单,在使用之前请务必先仔细阅读以下文档:
- 如何快速接入请参考Tinker 接入指南。
- 如何自定义类请参考Tinker 自定义扩展。
- Tinker的API预览请参考Tinker API预览。
- 还要其他问题,请参考常见问题。
为了方便大家更容易的接入Tinker或讨论相关技术,大家可加入QQ交流群377388954。为了方便大家交流,入群请注明姓名与公司等信息。
Tinker经过几次全量上线,也发现了一些热补丁的问题。有以下的一些优化工作尚未完成:
- Keep dex apply插件:即保证编译补丁包时使用与基础包一样的分包方案,减少由于dex移动导致的变化;
- 资源全量Test,直接使用基础包的resources.arsc生成public.xml,无须applyResourceId;
- 支持flavor改变编译BuildConfig;
关于Tinker与其他热补丁方案的具体对比或Tinker的实现原理,可参考以下文章: