我正在构建一个家庭自动化应用程序.我正在尝试添加插件系统.作为测试,我将测试类(该类归button子类)导出为APK文件,并将其放在应用程序的文件目录中.我能够创建此类的新实例,并使用DexClassLoader和.loadClass将其放入我的视图中.
下一步是扫描此目录中的所有APK,并获取其中的类名称.
我发现执行该 *** 作的Dexfile类将引发以下异常:
04-18 17:26:15.697: E/dalvikvm(726): Can't open dex cache '/data/dalvik-cache/data@data@com.strutton.androID.testplugin@files@testloadclass.apk@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@data@com.strutton.androID.testplugin@files@testloadclass.apk@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文件中的类名?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)