DexClassLoader與PathClassLoader
DexClassLoader可以加載jar、dex待榔、apk逞壁,
需要將加載文件cp到應(yīng)用私有文件中
DexClassLoader cl = new DexClassLoader(dexPath,dexOutputDirs,null,getClassLoader());
第一個(gè)參數(shù):是dex壓縮文件的路徑
第二個(gè)參數(shù):是dex解壓縮后存放的目錄
第三個(gè)參數(shù):是C/C++依賴的本地庫文件目錄,可以為null
第四個(gè)參數(shù):是上一級(jí)的類加載器流济,目前使用getClassLoader,否則報(bào)錯(cuò)Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
PathClassLoader加載已安裝的apk文件的dex
//創(chuàng)建一個(gè)意圖腌闯,用來找到指定的apk:這里的"com.dynamic.impl是指定apk中在AndroidMainfest.xml文件中定義的Intent intent = new Intent("com.mayongshuai.impl", null);
//獲得包管理器
PackageManager pm = getPackageManager();
Listresolveinfoes =? pm.queryIntentActivities(intent, 0);
//獲得指定的activity的信息
ActivityInfo actInfo = resolveinfoes.get(0).activityInfo;
//獲得apk的目錄或者jar的目錄
String apkPath = actInfo.applicationInfo.sourceDir;
//native代碼的目錄
String libPath = actInfo.applicationInfo.nativeLibraryDir;
//創(chuàng)建類加載器绳瘟,把dex加載到虛擬機(jī)中
//第一個(gè)參數(shù):是指定apk安裝的路徑,這個(gè)路徑要注意只能是通過actInfo.applicationInfo.sourceDir來獲取//第二個(gè)參數(shù):是C/C++依賴的本地庫文件目錄,可以為null
//第三個(gè)參數(shù):是上一級(jí)的類加載器
PathClassLoader pcl = new PathClassLoader(apkPath,libPath,this.getClassLoader());
加載需要的class
Class libProviderClazz = pcl.loadClass("com.mayongshuai.impl.Dynamic");
lib= (IDynamic)libProviderClazz.newInstance();