android-有没有一种方法来获取给定的classes.dex文件中的类名?

android-有没有一种方法来获取给定的classes.dex文件中的类名?,第1张

概述我正在构建一个家庭自动化应用程序.我正在尝试添加插件系统.作为测试,我将测试类(该类归Button子类)导出为APK文件,并将其放在应用程序的文件目录中.我能够创建此类的新实例,并使用DexClassLoader和.loadClass将其放入我的视图中.下一步是扫描此目录中的所有APK,并获取其中的类名

我正在构建一个家庭自动化应用程序.我正在尝试添加插件系统.作为测试,我将测试类(该类归button子类)导出为APK文件,并将其放在应用程序的文件目录中.我能够创建此类的新实例,并使用DexClassLoader和.loadClass将其放入我的视图中.

下一步是扫描此目录中的所有APK,并获取其中的类名称.

我发现执行该 *** 作的Dexfile类将引发以下异常:

04-18 17:26:15.697: E/dalvikvm(726): Can't open dex cache '/data/dalvik-cache/data@[email protected]@[email protected]@classes.dex': No such file or directory04-18 17:26:15.705: I/dalvikvm(726): Unable to open or create cache for /data/data/com.strutton.androID.testplugin/files/testloadclass.apk (/data/dalvik-cache/data@[email protected]@[email protected]@classes.dex)

似乎正在尝试在系统缓存中找到优化的Dexfile,但是我没有对缓存目录的权限.从我可以看到,这可能是设计使然,我对此没有问题.还有另一种解析DEX文件并从中获取类名的方法吗?

我查看了一些dex反编译器项目的源代码.我是否必须推出自己的解决方案?

这是我的测试应用程序代码(来自Activity OnCreate),以防万一我错过了一些东西:

    try {        ArrayList<String> UIPlugins = new ArrayList<String>();        final file filesDir = this.getfilesDir();        final file tmpDir = getDir("dex", 0);        final DexClassLoader classloader = new DexClassLoader( filesDir.getabsolutePath()+"/testloadclass.apk",                tmpDir.getabsolutePath(),                null, this.getClass().getClassLoader());        final Class<button> classtoload =                 (Class<button>) classloader.loadClass("com.strutton.androID.testloadclass.MyTestClass_IRDroIDUIPlugIn");        button mybutton = classtoload.getDeclaredConstructor(Context.class).newInstance(this);        mybutton.setID(2);        mybutton.setonClickListener(this);        main.addVIEw(mybutton);        // Up to here everything works as expected        // This line throws the exceptions        Dexfile mDexfile = new Dexfile(filesDir.getabsolutePath()+"/testloadclass.apk";);        Enumeration<String> classnames = mDexfile.entrIEs();        while (classnames.hasMoreElements()){            String classname = classnames.nextElement();            if (classname.endsWith("IRDroIDUIPlugIn")){                UIPlugins.add(classname);            }        }        final Class<button> classtoload =                 (Class<button>) classloader.loadClass("com.strutton.androID.testloadclass.MyTestClass_IRDroIDUIPlugIn");        button mybutton = classtoload.getDeclaredConstructor(Context.class).newInstance(this);        mybutton.setID(2);        mybutton.setonClickListener(this);        main.addVIEw(mybutton);        btn.setText(tmpDir.getabsolutePath());      } catch (Exception e) {        e.printstacktrace();    }

解决方法:

代替:

Dexfile mDexfile = new Dexfile(filesDir.getabsolutePath()+"/testloadclass.apk";);

尝试:

Dexfile mDexfile = Dexfile.loadDex(filesDir.getabsolutePath()+"/testloadclass.apk", tmpDir.getabsolutePath()+"/testloadclass.odex", 0);
总结

以上是内存溢出为你收集整理的android-有没有一种方法来获取给定的classes.dex文件中的类名?全部内容,希望文章能够帮你解决android-有没有一种方法来获取给定的classes.dex文件中的类名?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1085378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存