安卓Maven插件apklib Mojo在生成的apklib中没有包含已编译的R文件。

5
我正在尝试将Android的/res文件夹提取到一个单独的项目中,作为我的主项目的apklib依赖项。问题在于,虽然/res的内容包含在生成的.apklib中,但编译的R.class却没有包含其中。更令人困惑的是,mvn clean install命令生成了.apklib以及一个.jar文件,而jar文件具有R.class,但没有/res文件夹的任何内容。我该如何生成一个包含所有资源和编译类的单个包(.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个回答

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库项目的标准目录结构布局(src/com/...而不是src/main/java/com/...)。原因是为了支持在其他非maven化项目中使用apklib(详见ApkLib文档)。你不是将库作为编译后的jar依赖项添加,而是将源代码和资源作为库依赖项从zip文件简单地添加进来。
当执行mvn clean install命令时,在android-maven-plugin:3.0.0:generate-sources目标中,android-maven-plugin会解压你的apklib库,并在编译你的项目之前将源代码和资源合并到你的主项目中;这就是Android库项目的工作方式。库项目不仅仅是编译所有内容。为了节省内存和磁盘空间,只会复制和编译最终apk中所使用的部分。你可以轻松地在主项目中覆盖资源,因为它们只是在最终编译之前在合并步骤中替换库内容。
虽然有些丑陋,但这就是目前的工作方式,Android开发团队正在研究并将在未来支持jar依赖项,可能会在r17中实现(这也需要android-maven-plugin的更改/升级),详见他们的官方博客文章“Android SDK Tools, r14中的库项目变更”。

2
谢谢。这比我在android-maven-plugin文档或Sonatype关于Android任务的文档中找到的任何内容都更有帮助。 - Fil
从链接的文档中:弃用。您应该使用Android Archive Resource(AAR)代替。apklib是一种临时措施,允许有限地捆绑和共享Android库资源。现在,Android团队已发布包含编译代码的AAR格式,您应该使用它来代替。 - Tim Abell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接