热修复框架技术主要有三类,代码修复,资源修复,动态链接库修复。

资源修复

很多资源修复的框架参考了Instant Run资源修复的原理,所以先了解一下Instant Run

Instant Run

Instant Run是Android Studio 2.0以后新增的一个运行机制,能减少开发人员第二次及以后的构建和部署时间。

Hot Swap: 这是效率最高的部署方式,修改一个现有方法中的代码会采用这种方法。它不需要重启APP, 不需要重启Activity

Warm Swap: App不需要重启,但是Activity需要重启。 修改或删除一个现有的资源文件时采用

Cold Swap: App需要重启,但不需要重新安装。 添加,删除或修改一个字段和方法,添加一个类时采用该方式。

Instant Run 资源修复的原理创建新的AssetManager,通过反射调用addAssetPath方法加载外部的资源,这样新创建的AssetManager就含有了外部资源

将AssetManager类型的mAssets字段的引用全部替换为新的AssetManager.

代码修复

类加载方案

类加载方案基于dex分包。 为什么要dex分包,因为65535的限制和LinearAlloc限制。65535限制。主要原因是DVM ByteCode的限制,dvm指令集方法调用指令invoke-kind索引为16bits,最多能引用65535个方法数

LinearAlloc限制Dvm中的LinearAlloc是一个固定的缓冲区,当方法数超出了缓存区大小就会报错。

常用的做法:我们会新建一个hotfix分支,然后在该分支上修改bug,生成patch包,然后将patch放到Element数组dexElements的第一个元素,这样就会优先加载patch中的类,后面存在bug的类就不会被加载。 因为classloader采用的双亲委托模式,同一个类加载之后就不会再次加载

类加载方案需要重启app,让classloader重新加载补丁包中的类。为什么要重启? 因为类是无法卸载的,想要重新加载新的类,就需要重启app. 所以采用类加载方案是不能及时生效的。Q Q空间超级补丁,Nuwa,就是按照上面将补丁包放到Element数组的首位优先加载

微信的Tinker将新旧APK做了diff,得到patch.dex,再将patch.dex与手机APK中的classes.dex做合并,生成新的classes.dex.然后在运行时通过反射将classes.dex放到Element数组的第一位。

底层替换方案

底层替换方案不会再次加载新类,而是直接在Native层修改原有类。底层替换方案主要是替换ArtMethod结构体中的字段或者替换整个ArtMethod结构体。

AndFix采用的是替换ArtMethod结构体中的字段,但是会有兼容性问题,因为厂商会修改结构体,导致替换失败

Sophix采用的是替换整个ArtMethod结构体,不会存在兼容问题。

底层替换方案是可以及时生效的,不需要重启。

Instant Run方案主要是通过ASM来操作代码,进行方法的修改。

ASM是一个字节码操作框架,能够动态生成类或者增强现有类的功能。ASM可以直接产生class文件,也可以在类被加载到虚拟机之前动态改变类的行为。

动态链接库修复

这个主要是更新so,也就是重新加载so. 加载so有两个方法System的load方法. 该方法传入的参数是so在磁盘空间的完整路径

System的loadLibrary方法。 该方法传入的参数是so的名称,用于加载apk安装后自动从APK包中复制到/data/data/packagename/lib下的so. 目前so的修复主要是针对这两个方法。

so修复的两个方案将so补丁插入到NativeLibraryElement数组的前部,让so补丁优先加载

调用System的load方法来接管so的加载入口。

参考:

《Android进阶解密》

android的热修复,Android热修复原理相关推荐

  1. 【Android 热修复】热修复原理 ( 多 Dex 打包机制 | 多 Dex 支持 | Dex 分包设置 | 开发和产品风格设置 | 源码资源 )

    文章目录 一.Dex 打包设置 1.多 Dex 支持 2.Dex 分包设置 3.开发和产品风格设置 ( 非必须 ) 二.完整 build.gradle 配置 1.build.gradle 配置 2.d ...

  2. 【Android 热修复】热修复原理 ( 合并两个 Element[] dexElements | 自定义 Application 加载 Dex 设置 | 源码资源 )

    文章目录 一.合并两个 Element[] dexElements 二. 完整修复包加载工具类 三. 源码资源 一.合并两个 Element[] dexElements 在 [Android 热修复] ...

  3. 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )

    文章目录 一.Dex 文件准备 二.外部存储空间权限申请 1.清单文件申请权限 2.动态申请权限 三.文件拷贝 1.文件拷贝 2.执行效果 四. 源码资源 一.Dex 文件准备 在 [Android ...

  4. 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

    文章目录 一.修复包 Dex 文件准备 二.Odex 优化 三.Dex 文件拷贝 四. 源码资源 一.修复包 Dex 文件准备 异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ; ...

  5. Android热修复(1):热修复的介绍和原理解析

    一.热修复的产生概述 在开发中我们会遇到如下的情况: 1.刚发布的版本出现了严重的bug,这就需要去解决bug.测试并打渠道包在各个应用市场上重新发布,这会耗费大量的人力物力,代价会比较大. 2.已经 ...

  6. Android 微信Tinker三分钟接入七分钟原理 让你成为热修复牛人

    继插件化后,热补丁技术在2015年开始爆发,热修复作为当下热门的技术,在业界内比较著名的有阿里巴巴的AndFix.腾讯QQ空间的超级补丁和微信的Tinker. 为什么用热修复? 1.无需重新发版,实时 ...

  7. 深入解析:Android热修复技术选择和原理

    背景 想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~. 热修复就是通过下发补丁包,让已安装的客户端动态更新,用户不用重新安装APP,就能够修 ...

  8. Android热修复技术选择和原理分析

    背景 热修复就是通过下发补丁包,让已安装的客户端动态更新,用户不用重新安装APP,就能够修复软件缺陷. 热修复技术对比 1.公司角度 大致可以分为阿里系和腾讯系和其他,如下: 阿里系 Dexposed ...

  9. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

最新文章

  1. hibernate.hbm2ddl.auto的value
  2. 【Python基础】Pandas数据可视化原来也这么厉害
  3. 解决IntelliJ IDEA报错Failed to read candidate component class: file [ ]; nested exception is org.
  4. C++中new和malloc
  5. 《少年的你》惊现魅族手机,“心酸”回应:纯属意外 小破厂没钱植入
  6. 基于Session的认证方式_创建工程_准备一个springmvc的工程_Spring Security OAuth2.0认证授权---springcloud工作笔记115
  7. Java SSH远程执行Shell脚本实现
  8. 可视化大屏设计尺寸_大屏数据可视化设计规律
  9. VS语音信号处理(1) C语言读取WAV语音文件文件头数据
  10. 【Pytorch官方教程】从零开始自己搭建RNN2 - 字母级RNN的生成任务
  11. android smb同步,SMBsync安卓下最好的同步备份工具
  12. 基因的entrez ID 跟symbol等其它ID的转换程序
  13. 思科光纤模块兼容性解决
  14. 胡阳pyhton作业题--20150725
  15. 快应用开发心得——新手入门指南
  16. 此证书已在此前安装为一个证书权威机构
  17. 好记性不如烂笔头之Java基础复习笔记
  18. 自动控制原理笔记-控制系统的数学模型
  19. Node.js微服务 2 :基于Seneca和PM2构建Node.js微服务
  20. 【任务栏输入法图标不见了怎么办】

热门文章

  1. 深入理解Elasticsearch(原书第2版)》一1.2 何为Elasticsearch
  2. 从运维角度浅谈MySQL数据库优化
  3. Android新闻案例clientserver达到,完全自己的新闻节目平台
  4. 编译选项—微软官方+各地总结
  5. linux syslog 笔记
  6. 网络工程师之广域网必胜篇一
  7. StereoRectify()函数定义及用法畸变矫正与立体校正
  8. select函数分析
  9. KUKA 声明变量时的几点注意
  10. 【setup.py编译出错】——提示无法查找到powershell.exe