動態加載dex的兩種方式


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);  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM