Android---class檔案的熱修復
前言
採用的是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