使用ClassLoader和openRawResources加载apk



我可以使用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加载它,这为您提供了对类的基于反射的访问。

最新更新