原文地址: 点击打开链接
4 依赖关系,Android库项目和多项目设置
Gradle项目可以依赖其它组件,这些组件可以是外部二进制包,或者其它Gradle项目。
4.1 依赖二进制包
4.1.1 本地包
为了配置一个外部库jar依赖,你需要在compile
配置中添加一个依赖
- dependencies {
- compile files('libs/foo.jar')
- }
- android {
- ...
- }
Note: dependencies
DSL元素是标准Gradle API的一部分,并不属于android
元素。
compile
配置是用来编译main应用的。任何添加到编译路径中的东西都会被打包到最终的apk文件中。
下面是其它一些在添加依赖时可能用到的配置:
compile
: 主moduleandroidTestCompile
: 测试moduledebugCompile
: debug构建类型的编译releaseCompile
: release构建类型的编译
因为构建一个apk必然有一个相关的构建类型,所以apk通常至少有两个编译配置:compile
和<buildtype>Compile
创建一个构建类型时会自动创建一个基于它名字的编译配置<buildtype>Compile
当你在debug版本里需要使用一个自定义库(例如记录crash信息),而release版本不需要,或者他们依赖同一个库的不同版本的时候,会非常有用。
也可以通过添加一个目录来依赖目录下的所有jar文件:
compile fileTree(dir: 'libs', include: ['*.jar'])
4.1.2 远程文件
Gradle支持从Maven或者Ivy仓库获取依赖文件。
首先,必须把仓库添加到列表中,其次,必须按照Maven或者Ivy的文件声明规范来声明依赖。
- repositories {
- mavenCentral()
- }
- dependencies {
- compile 'com.google.guava:guava:11.0.2'
- }
- android {
- ...
- }
Note: mavenCentral()
是指定仓库URL的便捷方式。Gradle支持远程和本地仓库。
Note: Gradle遵循依赖关系的传递性。如果一个被依赖文件也依赖其它文件,那些被依赖的文件也会被拉取下来。
更多关于配置依赖的信息,请查看Gradle用户指南和DSL文档
4.2 多项目设置
Gradle项目可以通过多项目设置依赖其它gradle项目。
一个多项目设置通常把所有子项目作为子目录放在指定的项目根目录下。
例如,项目结构如下:
- MyProject/
- + app/
- + libraries/
- + lib1/
- + lib2/
我们在这个结构中定义3个项目。Gradle将通过以下名字引用它们:
- :app
- :libraries:lib1
- :libraries:lib2
每个项目都有自己的build.gradle
文件,声明来它怎样构建。另外,在根目录下还有一个settings.gradle
文件,声明了所有的子项目。
目录结构如下:
- MyProject/
- | settings.gradle
- + app/
- | build.gradle
- + libraries/
- + lib1/
- | build.gradle
- + lib2/
- | build.gradle
settings.gradle
文件的内容十分简单:
- include ':app', ':libraries:lib1', ':libraries:lib2'
指明哪个文件夹是一个实际的Gradle项目。
:app
项目或许依赖其它库项目,那么依赖关系声明如下:
- dependencies {
- compile project(':libraries:lib1')
- }
更多关于多项目设置的信息在这里。
4.3 库项目
在上面的多项目设置中,:libraries:lib1
和:libraries:lib2
可能是Java项目,:app
Android项目将会使用它们输出的jar文件。
然而,如果你想要共享使用了Android API或者Android资源文件的代码(在库项目中使用了Android API或Android资源文件),这些库项目就不能是常规的Java项目,必须是Android库项目。
4.3.1 创建一个库项目
一个库项目和常规的Android项目很相似,只有很少的区别。
因为构建库项目和构建应用程序不一样,所以使用不同的插件。构建库项目的插件和构建应用程序的插件在内部共享大部分的代码,并且它们都是由com.android.tools.build.gradle
jar库提供。
- buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:0.5.6'
- }
- }
- apply plugin: 'android-library'
- android {
- compileSdkVersion 15
- }
这是一个使用API 15编译的库项目。SourceSets
和依赖关系的处理跟应用程序项目中一样,而且定制方式也一样。
4.3.2 普通项目和库项目的区别
一个库项目的主要输出是一个.aar
包(它代表Android的归档文件)。它包含编译好的源码(例如jar文件或者本地.so文件)以及资源文件(manifest, res, assets)。
一个库项目也可以生成一个测试apk来测试,而不依赖应用程序。
由于使用同样的锚点任务(assembleDebug
, assembleRelease
),所以在命令行中构建库项目和普通项目没有区别。
其余部分,库项目和应用程序项目一样。都有构建类型和product flavors,可以生成多个版本的aar。
要注意的是,多数Build Type配置不适用于库项目。然而,你可以定制sourceSet
来改变所依赖库的内容,不论它是被普通项目使用还是被测试。
4.3.3 引用一个库项目
引用一个库项目和引用其它项目的方式一样:
- dependencies {
- compile project(':libraries:lib1')
- compile project(':libraries:lib2')
- }
Note: 如果你由多个库项目,那么顺序是很重要的。这和旧构建系统中的project.properties
文件中的依赖顺序一样重要。
4.3.4 库项目发布
默认的情况下,库项目只会发布release变种版本(release variant)。这个版本会被所有引用了库项目的项目使用,不管它们自己构建的是什么版本。这是Gradle导致的限制,我们正努力消除这个限制。
可以如下控制哪个版本会被发布:
- android {
- defaultPublishConfig "debug"
- }
要注意的是,这个发布配置名称必须是完整的variant名称,release
和debug
这两个名称只有在没有flavor的时候才使用。如果想要在有flavor的时候改变默认的发布版本,你必须这样写:
- android {
- defaultPublishConfig "flavor1Debug"
- }
发布库项目的所有版本也是可能的。我们计划在普通的项目依赖项目的工程中允许这种做法,但是由于Gradle的限制,现在还不能这么做(我们也在努力修复这个问题)。
发布所有版本的功能默认没有开启。开启如下:
- android {
- publishNonDefault true
- }
必须认识到发布多个variant版本意味着发布多个aar文件,而不是在一个aar文件中包含了多个variant版本。每一个aar文件就是一个独立的variant。
发布一个variant版本意味着构建出了一个可用的aar文件,作为Gradle项目的输出文件。这个文件可以发布到maven仓库,或者在其他项目依赖该库项目时作为依赖目标。
Gradle有默认文件的概念。下面这个就使用了默认文件:
- compile project(':libraries:lib2')
为了依赖其他的发布版本,你必须指定具体使用哪一个:
- dependencies {
- flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
- flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
- }
重要: 要注意已发布的配置是完整的variant版本,包含了构建类型,因此引用的时候也必须是完整的。
重要: 当开启了无默认版本发布,Maven发布插件会把这些额外的版本作为扩展包(按分类器)发布。这意味着并不是真正兼容地发布到maven仓库。你应该发布一个独立的vatiant到仓库,或者开启发布所有配置来支持跨项目依赖。