AndroidShell
AndroidShell copied to clipboard
insertNativeLibraryPathElements函数可以用下面代码替代相对简单一些
调用:UpateNativeLibraryPath(inMemClassLoader, parentClassLoader);
public static void UpateNativeLibraryPath(BaseDexClassLoader dstLoader, BaseDexClassLoader srcLoader) {
// ① 反射获取 BaseDexClassLoader.class
Class<?> clzBaseDexClassLoader = null;
try {
clzBaseDexClassLoader = Class.forName("dalvik.system.BaseDexClassLoader");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// ② 反射获取 BaseDexClassLoader.calss 中的 private final DexPathList pathList 成员字段
Field fieldPathList = null;
try {
fieldPathList = clzBaseDexClassLoader.getDeclaredField("pathList");
// 设置属性的可见性
fieldPathList.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
// ③ 反射获取 DexClassLoader 类加载器中的 DexPathList pathList 成员对象
// 根据 Field 字段获取 成员变量
// DexClassLoader 继承了 BaseDexClassLoader, 因此其内部肯定有
// private final DexPathList pathList 成员变量
Object objSrcPathList = null;
Object objDstPathList = null;
try {
objSrcPathList = fieldPathList.get(srcLoader);
objDstPathList = fieldPathList.get(dstLoader);
Log.d(Const.TAG, "src pathList: " + objSrcPathList.toString());
Log.d(Const.TAG, "dst pathList: " + objDstPathList.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// ④ 获取 DexPathList.class
// DexPathList 类中有 private Element[] dexElements 成员变量
// 通过反射获取该成员变量
// 参考 https://www.androidos.net.cn/android/9.0.0_r8/xref/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
// 获取 DexPathList pathList 成员变量的字节码类型 ( 也可以通过反射获得 )
// 获取的是 DexPathList.class
Class<?> clzDexPathList = objSrcPathList.getClass();
// ⑤ 反射获取 DexPathList.class 中的 private Element[] dexElements 成员变量的 Field 字段对象
Field fieldNativeLibraryPathElements = null;
try {
fieldNativeLibraryPathElements = clzDexPathList.getDeclaredField("nativeLibraryPathElements");
// 设置属性的可见性
fieldNativeLibraryPathElements.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
// ⑥ 反射获取 DexPathList 对象中的 NativeLibraryElement[] nativeLibraryPathElements; 成员变量对象
try {
Object objSrcNativeLibraryPathElements = fieldNativeLibraryPathElements.get(objSrcPathList);
Object objDstNativeLibraryPathElements = fieldNativeLibraryPathElements.get(objDstPathList);
Log.d(Const.TAG, "origin nativeLibraryPathElements:" + objDstNativeLibraryPathElements.toString());
fieldNativeLibraryPathElements.set(objDstPathList, objSrcNativeLibraryPathElements);
objDstNativeLibraryPathElements = fieldNativeLibraryPathElements.get(objDstPathList);
Log.d(Const.TAG, "updated nativeLibraryPathElements:" + objDstNativeLibraryPathElements.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}