android loadlibrary libPathパスを変更し、パスのロードを指定します.so

3496 ワード

  • 需要は簡単で、指定フォルダの下にロードされます.so.
  • 理由:androidはプログラムが実行されている状態でdata/data/packageName/libにファイルを書くことはできませんが、読み取り可能です.
  • もう一つの質問があります.data/app-lib/packageName/の下です.soとdata/data/packageName/libの.soはどんな関係ですか.

  • 1 . グローバルclassloaderの取得
    PathClassLoader pathClassLoader = (PathClassLoader)context.getClassLoader();
    DexClassLoader myDexClassLoader = new DexClassLoader(str, context.getDir("dex", 0).getAbsolutePath(), str, context.getClassLoader().getParent());
    

    2 . pathListの取得
    Object pathList = getPathList(pathClassLoader);
    

    3 . パスの追加
    File[] file = new File[]{
    new File("/data/app-lib/pakageName-1"),
    new File("/data/app-lib/pakageName-2"),
    new File("/data/data/pakageName/files"),
    new File("/vendor/lib"),
    new File("/system/lib")
    } ;
    

    4 . 現在のクラスのプロパティの取得
    Object nativeLibraryDirectories=pathList.getClass().getDeclaredField("nativeLibraryDirectories");
    ((Field)nativeLibraryDirectories).setAccessible(true);
    

    5 . 新しいパスの設定
    ((Field)nativeLibraryDirectories).set(pathList, file);
    

    6 . classloaderの操作は、BaseDexClassLoaderに対応します.
    public BaseDexClassLoader(String dexPath,File optimizedDirectory,String libraryPath,ClassLoader parent){
            super(parent);
            this.pathList=new DexPathList(this,dexPath,libraryPath,optimizedDirectory);
    }
    

    7 . dex、libraryパスはDexPathListに対応しており、この部分はホットパッチと密接に関連しており、hotfix、多くのオープンソースプロジェクトを検索することに興味があります.
    privatefinalElement[]dexElements;  //     dex    ,   ,   ,   
    privatefinalFile[]nativeLibraryDirectories;//      libs      ,    /vendor/lib  system/lib  data/app-lib/packageName
    

    最後にコードを与えます.
        public static void initNativeDirectory(Application application) {
            if (hasDexClassLoader()) {
                try {
                    createNewNativeDir(application);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static void createNewNativeDir(Context context) throws Exception{
            PathClassLoader pathClassLoader = (PathClassLoader) context.getClassLoader();
            Object pathList = getPathList(pathClassLoader);
            //        
            Object nativeLibraryDirectories = pathList.getClass().getDeclaredField("nativeLibraryDirectories");
            ((Field) nativeLibraryDirectories).setAccessible(true);
            //   DEXPATHList     
            File[] files1 = (File[])((Field) nativeLibraryDirectories).get(pathList);
            Object filesss = Array.newInstance(File.class, files1.length + 1);
            //     .so  
            Array.set(filesss, 0, new File(context.getFilesDir().getAbsolutePath()));
            //         
            for(int i = 1;i

    リファレンスリンク
  • BaseDexClassLoaderは
  • を実現
  • DexPathList実装
  • Java中System.loadLibrary()の実行プロセス