DexClassLoader 加載的類是沒有組件生命周期的,也就是說即使DexClassLoader通過對dex的動態加載完成了對組件的加載,當系統啟動該組件時,還會出現加載類失敗的異常。
有兩種方式可以解決上面出現的問題:
方法一:http://blog.csdn.net/androidsecurity/article/details/8809542,更改系統的classloader使其為自定義的加載器。
特點:兩個dex具有明顯的分割線,第一個dex只起啟動作用,后面不會出現第一個dex的類加載信息,也就是所謂的“加殼程序”。
主要點:
1.替換classloader:RefInvoke.setFieldOjbect("android.app.LoadedApk", "mClassLoader",
wr.get(), dLoader);
2.替換application:
RefInvoke.setFieldOjbect("android.app.ActivityThread",
"mInitialApplication", currentActivityThread, app);
3.替換contentprovider RefInvoke.setFieldOjbect("android.content.ContentProvider","mContext", localProvider, app);
方法二:http://www.cnblogs.com/twlqx/p/4716026.html,利用分包處理的方法,將第二個dex的類信息加入到第一個dex的pathclassloader的element中。
特點:兩個dex的類可以互相調用,一般而言,外部dex包含關鍵的隱藏的類信息。
主要點:
1.加載外部dex:
DexClassLoader dexClassLoader = new DexClassLoader(libPath, sApplication.getDir("dex", 0).getAbsolutePath(), libPath, sApplication.getClassLoader());
2.合並pathclassloader和dexclassloader的element屬性,並賦值給pathclassloader的element
Object dexElements = combineArray(getDexElements(getPathList(pathClassLoader)), getDexElements(getPathList(dexClassLoader)));
Object pathList = getPathList(pathClassLoader);
setField(pathList, pathList.getClass(), "dexElements", dexElements);