/**
* dex注入,优先使用自定义dex中的类
*
* @param path
* @param base
*/
private void InjectDex(String path, Context base) {
//添加自定义加载路径
//思路:获取类加载路径表,将自己的插在最前面
try {
Field pathListField = BaseDexClassLoader.class.getDeclaredField("pathList");
pathListField.setAccessible(true);
Field dexElementsField = Class.forName("dalvik.system.DexPathList").getDeclaredField("dexElements");
dexElementsField.setAccessible(true);
Object pElements = dexElementsField.get(pathListField.get(base.getClassLoader()));
//关键点1,生成自定义dexElements
Object dElements = dexElementsField.get(pathListField.get(new DexClassLoader(path, null, null, null)));
int pLen = Array.getLength(pElements);
int dLen = Array.getLength(dElements);
//关键点2,插入dexElements
Object mergeElements = Array.newInstance(pElements.getClass().getComponentType(), pLen + dLen);
int mLen = pLen + dLen;
for (int i = 0; i < mLen; i++) {
if (i < dLen) {
Array.set(mergeElements, i, Array.get(dElements, i));
} else {
Array.set(mergeElements, i, Array.get(pElements, i - dLen));
}
}
dexElementsField.set(pathListField.get(base.getClassLoader()), mergeElements);
System.out.println("hellapp.InjectDex");
} catch (Exception e) {
e.printStackTrace();
}
}
参考其他人的文章,再借鉴这个代码,一定能OK
来源:CSDN
作者:乐米sky
链接:https://blog.csdn.net/lemisky/article/details/103478899