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