動態加載其他已經安裝的apk的dex文件, 并通過反射執行

jopen 9年前發布 | 2K 次閱讀 Java Android

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