/**
* 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);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* so注入,添加自定义so库路径
*
* @param path
* @param base
*/
private void InjectSo(String path, Context base) {
try {
Field pathListField = BaseDexClassLoader.class.getDeclaredField("pathList");
pathListField.setAccessible(true);
Field nativeLibraryPathElementsField = Class.forName("dalvik.system.DexPathList").getDeclaredField("nativeLibraryPathElements");
nativeLibraryPathElementsField.setAccessible(true);
Object nativeElements = nativeLibraryPathElementsField.get(pathListField.get(base.getClassLoader()));
int len = Array.getLength(nativeElements);
Object mergeElements = Array.newInstance(nativeElements.getClass().getComponentType(), len + 1);
//生成并添加自定义nativeLibraryPathElement
Array.set(mergeElements, 0, Class.forName("dalvik.system.DexPathList$Element").getConstructor(File.class, boolean.class, File.class, DexFile.class).newInstance(new File(path), true, null, null));
for (int i = 1; i <= len; i++) {
Array.set(mergeElements, i, Array.get(nativeElements, i - 1));
}
nativeLibraryPathElementsField.set(pathListField.get(base.getClassLoader()), mergeElements);
} catch (Exception e) {
e.printStackTrace();
}
}
Dex替换
最新推荐文章于 2021-05-25 16:12:34 发布