Android---class文件的热修复

前言

采用的是QQ控件的修复思路

参考了很多其他的博客,找不到地址了,抱歉

原理

替换attachBaseContext带来的context--->mClassLoader--->pathList---> dexElements

源码

  1. ActivityThread中的performLaunchActivity
  2. ContextImpl中的getClassLoader
  3. BaseDexClassLoader中的findClass
  4. DexPathList中的findClass
Android在线源码

代码

//获取应用内部的类加载器
PathClassLoader pathClassLoader = (PathClassLoader) appContext.getClassLoader();
//实例化dexClassLoader用于加载补丁dex
DexClassLoader dexClassLoader = new DexClassLoader(patchPath, fileDir.getAbsolutePath(), null, pathClassLoader);
try {
    //获取dexclassloader和pathclassloader的dexpathlist
    Object dexPathList = getPathList(dexClassLoader);
    Object pathPathList = getPathList(pathClassLoader);
    //获取补丁的elements数组
    Object dexElements = getDexElements(dexPathList);
    //获取程序的elements
    Object pathElements = getDexElements(pathPathList);
    //合并两个数组
    Object resultElements = combineArray(dexElements, pathElements);
    //将合并后的数组设置给PathClassLoader
    setField(pathPathList, pathPathList.getClass(), "dexElements", resultElements);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

demo

https://github.com/pgyCode/HotFixClassDemo
demo使用方式

1.在main目录下已经生成了一个patch.dex 可以直接复制到 /storage/emulated/0/Download下直接使用

2.简单的一些命令行操作(你需要修改为你对应的路径)

javac -d /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/java/com/github/pgycode/hotfixclassdemo/FixTest.java
/Users/haha/Library/Android/sdk/build-tools/28.0.3/dx --dex --output=/Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch/patch.dex /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch
adb push /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch/patch.dex /storage/emulated/0/Download

热修复使用场景

1.热修复
2.加速编译

难点

1.对于热修复---怎么更稳定
2.对于加速编译---怎么更快的打出dex

你可能感兴趣的:(Android---class文件的热修复)