android loadlibrary libPathパスを変更し、パスのロードを指定します.so
3496 ワード
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
リファレンスリンク