動態加載其他已經安裝的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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!