热修复原理

353 阅读1分钟

核心技术

代码修复

资源修复

动态链接库修复

资源修复

1.Instant Run

减少第二次构建及以后的构建和部署时间

不需要重新安装APP

部署三种方式:

Hot swap:修改一个现有方法中的代码时采用。

Warm swap:Activity需要重启。修改或删除一个现有的资源文件时采用。

Cold swap:APP需要重启。比如添加、删除或修改一个字段和方法、添加一个类等。

步骤:

(1)创建新的AssetManager,通过反射调用addAssetPath方法加载外部的资源,这样新创建的AssetManager就含有了外部资源。

(2)将AssetManager类型的mAssets字段的引用全部替换为新创建的AssetManager。

代码修复

1.底层替换方案

修改Native层原有类

获取javaMethod在ART虚拟机中对应的一个ArtMethod指针,ArtMethod指针结构体中包含了Java方法的所有信息。

替换ArtMethod结构体中的字段或者替换整个ArtMethod结构体。

立即生效

2.类加载方案

基于Dex分包方案:65536限制、LinearAlloc限制

根据ClassLoader的双亲委托模型,先加载修改过的.class文件,旧的类文件就不会被加载。

需重启

3.Instant Run方案

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

动态链接库的修复

1.将so补丁插入到NativeLibraryElement数组的前部,让so补丁的路径先被返回和加载。

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