加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

动态加载其他已经安装的apk的dex文件, 并通过反射执行

发布时间:2020-12-14 23:17:23 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 private void useDexClassLoader(){ //创建一个意图,用来找到指定的apk Intent intent = new Intent("com.suchangli.android.plugin",null); //获得

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    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();  
                    }  
        }  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读