我正在尝试将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只是所有
src
和res
文件夹的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/