[TOC]
Gradle項目可以依賴于其它組件。這些組件可以是外部二進制包,或者是其它的Gradle項目。
## 依賴二進制包
### 本地包
配置一個外部庫的jar包依賴,你需要在`compile`配置中添加一個依賴。
~~~
dependencies {
compile files('libs/foo.jar')
}
?
android {
...
}
~~~
> 注意:
這個`dependencies` DSL標簽是標準Gradle API中的一部分,所以它不屬于`android`標簽。
這個`compile`配置將被用于編譯main application。它里面的所有東西都被會被添加到編譯的classpath中,**同時**也會被打包進最終的APK。以下是添加依賴時可能用到的其它一些配置選項:
- `compile`main application(主module)。
- `androidTestCompile`test application(測試module)。
- `debugCompile`debug Build Type(debug類型的編譯)。
- `releaseCompile`release Build Type(發布類型的編譯)。
因為沒有可能去構建一個沒有關聯任何_Build Type_(構建類型)的APK,APK默認配置了兩個或兩個以上的編譯配置:`compile`和< buildtype >Compile.創建一個新的_Build Type_將會自動創建一個基于它名字的新配置。
這對于debug版本需要使用一個自定義庫(為了反饋實例化的崩潰信息等)但發布版本不需要,或者它們依賴于同一個庫的不同版本時會非常有用。
### 遠程文件
Gradle支持從Maven或者Ivy倉庫中拉取文件。
首先必須將倉庫添加到列表中,然后必須在依賴中聲明Maven或者Ivy聲明的文件。
~~~
repositories {
mavenCentral()
}
?
?
dependencies {
compile 'com.google.guava:guava:11.0.2'
}
?
android {
...
}
~~~
> 注意:
`mavenCentral()`是指定倉庫URL的簡單方法。Gradle支持遠程和本地倉庫。
> 注意:
Gradle會遵循依賴關系的傳遞性。這意味著如果一個依賴本身依賴于其它東西,這些東西也會一并被拉取回來。
更多關于設置依賴關系的信息,請參考 [Gradle 用戶指南](http://gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html) 和 [DSL](http://gradle.org/docs/current/dsl/org.gradle.api.artifacts.dsl.DependencyHandler.html) 文檔。
## 多項目設置
Gradle項目也可以通過使用多項目配置依賴于其它Gradle項目。
多項目配置的實現通常是在一個根項目路徑下將所有項目作為子文件夾包含進去。
例如,給定以下項目結構:
~~~
MyProject/
+ app/
+ libraries/
+ lib1/
+ lib2/
~~~
我們可以定義3個項目。Grand將會按照以下名字映射它們:
~~~
:app
:libraries:lib1
:libraries:lib2
~~~
每一個項目都擁有自己的build.gradle文件來聲明自己如何構建。另外,在根目錄下還有一個_setting.gradle_文件用于聲明所有項目。這些文件的結構如下:
~~~
MyProject/
| settings.gradle
+ app/
| build.gradle
+ libraries/
+ lib1/
| build.gradle
+ lib2/
| build.gradle
~~~
其中setting.gradle的內容非常簡單:
include ':app', ':libraries:lib1', ':libraries:lib2'
這里定義了哪一個文件夾才是真正的Gradle項目。
其中`:app`項目可能依賴于這些庫,這是通過以下依賴配置聲明的:
~~~
dependencies {
compile project(':libraries:lib1')
}
~~~
更多關于多項目配置的信息請參考 [這里](http://gradle.org/docs/current/userguide/multi_project_builds.html) 。
## 庫項目
在上面的多項目配置中,`:libraries:lib1`和`:libraries:lib2`可能是一個Java項目,并且`:app`這個Android項目將會使用它們的jar包輸出。
但是,如果你想要共享代碼來訪問Android API或者使用Android樣式的資源,那么這些庫就不能是通常的Java項目,而應該是Android庫項目。
### 創建一個庫項目
一個庫項目與通常的Android項目非常類似,只是有一點小區別。
盡管構建庫項目不同于構建應用程序,它們使用了不同的plugin。但是在內部這些plugin共享了大部分相同的代碼,并且它們都由相同的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編譯_SourceSet_的庫項目,并且依賴關系的配置方法與應用程序項目的配置方法一樣,同樣也支持自定義配置。
### 普通項目和庫項目之間的區別
一個庫項目的main輸出是一個.aar包(它代表Android的歸檔文件)。它組合了編譯代碼(例如jar包或者是本地的.so文件)和資源(manifest,res,assets)。一個庫項目同樣也可以獨立于應用程序生成一個測試用的apk來測試。
標識Task同樣適用于庫項目(`assembleDebug`,`assembleRelease`),因此在命令行上與構建一個項目沒有什么不同。
其余的部分,庫項目與應用程序項目一樣。它們都擁有build type和product flavor,也可以生成多個aar版本。記住大部分Build Type的配置不適用于庫項目。但是你可以根據庫項目是否被其它項目使用或者是否用來測試來使用自定義的sourceSet改變庫項目的內容。
### 引用一個庫項目
引用一個庫項目的方法與引用其它項目的方法一樣:
~~~
dependencies {
compile project(':libraries:lib1')
compile project(':libraries:lib2')
}
~~~
> 注意:
如果你要引用多個庫,那么排序將非常重要。這類似于舊構建系統里面的project.properties文件中的依賴排序。
### 庫項目發布
一般情況下一個庫只會發布它的_release_ Variant(變種)版本。這個版本將會被所有引用它的項目使用,而不管它們本身自己構建了什么版本。這是由于Gradle的限制,我們正在努力消除這個問題,所以這只是臨時的限制。
你可以控制哪一個Variant版本作為發行版:
~~~
android {
defaultPublishConfig "debug"
}
~~~
注意這里的發布配置名稱引用的是完整的Variant版本名稱。_Relesae_,_debug_只適用于項目中沒有其它特性版本的時候使用。如果你想要使用其它Variant版本取代默認的發布版本,你可以:
~~~
android {
defaultPublishConfig "flavor1Debug"
}
~~~
將庫項目的所有Variant版本都發布也是可能的。我們計劃在一般的項目依賴項目(類似于上述所說的)情況下允許這種做法,但是由于Gradle的限制(我們也在努力修復這個問題)現在還不太可能。默認情況下沒有啟用發布所有Variant版本。可以通過以下啟用:
~~~
android {
publishNonDefault true
}
~~~
理解發布多個Variant版本意味著發布多個arr文件而不是一個arr文件包含所有Variant版本是非常重要的。每一個arr包都包含一個單一的Variant版本。發布一個變種版本意味著構建一個可用的arr文件作為Gradle項目的輸出文件。無論是發布到一個maven倉庫,還是其它項目需要創建一個這個庫項目的依賴都可以使用到這個文件。
Gradle有一個默認文件的概念。當添加以下配置后就會被使用到:
compile project(':libraries:lib2')
創建一個其它發布文件的依賴,你需要指定具體使用哪一個:
~~~
dependencies {
flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}
~~~
> **重要:**
注意已發布的配置是一個完整的Variant版本,其中包括了build type,并且需要像以上一樣被引用。
> 當啟用非默認發布,maven發布插件將會發布其它Variant版本作為擴展包(按分類器分類)。這意味著不能真正的兼容發布到maven倉庫。你應該另外發布一個單一的Variant版本到倉庫中,或者允許發布所有配置以支持跨項目依賴。