Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用ClassLoader和openRawResources加载apk_Android_Classloader - Fatal编程技术网

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
-文件。看见