依賴、 Android Library和多項目設置
Gradle 項目可以對其他組件具有依賴關系。這些組件可以是外部的二進制包,或其他的 Gradle 項目。
二進制包的依賴
本地包
要配置一個外部庫 jar 包的依賴,您需要在
compile配置中添加一個依賴關系。
dependencies { compile files('libs/foo.jar') }
android { ... }
注意:
dependencies DSL 元素是標准的 Gradle API 的一部分,不屬於
android 元素內。
compile配置用於編譯主應用程序。裡面的所有內容都會被添加到編譯類路徑,
並且打包到最終生成的 apk 當中。
下面是添加依賴時其他可能用到的配置:
- compile: 主應用程序
- androidTestCompile: 測試的應用程序
- debugCompile: debug Build Type
- releaseCompile: release Build Type. 因為不可能構建一個沒有任何關聯的Build Type的 APK,apk 總是配置兩個(或以上)的配置:compile和Compile。
創建一個新的Build Type會基於它的名字自動創建一個新的配置。
這可能會有用,比如debug版本需要使用一個自定義庫(例如報告崩潰的信息),而release版本則不需要,或者是他們依賴於同一個庫的不同版本的情況下。
遠程文件
Gradle 支持從 Maven 和 Ivy 倉庫中拉取文件。
首先,這個倉庫必須添加到列表當中,然後必須用Maven 或 Ivy 聲明文件的方式聲明這個依賴。
repositories { mavenCentral() }
dependencies { compile 'com.google.guava:guava:11.0.2' }
android { ... }
注: mavenCentral()是指定maven中央倉庫的URL的快捷方法。Gradle支持遠程和本地倉庫。
注:Gradle 將遵循所有依賴關系的傳遞性。這意味著,如果一個依賴有它自己的依賴關系,這些依賴也會被拉取。
有關設置依賴關系的更多信息,請參閱 Gradle 用戶指南(這裡),和DSL文檔(這裡)。
多項目設置
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項目可能依賴於libraries,這是通過聲明如下的依賴關系來配置的:
dependencies { compile project(':libraries:lib1') }
關於多項目設置的更多常用信息請參閱這裡。
庫項目
在上面的多項目的設置中,:libraries:lib1和:libraries:lib2可以是Java項目,而:app Android項目將會使用到它們的jar包輸出。
但是,如果你想共享訪問了 Andr??oid API或使用了 Android-style的資源的代碼,這些庫項目就不能是普通的Java項目,而應該是 Andr??oid Library 項目。
創建庫項目
Library項目與普通的 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和依賴關系與它們在應用程序項目中的處理方式一樣,並且支持同樣方式的自定義。
普通項目和Library 項目之間的區別
一個 Library 項目主要輸出的是一個.aar包(它代表Android的歸檔文件)。它組合了編譯代碼(如一個jar文件或原生的.so文件)和資源(manifest,res,assets)。 一個庫項目還可以生成測試apk,獨立於應用程序測試這個庫。
庫項目用著同樣的錨任務(assembleDebug, assembleRelease),所以構建這樣一個項目的命令也沒有任何區別。
對於其他的內容,庫項目和應用程序項目的行為是一樣的。。他們都有構建類型(build types)和產品定制(product flavors),並且都可以生成多個版本的aar。 需要注意的是,Build Type的大部分配置都不適用庫項目。但是,您可以根據一個庫項目是否被其他項目使用還是被測試,使用自定義 sourceSet 來更改庫項目的內容。
引用一個庫項目
引用一個庫庫和引用其他任何項目的方法是一樣的:
dependencies { compile project(':libraries:lib1') compile project(':libraries:lib2') }
注意: 如果您有多個庫,那麼排序將非常重要。這類似於舊的生成系統中, project.properties 文件的依賴項的順序的重要性。
庫項目發布
默認情況下,一個庫項目只發布它的release variant。這variant將被所有引用該庫的項目使用,無論那些項目構建的是哪種variant。這是由於 Gradle 限制而有的一個臨時限制,我們正在努力消除這個問題。
您可以控制要發布哪一個variant
android { defaultPublishConfig debug }
注意,這個發布的配置名稱引用的是完整的 variant 名稱。release和debug,只在沒有定義flavor時適用。如果你想在使用flavors時更改默認的發布variant,你可以這樣寫:
android { defaultPublishConfig flavor1Debug }
發布一個庫項目的所有variants也是可以做到的。我們正計劃在正常的項目對項目(project-to-project)的依賴(如上面的例子)時也可以這樣做,但現在因為 Gradle 的限制(我們也在努力修復這些問題),還無法做到。 默認情況下沒有啟用發布所有variant。要啟用它們可以這樣做:
android { publishNonDefault true }
發布多個variants意味著發布多個aar文件,而不是發布一個包含多個variants的aar文件,能意識到這一點是非常重要的。每一個 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 發布插件將把這些額外的variant作為額外的包(按分類器分類)發布。這意味著它對發布到一個 maven 倉庫並不是真正的兼容。您應該只向一個倉庫發布一個單一的 variant,或者是,為項目之間的依賴啟用所有的發布配置。