【发布时间】:2012-02-21 21:33:44
【问题描述】:
我可以使用 ClassLoader 加载我放在 res/raw/ 文件夹中的 apk 吗?并加载我使用 openRawResources() 的 apk。
【问题讨论】:
标签: android classloader
我可以使用 ClassLoader 加载我放在 res/raw/ 文件夹中的 apk 吗?并加载我使用 openRawResources() 的 apk。
【问题讨论】:
标签: android classloader
我不知道您是否可以从资产中执行此操作,但如果您将资产提取到文件系统,您可以使用以下序列(忽略您需要处理的异常)。从这里您可以在“loadedClass”上使用普通反射方法。
DexClassLoader classLoader = new DexClassLoader(
"/path/to/your/apk", getFilesDir().getAbsolutePath(),
null, getClass().getClassLoader());
Class<?> loadedClass = classLoader.loadClass("full.package.and.class.name");
【讨论】:
您确实可以加载 APK 文件,但您不能简单地“启动”它(因为它需要先安装应用程序),并且您的应用程序无法安装新应用程序(由于安全政策)。
如果您的程序需要其他应用程序,您应该在第一次启动时提及这一点或类似的事情。
您可以使用解压缩文件(如 7zip)打开.apk 文件。但是你不能使用里面的类,因为里面没有正常的.class-files。
这是因为 Android 使用的不是普通的 JVM,而是 DVM。这是一个 JVM,基于 Apache Harmony 项目并经过优化以在内存较低的设备(如 Android 手机)上运行。当您导出项目时,此 JVM 不使用普通 Java 字节码(位于 .class-files 中),但它是由 Android SDK(工具为 dx)创建的自己的 Dalvik-Byte-Code .
简而言之:您无法从您的应用访问 APK 文件中的类。如果您没有自己编译类的源代码,则不会。
【讨论】:
.dex-文件。见here
您始终可以将此文件转储到文件系统,并使用反射和 DexFile 加载它,这使您可以基于反射访问您的类。
【讨论】: