前言
采用的是QQ控件的修复思路
参考了很多其他的博客,找不到地址了,抱歉
原理
替换attachBaseContext带来的context—>mClassLoader—>pathList—> dexElements
源码
- ActivityThread中的performLaunchActivity
- ContextImpl中的getClassLoader
- BaseDexClassLoader中的findClass
- 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