Skip to content
shwenzhang edited this page Sep 21, 2016 · 1 revision

Tinker -- 微信Android热补丁方案

license

Tinker是什么

Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用Tinker来更新你的插件。

它主要包括以下几个部分:

  1. gradle编译插件: tinker-patch-gradle-plugin
  2. 核心sdk库: tinker-android-lib
  3. 非gradle编译用户的命名行版本: tinker-patch-cli.jar

为什么使用Tinker

市面的热补丁方案有很多,其中比较出名的有淘宝的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较大 较小 较小 较小
成功率 较高 最高 一般 一般

总的来说:

  1. Dexposed无法支持全平台,并不适合应用到商业产品中。
  2. AndFix作为native解决方案,首先面临的是稳定性与兼容性问题,更重要的是它无法实现类替换,它是需要大量额外的开发成本的。
  3. QZone方案主要问题是插桩带来Dalvik的性能问题,以及为了解决Art下内存地址问题而导致补丁包急速增大的。

Tinker热补丁方案不仅支持类、So以及资源的替换,它还是2.X-7.X的全平台支持。它无需插桩,补丁大小也远远小于其他方案。Tinker已运行在微信的数亿Android设备上,那么为什么你不使用Tinker呢?

如何使用Tinker

  1. 如何快速接入请参考Tinker 接入指南
  2. 如何自定义类请参考Tinker 自定义扩展
  3. Tinker的API预览请参考Tinker API预览
  4. 还要其他问题,请参考常见问题

如有其他疑问,欢迎联系我们!

Tinker的TODO

Tinker经过几次全量上线,也发现了一些热补丁的问题。有以下的一些优化工作尚未完成:

  1. Keep dex apply插件:即保证编译补丁包时使用与基础包一样的分包方案,减少由于dex移动导致的变化;
  2. 资源全量Test,直接使用基础包的resources.arsc生成public.xml,无须applyResourceId;
  3. 假设利用补丁发布功能,即使分平台合成的dex也可能较大,这个时候可以在厂商OTA后增加启动过渡页;

更多文章

关于Tinker与其他热补丁方案的具体对比或Tinker的实现原理,可参考以下文章:

  1. 微信Android热补丁实践演进之路

  2. Android N混合编译与对热补丁影响解析

  3. Dev Club 微信热补丁Tinker分享