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

Fil*_*Fil 5 android maven apk

我正在尝试将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>
Run Code Online (Sandbox Code Playgroud)

这会产生以下结果

.罐

./morseflash-resources.jar
  com/.../R.class    
Run Code Online (Sandbox Code Playgroud)

.apklib

./morseflash-resorces.apklib
  META-INF
  AndroidManifest.xml
  res/
      layout/
      values/
Run Code Online (Sandbox Code Playgroud)

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

yor*_*rkw 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>
Run Code Online (Sandbox Code Playgroud)

请注意,这是从普通的JAR依赖性不同,该apklib简直就是所有的ZIP srcres文件夹有一个Android/Eclipse的库项目(标准目录结构布局src/com/...来代替src/main/java/com/...).这样做的原因是支持在其他非mavenlized项目中使用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工具中的图书馆项目变更,r14 ".

  • 谢谢.这比我在android-maven-plugin文档中找到的任何内容,或Android任务上的Sonatype文档都要有用得多. (2认同)