Android 使用ClassLoader和openRawResources加载apk
我可以使用类加载器加载我放在Android 使用ClassLoader和openRawResources加载apk,android,classloader,Android,Classloader,我可以使用类加载器加载我放在res/raw/文件夹中的apk吗?要加载apk,我使用openRawResources()。您确实可以加载apk文件,但您不能简单地“启动”它(因为它需要先安装应用程序),并且您的应用程序无法安装新的应用程序(由于安全策略的限制) 如果你的程序需要其他应用程序,你应该在第一次启动时提到这一点 您可以使用要解压缩的内容(如7zip)打开.apk-文件。但是不能使用其中的类,因为其中没有正常的.class-文件 这是因为Android使用的不是普通的JVM,而是DVM
res/raw/
文件夹中的apk吗?要加载apk,我使用openRawResources()。您确实可以加载apk文件,但您不能简单地“启动”它(因为它需要先安装应用程序),并且您的应用程序无法安装新的应用程序(由于安全策略的限制)
如果你的程序需要其他应用程序,你应该在第一次启动时提到这一点
您可以使用要解压缩的内容(如7zip)打开
.apk
-文件。但是不能使用其中的类,因为其中没有正常的.class
-文件
这是因为Android使用的不是普通的JVM,而是DVM。这是一个JVM,基于Apache Harmony项目,经过优化,可以在内存较低的设备(如Android手机)上运行。这个JVM不使用普通的Java字节码(在.class
-文件中),但它自己的Dalvik字节码是由Android SDK在导出项目时创建的(工具是dx
)
简而言之:你不能从你的应用程序访问APK文件中的类。如果您没有自己编译类的源代码,则不会
请参阅。我不知道是否可以从资源执行此操作,但如果将资源提取到文件系统,则可以使用以下顺序(忽略需要处理的异常)。在这里,您可以对“loadedClass”使用普通反射方法
DexClassLoader classLoader = new DexClassLoader(
"/path/to/your/apk", getFilesDir().getAbsolutePath(),
null, getClass().getClassLoader());
Class<?> loadedClass = classLoader.loadClass("full.package.and.class.name");
DexClassLoader=新的DexClassLoader(
“/path/to/your/apk”,getFilesDir().getAbsolutePath(),
null,getClass().getClassLoader());
Class loadedClass=classLoader.loadClass(“full.package.and.Class.name”);
您始终可以将此文件转储到文件系统,并使用反射和DexFile加载它,这使您可以基于反射访问类。我不想安装它,我只想要类,但如何加载它?那么DexClassLoader如何从apk获取类文件?是的,看起来您可以使用它来加载.dex
-文件。看见