博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android热修复简单总结
阅读量:6714 次
发布时间:2019-06-25

本文共 1232 字,大约阅读时间需要 4 分钟。

1. Dex修复

Dex修复分为热部署底层热替换与冷部署重启

1.1 热部署底层替换

直接在native虚拟机层替换原有方法,是在原来类的基础上进行修改。

  1. AndFix:将native虚拟机层原有的Method结构的所有成员变量替换成新函数Method结构的成员。

  2. Sophix:将native虚拟机层原有的Method结构整体进行替换。

不适用的情况:

  1. 引起原有类中发生结构变化的修改
  2. 修复的非静态方法会被反射调用

1.2 冷部署重启

DexClassLoader -> DexPathList -> DexFile -> -> Element ->

dexElements.add(element)

当类的所有方法直接引用到的类(第一层级关系)和该类在同一个dex文件中时,类校验dvmVerifyClass就会返回true,类的accessFlags在虚拟机层会被设置CLASS_PREVERIFIED已校验标志。

如果类没被设置CLASS_PREVERIFIED,那么类的Verify操作都将在类的初始化进行。而类的Verify仅仅是在apk第一次安装执行dexopt的时候进行,但类的Verify会对类所有方法的指令都进行校验,是个稍重的过程,当加载的类多的时,整个Dex的加载过程耗时较大,所以插桩给类加载效率带来较大的影响。

2. 资源修复

2.1 Instant Run

  1. 构造加载了补丁资源的新AssetManager替换原有的AssetManager
  2. 将原有代码中所有引用到旧AssetManager的地方修改为新AssetManager

2.2 Sophix

构造一个package id不为0x7f的补丁资源包,此包只包含原有包中发生改变的资源以及新增的资源,然后在原有AssetManager的基础上,反射调用addAssetPath方法将补丁资源宝加载进去。

3. SO库修复

3.1 SO实时生效

1.Dalvik虚拟机下动态注册的native方法需实时修复,必须对so文件改名

2.静态注册的native方法的实时修复,因为无法得知so库中哪些native方法发生了变更,很难做到修复
3.对于新增动态注册的native方法,需在dex中增加相应的Java方法,否则加载so文件时报NoSuchMethodError,而增加Java方法是无法做到实时生效热修复,所以so库新增动态注册的native方法也无法做到实时生效热修复

3.2 SO冷部署重启生效

1. 通常的冷启动

SoFixRelaceCall.png

用自己实现的加载SO库的接口替换System默认的加载SO库的接口。

2. Sophix的冷启动

SoFixInject.png

反射注入方式将补丁SO插入到nativeLibraryDirectories/nativeLibraryPathElements数组的最前面,达到优先加载补丁SO的目的,从而实现SO修复。

转载地址:http://norlo.baihongyu.com/

你可能感兴趣的文章
jQuery 练习[二]: 获取对象(1) - 基本选择与层级
查看>>
GNS3桥接真机网卡
查看>>
Web服务之LNMMP架构及动静分离实现
查看>>
centos6.4搭建zabbix
查看>>
Nginx+Keepalived实现
查看>>
安装python的easy_install和pip
查看>>
android SQLite
查看>>
Sublime Text 2 快捷键用法大全
查看>>
放弃redis使用mongodb做任务队列支持增删改管理
查看>>
G口与S口的区别
查看>>
甲骨文拒绝SAP 2.72亿美元赔偿要求重审
查看>>
我的友情链接
查看>>
linux非交互式生成秘钥
查看>>
SQL Server数据库镜像搭建(无见证无域控)
查看>>
C练习小代码-20151108
查看>>
Mac os X 10.11 sudo 指令出问题了么?
查看>>
互联网协议入门(2)
查看>>
DataSource的可配参数有哪些,有哪些DataSource可以用
查看>>
本地文件共享服务(nfs samba ftp)
查看>>
scp通过代理proxy传输文件
查看>>