我正在尝试将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项目中。这可能吗?如果可以,我该如何完成呢?

最佳答案

这就是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/...)。这样做的原因是要支持在其他未经过手处理的项目中使用apklib(有关详细信息,请查看ApkLib documentation)。您不是将库添加为已编译的jar依赖项,而是仅通过zip文件将库依赖关系添加为源代码和资源。

当执行mvn clean install时,在android-maven-plugin:3.0.0:generate-sources目标中,android-maven-plugin将解压缩您的apklib依赖项并将源代码和资源合并到您的主项目中,然后再编译您的项目;这就是Android库项目应该如何工作的方式。图书馆计划不仅仅是简单地编译所有内容。为了节省内存和光盘空间,仅将使用的零件复制并编译到最终apk中。您可以在主项目中轻松覆盖资源,因为它们只是在最终编译之前在合并步骤中替换了库中的内容。

这很丑陋,但目前它是这样工作的,Android Dev团队目前正在研究它,并且将来可能会在r17中支持jar依赖(我想这还需要android-maven-plugin的更改/升级),更多有关详细信息,请参见其官方博客文章“Changes to Library Projects in Android SDK Tools, r14 ”。

关于Android Maven插件apklib Mojo在结果apklib中不包含已编译的R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8823392/

10-08 23:38