什么是热修复?

定义:在我们应用上线后出现BUG需要及时修复时,不用再发新的安装包,只需要发布补丁包,客户无感知下修复掉BUG。

怎么进行热修复?
  • 服务端:补丁包管理
  • 用户端:执行热修复
  • 开发端:生成补丁包

Java项目如何动态的打补丁 java热补丁_android

热修复解决方案

热补丁方案有很多,其中比较出名的有腾讯Tinker、阿里的AndFix、 美团的Robust以及QZone的超级补丁方案

Java项目如何动态的打补丁 java热补丁_java_02

AndFix

在native动态替换java层的方法,通过native层hook java层的代码。

Java项目如何动态的打补丁 java热补丁_android-studio_03

通过注解来定位方法

public class Test{
  @MethodReplace(class="com.enjoy.Test",method="test")
  public void test(){}
}

Java项目如何动态的打补丁 java热补丁_java_04

达到即时生效的目的

Robust

Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码----字节码插桩

美团官网说明:https://tech.meituan.com/2016/09/14/android-robust.html

对每个函数都在编译打包阶段自动的插入了一段代码。类似于代理,将方法执行的代码重定向到其他方法中

//编写的代码
  @Modify //改动代码后手动添加注释用于补丁包生成
  public long getIndex(){
     return 100;
  }
  
  //经过插桩后实际执行的代码
  public long getIndex(){
  if(changeQuiRedirect!=null){//如果执行热修复就进入判断
         //....
         return 160;//修复的实现
         }
          return 100L;
  }

实际也是使用反射,类加载实现的即时生效。

Tinker

Tinker通过计算对比指定的Base Apk中的dex与修改后的Apk中的dex的区别(差分包),补丁包中的内容即为两者差分的描述。运行时将Base Apk中的dex与补丁包进行合成,重启后加载全新的合成后的dex文件。

Java项目如何动态的打补丁 java热补丁_java_05

如何使用这个dex文件?

答:ClassLoader

Android类加载机制源码解析

Java项目如何动态的打补丁 java热补丁_Java项目如何动态的打补丁_06


Java项目如何动态的打补丁 java热补丁_android-studio_07