热修复
MoMo Lv5

什么是热修复

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

怎么进行热修复

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

开发端:
■补丁包是什么?
■如何生成补丁包?
■开启混淆后呢?
■对比改动自动生成补丁包(gradle)?

用户端:
■什么时候执行热修复?
■怎么执行热修复(使用补丁包)?
■Android版本兼容问题?

AndFix

类加载 + 反射 + ndk

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

在native层完成方法替换

image

1
2
3
4
5
6
7
8
@Test
public void showAndfix() throws IOException, classNotFoundException {
assertEquals(expected:4,actual:2+2);
ArtMethod bugMethod = null; //apk method
ArtMethod fixMethod = null; //补丁 method
bugMethod.clazz = fixMethod.clazz;
bugMethod.code_offset = fixMethod.code_offset;
}

Robust

类加载 + 反射 + 字节码插桩

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

增加apk的体积

1
2
3
4
5
6
7
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstancestate){
super.onCreate(savedInstanceState);setContentView(R.layout.activity main);
Utils.test();
}
}

Tinker

Tinker通过计算对比指定的Base Apk中的dex与修改后的Apk中的dex的区别,补丁包中的内容即为两者差分的描述

运行时将Base Apk中的dex与补丁包进行合成,重启后加载全新的合成后的dex文件。

tinker 补丁包:patch.dex(差分包,记录了有bug的dex与修复了这个bug的dex的差分信息)
patch.dex + 手机中安装的有bug的dex合成 = 修复了bug的dex文件

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyApplicationextends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);

//boot:1 path:2
EnjoyFix.installPatch( application: this, new File( pathname: "/sdcard/patch.jar")),
Application.class.getclassLoader();Activity.class.getclassLoader();

//support 包
AppCompatActivity.class.getClassLoader();MainActivity.class.getclassLoader();
}
}
1
2
3
4
5
6
public class utils{
private static final string TAG = "Utils";
public static void test(){
Log.d(TAG,"xxxxx");
}
}
Powered by Hexo & Theme Keep
Unique Visitor Page View