我正在尝试将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项目中的依赖项。这是可能的吗?如果是的话,我怎么能完成它?
答案 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只是所有src
和res
文件夹的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 ”。