我可以使用ClassLoader加载放置在res/raw/
文件夹中的apk吗?为了加载apk,我使用openRawResources()。
我不知道你是否可以从资产中做到这一点,但如果你将资产提取到文件系统中,你可以使用以下序列(忽略你需要处理的异常)。从这里,您可以在"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
-文件
这是因为Android不使用普通的JVM,而是使用DVM。这是一个JVM,基于Apache Harmony项目,经过优化,可以在内存较低的设备(如Android手机)上运行。这个JVM不使用普通的Java字节码(在.class
-文件中),但它自己的Dalvik字节码是由Android SDK(工具是dx
)在导出项目时创建的。
简而言之:你不能从你的应用程序访问APK文件中的类。如果您没有自己编译类的源代码,则不会。
请参阅维基百科文章。
您可以始终将此文件转储到文件系统,并使用反射和DexFile加载它,这为您提供了对类的基于反射的访问。