AndroidShell icon indicating copy to clipboard operation
AndroidShell copied to clipboard

insertNativeLibraryPathElements函数可以用下面代码替代相对简单一些

Open bigsinger opened this issue 1 year ago • 0 comments

调用: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();
        }
    }

bigsinger avatar Oct 18 '24 08:10 bigsinger