動態加載其他已經安裝的apk的dex文件, 并通過反射執行
private void useDexClassLoader(){
//創建一個意圖,用來找到指定的apk
Intent intent = new Intent("com.suchangli.android.plugin", null);
//獲得包管理器
PackageManager pm = getPackageManager();
List<ResolveInfo> resolveinfoes = pm.queryIntentActivities(intent, 0);
//獲得指定的activity的信息
ActivityInfo actInfo = resolveinfoes.get(0).activityInfo;
//獲得包名
String pacageName = actInfo.packageName;
//獲得apk的目錄或者jar的目錄
String apkPath = actInfo.applicationInfo.sourceDir;
//dex解壓后的目錄,注意,這個用宿主程序的目錄,android中只允許程序讀取寫自己
//目錄下的文件
String dexOutputDir = getApplicationInfo().dataDir;
//native代碼的目錄
String libPath = actInfo.applicationInfo.nativeLibraryDir;
//創建類加載器,把dex加載到虛擬機中
DexClassLoader calssLoader = new DexClassLoader(apkPath, dexOutputDir, libPath,
this.getClass().getClassLoader());
//利用反射調用插件包內的類的方法
try {
Class<?> clazz = calssLoader.loadClass(pacageName+".Plugin1");
Object obj = clazz.newInstance();
Class[] param = new Class[2];
param[0] = Integer.TYPE;
param[1] = Integer.TYPE;
Method method = clazz.getMethod("function1", param);
Integer ret = (Integer)method.invoke(obj, 1,12);
Log.i("Host", "return result is " + ret);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} </pre>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!