4

我正在尝试为 Android 应用程序构建一个插件架构。我有一个主机应用程序,它将检查 apk“插件”文件的目录,将它们加载到 DexClassLoader 中,并调用一个方法来获取 DerivedLibraryObjects 数组。

我认为问题在于 DerivedLibraryObject 扩展了包含在外部 JAR 库中的基类。所以主机和插件都引用了这个 JAR。当我尝试获取 DerivedLibraryObjects 数组时,出现以下异常:

04-01 14:26:57.996: ERROR/AndroidRuntime(23386): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

据我所知,这意味着插件中的对象与主机中的对象不匹配。但是,主机和插件应用程序都链接到同一个 jar 文件的副本。如果我返回一个简单地扩展 Object 的对象,那么代码可以正常工作,但是一旦我开始处理 DerivedLibraryObject,它就会抛出这个错误。

有没有人有什么建议?

4

2 回答 2

4

我可以回答我自己的问题 - 问题是主机和插件都包含外部 jar 库,所以当类加载器发现同一个类有两个版本时,它就会放弃。

您可以做的是通过将所有内容编译为类文件(我让 Eclipse 这样做)然后使用 dex 构建一个 jar/apk 来手动构建您的插件:

dx --dex --output=<outputdir>\plugin.jar <projectpath>\bin\

projectpath 是你的 android 项目的根目录。当您进入 bin 目录时,应该可以找到您的类文件。

如果有人可以发布一个 ant 脚本来执行此操作,那么添加到这个问题中将是一件好事。

于 2011-04-01T21:16:11.180 回答
0

我用 Maven 解决了同样的问题。诀窍是将公共库仅包含在主机应用程序中,而不是将其包含在插件中。

这是我的项目的一部分。

公共库 pom

将其构建为 andriod 库(使用 apklib 打包)并使用 build-helper-maven-plugin 安装额外的 *jar 文件

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>build-helper-maven-plugin</artifactId>
   <version>1.7</version>
   <executions>
      <execution>
         <id>attach-artifacts</id>
         <phase>package</phase>
         <goals>
            <goal>attach-artifact</goal>
         </goals>
         <configuration>
            <artifacts>
               <artifact>
                  <file>${basedir}/target/${project.build.finalName}.jar</file>
                  <type>jar</type>
               </artifact>
            </artifacts>
         </configuration>
      </execution>
   </executions>
</plugin>

主机应用程序的 pom 包含对公共库的依赖关系

<dependency>
   <groupId>group.id</groupId>
   <artifactId>artifact-id</artifactId>
   <version>common-library-version</version>
   <type>apklib</type>
</dependency>

插件的 pom 在提供的范围内使用 *.jar 依赖项。Apklib 依赖项不支持提供的范围。

<dependency>
   <groupId>your.common.library.group</groupId>
   <artifactId>Your-common-lib-id</artifactId>
   <version>your-common-lib-version</version>
   <scope>provided</scope>
</dependency>

最后创建某种汇编程序项目并将所有三个项目都包含在它的 pom 文件中。

它适用于我的 maven3 和 android-maven-plugin 3.2.0

于 2012-05-24T11:48:56.960 回答