Android 热补丁实践之路

leocat 7年前
   <p>大约在15年下半年开始,热补丁方案开始大量涌现,一时间热补丁修复技术在 Android 圈非常火爆,比较有代表性的开源实现有 Dexposed、AndFix、Nuwa 以及前段时间微信开源的 Tinker,至于他们的原理以及优缺点比较并不是本文要讲的,网上已经有一大堆资料进行介绍了,感兴趣的可以看下这几篇文章:</p>    <ul>     <li> <p>安卓App热补丁动态修复技术介绍</p> </li>    </ul>    <ul>     <li> <p>Android热补丁之AndFix原理解析</p> </li>    </ul>    <ul>     <li> <p>Instant Run工作原理及用法中文翻译稿</p> </li>    </ul>    <ul>     <li> <p>从Instant run谈Android替换Application和动态加载机制</p> </li>    </ul>    <ul>     <li> <p>各大热补丁方案分析和比较</p> </li>    </ul>    <ul>     <li> <p>微信Android热补丁实践演进之路</p> </li>    </ul>    <p>(PS:微信不支持外链,可以点击阅读原文获取以上链接)</p>    <p>我一直认为对于客户端开发来说热补丁修复技术不是必须的,但是却很有必要,我们身为开发者虽然都不想自己的程序出 bug,但是没有一个开发人员能保证自己的程序一定不出 bug 的,之前出了问题只能重新发布版本,然后用户下载更新,这个代价还是蛮大的,但是有了热更新技术,这个就变得很简单了。</p>    <p>所以在半年前我们也评估了以上几种热修复框架,准备用在项目中。</p>    <p>首先考虑的就是阿里开源的 Dexposed 和 AndFix 两个框架,前者是手淘开源的,后者是支付宝团队开源的,都是 native hook 的方案,但是 Dexposed 不支持 art,在未来这是个很大的隐患,所以我们直接抛弃选择了 AndFix。</p>    <p>评估下来,我们觉得 AndFix 虽说有一些限制,比如并不支持类替换、资源文件替换和 so 替换等,但是毕竟支持全平台,唯一担心的是 AndFix 也是基于 native hook 的方案,不是属于 java 层,属于 jni 层,在国内这么复杂的大环境下,稳定性与兼容性是个很大的考验,不过想到毕竟是支付宝团队出品,应该不用过渡担心。</p>    <p>于是我们开始着手在项目中集成 AndFix,过程还算顺利,实际测试下来效果也蛮好的,直到真的一次线上版本出现了 bug,考验 AndFix 的时候到了,像集成的时候一样,QA 发布补丁,测试 ok 然后发布到正式环境。但是接下来并没有像我们想象的一样错误率下降,而且从后台错误统计看到反而产生了新的莫名其妙的 bug,所以我们就觉得兼容性有问题了,赶紧紧急修复发布了新的版本。</p>    <p>这次经验证明了,native hook 的方案兼容性确实有很大问题,而且 AndFix 框架本身也有坑,从 GitHub 上该项目的 Issues 数量也可以看到,目前仍有近 200 个 issue 没有解决。</p>    <p>我们中途考虑采用 Nuwa,毕竟 multidex 方案是属于 java 层面的,兼容性肯定没有问题,但是评估之后觉得 Nuwa 会带来性能问题,这个会影响产品的用户体验,得不偿失。而且这个时候微信的热补丁方案 Tinker 已经放出来,并且表示即将开源,所以我们考虑等 Tinker 开源了再说。</p>    <p>今年的9月24号,MDCC 大会上腾讯的 Tinker 终于开源了,我们在第一时间进行了评估。</p>    <p>总体看下来,虽说 Tinker 也有一些限制,但是综合下来优势很明显,下图是微信官方曝出的一张各大热修复框架对比图,看下来很直观:</p>    <p><img src="https://simg.open-open.com/show/3392f3ffb0033fd8eaf8cf7ee42eaf6c.jpg"></p>    <p>除了技术上有优势之外,还有就是微信覆盖的人群太广了,全国几亿人,各种设备各种版本都有,在兼容性方面微信肯定是首选考虑的,所以兼容性方面评估下来应该不是问题。</p>    <p>于是安排团队成员果断把 AndFix 替换成 Tinker,主要是我们项目依赖了 resGuard 来进行资源混淆,所以集成过程中稍微有点小麻烦,但总体来说还算比较顺利,毕竟 Tinker 官方文档很齐全,而且我认识 Tinker 作者,有问题甚至都可以直接进行请教。</p>    <p>就在前几天我们发布了新版,其中出了一个小 bug,又到了检验 Tinker 效果的时候了,这一次 Tinker 没有让我们失望,补丁发布之后出错率降的很明显,实践证明 Tinker 在兼容性方面完全没问题。为了更有说服力,上一张真实的友盟出错率:</p>    <p><img src="https://simg.open-open.com/show/0af8ffad77a20714c2833025e14c8be1.jpg"></p>    <p>现在的技术与资料越来越多,只看网上的理论永远没有任何说服力,只有亲自实践才能是最好的说服力。之前很多人都问过我,说热补丁修复框架到底哪一个好,我都没有回答,那是因为我们还没有亲自实践,不能只单纯的从理论来进行分析,结果很重要。而如今,如果你想把热补丁框架应用到你们项目中的话,那么我推荐把 Tinker 作为最优选择,起码现阶段来说是最优选择。</p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650662339&idx=1&sn=3a365faac6ab1ee1abfc7007506c1bf0&chksm=87d1389cb0a6b18a0a7a698be65b8216041b58eba2433f8e278b572b94ed9fab39a2796f7ccb&scene=0#wechat_redirect</p>    <p> </p>