2011-04-01 45 views
4

我正在尝试将Android应用程序的插件体系结构放在一起。我有一个宿主应用程序,它将检查apk“插件”文件的目录,将它们加载到DexClassLoader中,并调用一个方法来获取DerivedLibraryObjects数组。使用DexClassLoader时链接到外部JAR库时的反射

我认为问题在于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

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

你可以做的是通过编译一切类文件手工打造你的插件(我让Eclipse中做到这一点),然后使用DEX通过构建一个JAR/APK:

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

projectpath是所在的根目录android项目。你应该在进入bin目录时找到你的类文件。

如果有人可以发布一个ant脚本来做到这一点,这将是一个很好的事情添加到这个问题。

0

我用maven管理过同样的问题。 诀窍是只将通用库包含在主机应用程序中,而不是将其包含在插件中。

这里是我的项目'poms的一部分。

共库POM

构建它作为一个Andriod的库(使用apklib包装),并建立辅助性Maven的插件

<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> 

主机的安装额外的* jar文件应用程序的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> 

Finaly创建某种汇编程序项目并在其中包含所有三个项目的pom文件。

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