【问题标题】:Load apk using ClassLoader and openRawResources使用 ClassLoader 和 openRawResources 加载 apk
【发布时间】:2012-02-21 21:33:44
【问题描述】:

我可以使用 ClassLoader 加载我放在 res/raw/ 文件夹中的 apk 吗?并加载我使用 openRawResources() 的 apk。

【问题讨论】:

    标签: android classloader


    【解决方案1】:

    我不知道您是否可以从资产中执行此操作,但如果您将资产提取到文件系统,您可以使用以下序列(忽略您需要处理的异常)。从这里您可以在“loadedClass”上使用普通反射方法。

    DexClassLoader classLoader = new DexClassLoader(
        "/path/to/your/apk", getFilesDir().getAbsolutePath(),
        null, getClass().getClassLoader());
    Class<?> loadedClass = classLoader.loadClass("full.package.and.class.name");
    

    【讨论】:

      【解决方案2】:

      您确实可以加载 APK 文件,但您不能简单地“启动”它(因为它需要先安装应用程序),并且您的应用程序无法安装新应用程序(由于安全政策)。

      如果您的程序需要其他应用程序,您应该在第一次启动时提及这一点或类似的事情。


      您可以使用解压缩文件(如 7zip)打开.apk 文件。但是你不能使用里面的类,因为里面没有正常的.class-files。

      这是因为 Android 使用的不是普通的 JVM,而是 DVM。这是一个 JVM,基于 Apache Harmony 项目并经过优化以在内存较低的设备(如 Android 手机)上运行。当您导出项目时,此 JVM 不使用普通 Java 字节码(位于 .class-files 中),但它是由 Android SDK(工具为 dx)创建的自己的 Dalvik-Byte-Code .

      简而言之:您无法从您的应用访问 APK 文件中的类。如果您没有自己编译类的源代码,则不会。

      请参阅Wikipedia Article

      【讨论】:

      • 我不想安装它,我只想要类,但是如何加载呢?
      • 那么DexClassLoader是如何从apk中获取class文件的呢?
      • 是的,看起来您可以使用它来加载.dex-文件。见here
      【解决方案3】:

      您始终可以将此文件转储到文件系统,并使用反射和 DexFile 加载它,这使您可以基于反射访问您的类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多