2018 深入解析Android热修复技术

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
简介: 本文框架什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单描述一下Tinker的框架结构。

本文框架

  • 什么是热修复?
  • 热修复框架分类
  • 技术原理及特点
  • Tinker框架解析
  • 各框架对比图
  • 总结

通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单描述一下Tinker的框架结构。

一、什么是热修复?

正常开发流程

2018 深入解析Android热修复技术

 

热修复开发流程

2018 深入解析Android热修复技术

 

热修复优势

2018 深入解析Android热修复技术

 

修复什么?

2018 深入解析Android热修复技术

 

二、热修复框架分类

现状:百花齐放百家争鸣

2018 深入解析Android热修复技术

 

简单分类

2018 深入解析Android热修复技术

 

更合理的分类

2018 深入解析Android热修复技术

 

三、技术原理及特点

3.1 阿里Dexposed -- native解决方案

原理:

  • 直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能

他的思想完全来源于Xposed框架,完美诠释了AOP编程,这里用到最核心的知识点就是在native层获取到指定方法的结构体,然后改变他的nativeFunc字段值,而这个值就是可以指定这个方法对应的native函数指针,所以先从Java层跳到native层,改变指定方法的nativeFunc值,然后在改变之后的函数中调用Java层的回调即可。实现了方法的拦截功能。

  • 基于开源框架Xposed实现,是一种AOP解决方案
  • 只Hook App本身的进程,不需要Root权限

2018 深入解析Android热修复技术

 

2018 深入解析Android热修复技术

 

2018 深入解析Android热修复技术

 

优点:

  • 即时生效
  • 不需要任何编译器的插桩或者代码改写,对正常运行不引入任何性能开销。这是AspectJ之类的框架没法比拟的优势;
  • 对所改写方法的性能开销也极低(微秒级),基本可以忽略不计;
  • 从工程的角度来看,热补丁仅仅是牛刀小试,它真正的威力在于『线上调试』;
  • 基于Xposed原理实现的AOP不仅可以hook自己的代码,还可以hook同进程的Android SDK代码,这也就可以让我们有能力在App中填上Google自己挖的坑。

缺点:

  • Dalvik上近乎完美,不支持ART(需要另外的实现方式),所以5.0以上不能用了;
  • 最大挑战在于稳定性与兼容性,而且native异常排查难度更高;
  • 由于无法增加变量与类等限制,无法做到功能发布级别;

3.2 阿里AndFix -- native解决方案

原理:

  • 与Dexposed一样都基于开源框架Xposed实现,是一种AOP解决方案

优点:

  • 即时生效
  • 支持dalvik和art(AndFix supports Android version from 2.3 to 7.0, both ARM and X86 architecture, both Dalvik and ART runtime, both 32bit and 64bit.)
  • 与Dexposed框架相比AndFix框架更加轻便好用,在进行热修复的过程中更加方便了

缺点:

  • 面临稳定性与兼容性问题
  • AndFix不支持新增方法,新增类,新增field等

AndFix(Dexpsed)框架不稳定的原因(痛点)

2018 深入解析Android热修复技术

 

2018 深入解析Android热修复技术

 

原理:

  • 原理是Hook了ClassLoader.pathList.dexElements[]。因为ClassLoader的findClass是通过遍历dexElements[]中的dex来寻找类的。当然为了支持4.x的机型,需要打包的时候进行插桩。
  • 越靠前的Dex优先被系统使用,基于类级别的修复

2018 深入解析Android热修复技术

 

优点:

  • 不需要考虑对dalvik虚拟机和art虚拟机做适配
  • 代码是非侵入式的,对apk体积影响不大

缺点:

  • 需要下次启动才会生效
  • 最大挑战在于性能,即Dalvik平台存在插桩导致的性能损耗,Art平台由于地址偏移问题导致补丁包可能过大的问题
  • 虚拟机在安装期间为类打上CLASS_ISPREVERIFIED标志是为了提高性能的,我们强制防止类被打上标志是否会影响性能?这里我们会做一下更加详细的性能测试.但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。

插桩方案性能上的痛点:

2018 深入解析Android热修复技术

 

3.4 美团Robust -- Instant Run 热插拔原理

原理:

  • Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,插入过程对业务开发是完全透明
  • 编译打包阶段自动为每个class都增加了一个类型为ChangeQuickRedirect的静态成员,而在每个方法前都插入了使用changeQuickRedirect相关的逻辑,当 changeQuickRedirect不为null时,可能会执行到accessDispatch从而替换掉之前老的逻辑,达到fix的目的。

2018 深入解析Android热修复技术

 

优点:

  • 几乎不会影响性能(方法调用,冷启动)
  • 支持Android2.3-8.x版本
  • 高兼容性(Robust只是在正常的使用DexClassLoader)、高稳定性,修复成功率高达99.9%
  • 补丁实时生效,不需要重新启动
  • 支持方法级别的修复,包括静态方法
  • 支持增加方法和类
  • 支持ProGuard的混淆、内联、优化等操作

缺点:

  • 代码是侵入式的,会在原有的类中加入相关代码
  • so和资源的替换暂时不支持
  • 会增大apk的体积,平均一个函数会比原来增加17.47个字节,10万个函数会增加1.67M。
  • 会增加少量方法数,使用了Robust插件后,原来能被ProGuard内联的函数不能被内联了

3.5 微信Tinker

原理:

  • 服务端做dex差量,将差量包下发到客户端,在ART模式的机型上本地跟原apk中的classes.dex做merge,merge成为一个新的merge.dex后将merge.dex插入pathClassLoader的dexElement,原理类同Q-Zone,为了实现差量包的最小化,Tinker自研了DexDiff/DexMerge算法。Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。

2018 深入解析Android热修复技术

 

2018 深入解析Android热修复技术

 


优点:

  • 支持动态下发代码
  • 支持替换So库以及资源

缺点:

  • 不能即时生效,需要下次启动

Tinker已知问题:

  • Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);
  • 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
  • 在Android N上,补丁对应用启动时间有轻微的影响;
  • 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
  • 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

Tinker性能痛点:

  • Dex合并内存消耗在vm head上,容易OOM,最后导致合并失败。
  • 如果本身app占用内存已经比较高,可能容易导致app本系统杀掉。

3.6 阿里Sophix

原理(双剑合璧):

2018 深入解析Android热修复技术

 

优化Andfix(突破底层结构差异,解决稳定性问题):


Andfix底层ArtMethod结构时采用内部变量一一替换,倒是这个各个厂商是会修改的,所以兼容性不好。

2018 深入解析Android热修复技术

 

Sophix改变了一下思路,采用整体替换方法结构,忽略底层实现,从而解决兼容稳定性问题。

2018 深入解析Android热修复技术

 

突破QQ和Tinker的缺陷


QQ和Tinker的缺陷

2018 深入解析Android热修复技术

 

Sophix对dex的解决方案

  • Dalvik下采用阿里自研的全量dex方案:不是考虑把补丁包的dex插到所有dex前面(dex插桩),而是想办法在原理的dex中删除(只是删除了类的定义)补丁dex中存在的类,这样让系统查找类的时候在原来的dex中找不到,那么只有补丁中的dex加载到系统中,系统自然就会从补丁包中找到对应的类。
  • Art下本质上虚拟机以及支持多dex的加载,Sophix的做法仅仅是把补丁dex作为主dex(classes.dex)而已,相当于重新组织了所有的dex文件:把补丁包的dex改名为classes.dex,以前apk的所有dex依次改为classes2.dex、classes3.dex ... classesx.dex,如下图所示。

2018 深入解析Android热修复技术

 

资源修复另辟蹊径


常用方案(Instant Run技术):这种方案的兼容问题在于替换AssetManager的地方

2018 深入解析Android热修复技术

 

Sophix资源修复方案

2018 深入解析Android热修复技术

 

SO修复另辟蹊径


2018 深入解析Android热修复技术

 

四、Tinker框架解析

之所以只贴了Tinker的代码框架,是因为目前开源的方案中是最好的,当然除了Robust。

代码结构

2018 深入解析Android热修复技术

 

修复流程

2018 深入解析Android热修复技术

 

这里后续再补一个详细的源码分析,敬请期待

五、对比图(来自不同的地方)

来自Tinker的对比

2018 深入解析Android热修复技术

 

来自Sophix的对比

2018 深入解析Android热修复技术

 

来自蘑菇街 Android 热修复探索之路

2018 深入解析Android热修复技术

 

2018 深入解析Android热修复技术

 

六、总结

如果不考虑增大apk的体积,只是简单的修复代码,不修复so和资源,选择Robust是最稳定的,否则的话选择Tinker是一个不错的方案。虽然阿里Sophix横空出世,但是它不开源,而且商业收费,所以一般不是很赚钱的app选择收费的可能就很小了。不过它确实各方面都做了大量的优化,本文中的很多知识点也来源于阿里的《Android热修复技术原理.pdf》一书,本书值得一读,里面就是基于Sophix框架来编排的。

欢迎大家加入Android高级开发QQ群;701740775,

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 还会有职业生涯规划以及面试指导

进群修改群备注:开发年限-地区-经验

方便架构师解答问题

相关文章
|
8天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
4天前
|
数据采集 存储 API
Python虚拟环境数据共享技术解析:最佳实践与常见误区
本文探讨了Python爬虫开发中如何在虚拟环境中管理数据,提倡使用共享目录、数据库和API进行数据共享。通过创建虚拟环境、安装依赖并提供一个使用代理IP爬取微博数据的示例,阐述了如何配置代理、解析网页及保存数据到共享路径。强调了避免硬编码路径、忽视依赖管理和数据安全性的误区。
28 11
Python虚拟环境数据共享技术解析:最佳实践与常见误区
|
4天前
|
传感器 存储 数据采集
振弦采集仪的技术解析和应用进行详细介绍
振弦采集仪的技术解析和应用进行详细介绍
振弦采集仪的技术解析和应用进行详细介绍
|
4天前
|
传感器 数据采集 安全
工程安全监测中的振弦采集仪技术解析与应用
工程安全监测中的振弦采集仪技术解析与应用
工程安全监测中的振弦采集仪技术解析与应用
|
2天前
|
物联网 云计算
操作系统中的内存管理技术解析
【7月更文挑战第13天】本文将深入探讨操作系统中至关重要的内存管理技术,包括虚拟内存、分页和分段机制等核心概念。我们将从内存管理的基本原理出发,逐步过渡到高级技术如交换空间和文件映射,最后讨论现代操作系统中内存管理面临的挑战与未来发展方向。文章旨在为读者提供对操作系统内存管理全面而深入的理解。
14 7
|
3天前
|
存储 安全 数据安全/隐私保护
移动APP安全加固技术深度解析
【7月更文挑战第12天】移动APP安全加固技术是保障移动应用安全的重要手段。通过对Android和iOS两大主流平台的安全加固,可以有效防止逆向分析、动态调试、数据篡改等安全威胁。在实际应用中,我们需要结合静态层面、动态层面和数据层面的加固技术,全方位地提升APP的安全性。同时,随着技术的不断发展,我们也需要不断关注新的安全威胁和加固技术,确保移动应用的安全性和稳定性。
|
2天前
|
编解码 前端开发 图形学
【技术深度解析】多平台适配下的UI适配难题:U3D游戏UI错乱的终极解决方案
【7月更文第12天】随着移动设备市场的多元化,Unity游戏开发者面临的一大挑战是如何在不同分辨率和屏幕尺寸的设备上保持UI的一致性和美观性。游戏在高分辨率平板与低分辨率手机上呈现出的UI布局混乱、按钮错位等问题,严重影响玩家体验。本文旨在探讨Unity UI(UGUI)在多平台适配中的最佳实践,通过优化Canvas Scaler设置、灵活运用RectTransform和Anchor Points,以及高效利用设计工具,确保UI的完美适配。
7 1
|
4天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性解析
【7月更文挑战第11天】在移动应用开发的广阔天地中,安卓与iOS两大阵营各据一方,它们的开发环境差异如同东西方文化的差异一样鲜明。本文将深入探讨这两个平台在开发工具、编程语言、用户界面设计以及系统架构等方面的不同,旨在为开发者提供一个清晰的对比视角,帮助他们根据项目需求和个人偏好选择最合适的开发路径。
|
4天前
|
传感器 数据采集 安全
工程监测仪器振弦采集仪的技术解析与应用介绍
振弦采集仪的技术解析与应用进行介绍
工程监测仪器振弦采集仪的技术解析与应用介绍
|
8天前
|
机器学习/深度学习 搜索推荐 算法
深度学习在推荐系统中的应用:技术解析与实践
【7月更文挑战第6天】深度学习在推荐系统中的应用为推荐算法的发展带来了新的机遇和挑战。通过深入理解深度学习的技术原理和应用场景,并结合具体的实践案例,我们可以更好地构建高效、准确的推荐系统,为用户提供更加个性化的推荐服务。

推荐镜像

更多