Android Maven插件apklib Mojo在生成的apklib中不包含已编译的R.

时间:2012-01-11 17:02:20

标签: android maven apk

我正在尝试将Android /res文件夹解压缩到一个单独的项目中,该项目作为apklib依赖项包含在我的主项目中。问题是虽然/res中包含.apklib的内容,但编译后的R.class却没有。更令人困惑的是,mvn clean install命令生成.apklib以及.jar文件,并且jar文件具有R.class,但/res没有任何内容1}}文件夹。如何生成包含所有资源以及编译类的单个包(.jar或.apklib)?

pom.xml

<packaging>apklib</packaging>
...
<plugin>
  <groupId>com.jayway.maven.plugins.android.generation2</groupId>
  <artifactId>android-maven-plugin</artifactId>
  <configuration>
    <attachSources>true</attachSources>
    <sdk>
      <platform>12</platform>
    </sdk>
  </configuration>
<plugin>

生成以下内容

的.jar

./morseflash-resources.jar
  com/.../R.class    

.apklib

./morseflash-resorces.apklib
  META-INF
  AndroidManifest.xml
  res/
      layout/
      values/

我想将所有这些内容都放在一个文件中,我希望能够将它列为我主要Android项目中的依赖项。这是可能的吗?如果是的话,我怎么能完成它?

1 个答案:

答案 0 :(得分:10)

这就是android-maven-plugin应该如何工作,将库项目添加为主项目的依赖项,将以下依赖项添加到主项目的pom.xml中:

<dependencies>
  <dependency>
    <groupId>com.company.common.lib</groupId>
    <artifactId>common-lib</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>apklib</type>
  </dependency>
</dependencies>

请注意,这与常规jar依赖项不同,apklib只是所有srcres文件夹的zip,它们具有Android / Eclipse库项目的标准目录结构布局({ {1}}代替src/com/...)。这样做的原因是支持在其他非mavenlized项目中使用apklib(有关详细信息,请查看ApkLib documentation)。您不是将库添加为已编译的jar依赖项,而是将库依赖项添加为源代码和资源,只需从zip文件中添加。

执行src/main/java/com/...时,在mvn clean install目标中,android-maven-plugin将解压缩你的apklib依赖项,并在编译项目之前将源代码和资源合并到主项目中;这就是Android库项目的工作方式。图书馆计划不只是简单地编译所有内容。为了节省内存和磁盘空间,只复制使用过的部分并将其编译到最终的apk中。您可以在主项目中轻松覆盖资源,因为它们只是在最终编译之前在合并步骤中替换库内容。

这很丑陋,但目前的情况还是如此,Android Dev团队目前正在研究这个问题并且将来会支持jar依赖,可能是在r17(这也需要android-maven-plugin更改/升级我想),更多细节见其官方博客文章“Changes to Library Projects in Android SDK Tools, r14 ”。