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的原因。

TinkerQZoneAndFixDexposed
类替换yesyesnono
So替换yesnonono
资源替换yesyesnono
全平台支持yesyesyesno
即时生效nonoyesyes
性能损耗较小较大较小较小
补丁包大小较小较大一般一般
开发透明yesyesnono
复杂度较低较低复杂复杂
gradle支持yesnonono
接口文档丰富较少一般较少
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分享