使用Gradle的外部Android库项目

ant*_*nyt 16 android build gradle maven

我正在尝试使用Gradle和Android Gradle插件构建一个Android项目.我想依赖于在外部(maven)存储库中找到的库项目,例如ActionBarSherlock.

根据官方网站,这似乎是可能的:

使用库可以通过以下方式之一完成:

多项目设置.请阅读此处:http://www.gradle.org/docs/current/userguide/multi_project_builds.html

通过诸如maven或常春藤等仓库的依赖关系.

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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用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
Run Code Online (Sandbox Code Playgroud)

似乎它试图从库项目和我的项目中包含AndroidManifest.xml.如果我删除了manifest规范sourceSets,我仍然会得到相同的错误.

该网站提到apply plugin: 'android-library'用于图书馆项目; 我猜这只是在构建实际库(使用多项目设置)时,因为这样做不会产生APK.

如何让外部Android库项目依赖项工作?

Xav*_*het 20

虽然可以通过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类似于apklib,因为它是一个包含jar +其他文件的zip文件.支持apklib并没有真正计划好,但我可以调查一下. (17认同)

Jan*_*usz 14

您现在可以将ActionBarSherlock集成为aar.

只需将它添加到build.gradle文件中的依赖项定义中:

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
Run Code Online (Sandbox Code Playgroud)

Jake Wharton发布了一个示例项目,展示了如何将ActionBarSherlock与Gradle一起使用