使用 Gradle 的外部 Android 库项目
Posted
技术标签:
【中文标题】使用 Gradle 的外部 Android 库项目【英文标题】:External Android library projects with Gradle 【发布时间】:2013-02-16 21:50:15 【问题描述】:我正在尝试使用 Gradle 和 android Gradle plugin 构建一个 Android 项目。我想依赖在外部(maven)存储库中找到的库项目,例如动作酒吧夏洛克。
根据official site,这似乎是可能的:
通过以下方式之一使用库:
多项目设置。在这里阅读:http://www.gradle.org/docs/current/userguide/multi_project_builds.html
通过 maven 或 ivy 等 repo 建立依赖关系。
我的 build.gradle 的当前内容:
buildscript
repositories
mavenCentral()
dependencies
classpath 'com.android.tools.build:gradle:0.2'
apply plugin: 'android'
repositories
mavenCentral()
dependencies
compile 'com.actionbarsherlock:library:4.2.0'
android
target = 'android-16'
sourceSets
main
manifest
srcFile 'AndroidManifest.xml'
java
srcDir 'src'
res
srcDir 'res'
assets
srcDir 'assets'
resources
srcDir 'src'
我正在使用 Gradle 1.2。当我尝试使用gradle assemble
构建时,我收到以下错误:
Error: duplicate files during packaging of APK /[path to project]/build/apk/[project name]-debug-unaligned.apk
Path in archive: AndroidManifest.xml
Origin 1: /[path to project]/build/libs/[apk name]-debug.ap_
Origin 2: /[home directory]/.gradle/caches/artifacts-14/filestore/com.actionbarsherlock/actionbarsherlock/4.2.0/apklib/dd63451a922558005d8c10be1085b488ed731d19/actionbarsherlock-4.2.0.apklib
:packageDebug FAILED
似乎它正在尝试从库项目和我的项目中包含 AndroidManifest.xml。如果我删除 sourceSets
中的 manifest
规范,我仍然会收到相同的错误。
该网站提到图书馆项目使用apply plugin: 'android-library'
;我猜这只是在构建实际库时(使用多项目设置),因为这样做不会产生 APK。
如何让外部 Android 库项目依赖项工作?
【问题讨论】:
【参考方案1】:虽然可以通过 Maven 或 Ivy 存储库获取依赖项,但这些依赖项并未打包在标准 Jar 存档中。有一种专门为此构建系统设计的新格式。类型是'aar'
Maven Central 上可用的当前 Android 库是使用 Maven 插件创建的,该插件使用不同的存档格式(“apklib”),因此它们不兼容。
如果您查看 com.actionbarsherlock:actionbacksherlock(这是该库的新位置),您会看到它的格式是 apklib。 http://search.maven.org/#artifactdetails%7Ccom.actionbarsherlock%7Cactionbarsherlock%7C4.2.0%7Capklib
查看源代码,我们检查“aar”包装并恢复将所有其他包装为“jar”,这显然是一个问题。我们应该检测 apklib 并提供更好的错误消息。
【讨论】:
新的 aar 格式是像 jar 这样的编译发行版,还是像 apklib 这样的其他原始源 zip? 使用 0.3 版插件,构建 Android 库项目似乎会产生 AAR(包含已编译类和资源的存档)。在它更广泛之前,有没有办法让 Android Gradle 插件与 Maven Central(等)上现有的 apklib 打包库一起工作?编辑:考虑到网站上的当前消息,这将特别有用:“库的二进制打包仍在进行更改。暂时不要将库上传到 maven Central(或其他类似的存储库)。” aar 与 apklib 类似,因为它是一个包含 jar + 其他文件的 zip 文件。支持 apklib 并没有真正计划,但我可以研究一下。 @XavierDucrohet Android Studio 中是否有机会使用该 akplib 文件?如果这很重要,我在 AS 0.4.4 中使用 gradle 1.10 @rekire 目前没有。【参考方案2】:您现在可以将 ActionBarSherlock 集成为 aar。
只需将其添加到 build.gradle 文件中的依赖项定义中:
dependencies
compile 'com.android.support:support-v4:18.0.+'
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
Jake Wharton 发布了一个 example project,展示了如何将 ActionBarSherlock 与 Gradle 一起使用
【讨论】:
试图找出这个问题已经有一段时间了!谢谢【参考方案3】:您使用的是旧版本的 android gradle 插件。 在最新的 0.3 版本中,这方面进行了很多改进。
我建议您升级到此插件的 0.3 版。另请注意,您必须使用更新版本的 gradle(1.3 或 1.4)。
更多关于external libraries如何与这个插件一起使用的信息。
【讨论】:
以上是关于使用 Gradle 的外部 Android 库项目的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 库 gradle 项目中包含依赖项?
同步 gradle 的问题:无法解析外部依赖项 com.android.tools.build:gradle,因为没有定义存储库