android 热修复 技术选型

分享内容简介:
Tinker 是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。这里大致介绍 Tinker 的实现原理,及对它各个方面性能的优化工作。
内容大体框架:

1.当前各种热补丁框架的比较以及 Tinker 的设计目标
2.Tinker的原理介绍
3.Tinker在实现中遇到的困难,引入成本
4.安全性,后期扩展性
5.结语

分享人介绍:
Android开发
下面是本期分享内容整理:
1. 当前各种热补丁框架对比
热补丁技术是当前非常热门的 Android 开发技术,其中比较出名的方案有支付宝的 AndFix,美团的Robust以及 QZone的超级热补丁方案,nuwa 等。

1.1 AndFix

Andfix 是阿里推出的开源框架,它在 github 的地址是:
https://github.com/alibaba/AndFix
它的技术原理如下图:它采用 native hook 的方式,这套方案直接使用 dalvik_replaceMethod 替换 class 中方法的实现。

这里写图片描述

它的缺点主要包括以下几个:
兼容性不佳; 由于它采用 native 替换的方式,在 github Issue 中也有大量崩溃的反馈;
成功率不高; 不支持修改 inline 方法,不支持修改方法参数超过8个或参数中带有 long, double 或者 float。跟一些使用 Andfix 的产品讨论过,它们的成功率不超过40%;
原因: 只替换了 DexCache 中的 ArtMethod 结构体,对于 Art 中一些 compiledCode 是直接通过 bx 过去
开发不透明; 由于它还不支持增加 filed,我们需要为了补丁而补丁,无法采用这个技术发布需求。
Andfix 的好处是可以立刻生效,但它可以支持的补丁场景非常有限,仅仅可以使用它来修复特定问题。

1.2 Qzone 超级补丁方案

现在我们讲讲 Qzone 超级补丁方案,在腾讯内部已开源。Git上面有类似Qzone热修复的方案,Nuwa,这个方案使用 classloader 的方式,能实现更加友好的类替换。而且这与加载 Multidex 的做法相似,能基本保证稳定性与兼容性。

它主要的面临问题有两个:

1.dalvik平台 unexpected DEX problem 异常而采用插桩的方式给所有类插入不会真正运行的代码,防止类打上 preverify 标志。

这里写图片描述

采用插桩导致所有类都非 preverify,导致上图中的 verify 与 optimize 操作会在加载类时触发。这会有一定的性能损耗,微信分别采用插桩与不插桩两种方式做过两种测试,一是连续加载700个50行左右的类,一是统计微信整个启动完成的耗时。

这里写图片描述

2.在 art (android L以上) 平台,若补丁中的类出现 Field、Method 或 Interface 变化,可能会导致出现内存地址错乱的问题。

为了解决这个问题,我们最后补丁中的类要有以下规则:
a.修改和新增的 class;
b.若 class 有 field,method 或 interface 数量变化,它们所有的子类;
c.若 class 有 field,method 或 interface 数量变化,它们以及它们所有子类的 调用类。如果采用 ClassN 方式,即需要多个 dex 一起处理。

缺点:

1.补丁包体积大小不稳定,
2.加载时性能损耗较大

优点:

1.方案最为简单,
2.开发透明,
3.补丁的成功率非常高。

这里写图片描述

1.3 Tinker 的设计目标

它主要的目标有以下几个:
1.开发透明; 开发者无需关心是否在补丁版本,他可以随意修改,不由框架限制;
2.性能无影响; 补丁框架不能对应用带来性能损耗;
3.完整支持; 支持代码,So 库以及资源的修复,可以发布功能。
4.补丁大小较小; 补丁大小应该尽量的小,提高升级率。
5.稳定,兼容性好; 保证微信的数亿用户的使用,尽量减少反射;

2.Tinker的原理介绍

它在 github 的地址是:https://github.com/Tencent/tinker
Tinker 的方案来源 gradle 编译的 instant run 与 buck 编译的 exopackage。它们的思想都是全量替换新的 Dex。即我们完全使用了新的 Dex,那样既不出现 Art 地址错乱的问题,在 Dalvik 也无须插桩。
但是 instant run 针对的是编译期,它可以直接将最后生成的所有变化都直接拷到手机端。对于线上方案,这肯定是不可行的。所以当前核心问题是找到合适的,使补丁结果更小的差分算法。
三种算法方法比较
这里写图片描述

微信首先 demo 中采用的是 bsdiff,它无关文件格式,但对于dex效果不是特别好,而且非常不稳定。当前微信对于 so,依然使用 bsdiff 算法。
dexmerge 算法,把修改跟新增的类通过 dexmerge 方式与原来的 dex 合并,从而得到最终的完整 Dex。
经过实践,dexmerge 的核心问题有两个:
1.无法删除 class; 导致在 Dalvik 平台会出现加载类重复的情况,这要求我们只能采用 miniloader 加载方案来避免;
2.合成时内存占用过大; dexmerge 库使用场景在 pc,它没有太多的考虑内存问题。它的峰值内存可以达到输入 dex 的大小的4倍-6倍。一个12M的 dex,峰值内存可能达到70多M。
最后决定基于 dex 的格式,自研出一种 Dexdiff 算法,它需要达到以下目标;
1.diff 结果小;
2.合成过程占用内存小;
3.支持删除、新增、修改 dex 中的 class。
这里面主要的原理是深度利用原来 dex 中的信息,对于 dex 的每一个 section 做处理,这块在今天不再深入,如果有兴趣可以看最后的引用链接。
下面是三种算法产生补丁大小的对比:
这里写图片描述

内存方面 dexdiff 峰值内存是 dex 的两倍左右,达到预期的结果。

然后我们来看看 Tinker 的框架设计,它主要包括以下几部分:

1.补丁合成; 这些都在单独的 patch 进程工作,这里包括 dex,so 还有资源,主要完成补丁包的合成以及升级;
2.补丁的加载; 如果通过反射系统加载我们合成好的 dex,so 与资源;
3.监控回调; 在合成与加载过程中,出现问题及时回调;
4.版本管理; Tinker 支持补丁升级,甚至是多个补丁不停的切换。这里我们需要保证所有进程版本的一致性;
5.安全校验; 无论在补丁合成还是加载,我们都需要有必要的安全校验。

这里写图片描述

3.Tinker已知问题 & 引入成本

3.1 已知问题
1.由于原理与系统限制,Tinker有以下已知问题:
2.Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件;
3.由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
4.在Android N上,补丁对应用启动时间有轻微的影响;
5.不支持部分三星android-21机型,加载补丁时会主动抛出”TinkerRuntimeException:checkDexInstall failed”;
6.tinker的一般模式并不支持加固,需要使用usePreGeneratedPatchDex模式,即提前生成补丁模式。某些加固工具可能会将非exported的四大组件类名替换,这些类将无法修改。对于Android N之后的设备,本模式可能会因为内联而出现问题,建议过滤N之后的设备;
7.对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。
3.2 引入成本
Tinker 提供的完整的调用Api,接入流程文档。能够较容易的引入到项目中

4.安全性,后期扩展性

4.1安全性
补丁合成的时候会进行证书校验,x.509 、mete-info元数据,Md5数据完整性,同时支持自定义校验规格。

4.2 后期扩展性

因为完全开源,具有较好的扩展性。可以根据不同需求的进行定制

结语
看了介绍,可能会感觉tinker很复杂,不好理解。这是因为热补丁并不是仅仅加载一个 dex 或 so 文件,事实上它要关心的细节有很多。Android 不同平台版本特性,兼容性、扩展性,安全性等等。
对于 So,资源的合成方式,dexdiff 的技术细节,有感兴趣的可以添加 tinker技术交流群377388954

引用:

1.dexDiff 算法 https://www.zybuluo.com/dodola/note/554061
2.Tinker实践演进 http://dev.qq.com/topic/57ad7a70eaed47bb2699e68e
3.Art 模式和dalvk 模式对比 http://www.gfan.com/news/2014022746212.html
4. Instant Run工作原理及用法 http://www.jianshu.com/p/2e23ba9ff14b
5.Tinker Api https://github.com/Tencent/tinker/wiki

专有名词:

Dalvk:android 4.4 之前默认虚拟机

Art:android L 之后默认虚拟机

Instant run:android studio 2.0 一种构建模式

Jit (just in time):运行时编译

AOT:相对 jit而言 apk安装时预编译
Mutidex:多分包 android L之后 默认支持

Buke:一种构建脚本类似gradle脚本 https://github.com/facebook/buck

OAT文件:OAT文件是一种Android私有ELF文件格式

Multidex :多分包 android L默认支持Mutidex 解决方法说65536问题

ProGuard:一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。

插桩:代码植入探针,类似代码植入,用来获取需要的信息

Exported 参数:是否能被外部应用调用 是布尔值

在2014年的I/O大会上,Google发布了下一代Android操作系统,代号“L版本”,这个版本有一些重大的系统架构方面的修改,其中之一就是用一个全新的运行时库,就叫Anroid RunTime(ART)以及AOT编译器替代了Dalvik虚拟机和它的JIT编译器。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值