標籤:android gradle 依賴關係 庫項目 多項目配置
原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup
4、Dependencies,Android Libraries and Multi-project setup(依賴關係,Android庫和多項目設定)
Gradle項目可以依賴於其它組件。這些組件可以是外部二進位包,或者是其它的Gradle項目。
4.1 Dependencies on binary packages(依賴二進位包)
4.1.1 Local packages(當地套件)
配置一個外部庫的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版本需要使用一個自訂庫(為了反饋執行個體化的崩潰資訊等)但發布版本不需要,或者它們依賴於同一個庫的不同版本時會非常有用。
4.2.2 Remote artifacts(遠程檔案)
Gradle支援從Maven或者Ivy倉庫中拉取檔案。
首先必須將倉庫添加到列表中,然後必須在依賴中聲明Maven或者Ivy聲明的檔案。
repositories { mavenCentral() } dependencies { compile 'com.google.guava:guava:11.0.2' } android { ... }
注意:mavenCentral()是指定倉庫URL的簡單方法。Gradle支援遠程和本地倉庫。
注意:Gradle會遵循依賴關係的傳遞性。這意味著如果一個依賴本身依賴於其它東西,這些東西也會一併被拉取回來。
更多關於設定依賴關係的資訊,請參考Gradle使用者指南和DSL文檔。
4.2 Multi project setup(多項目設定)
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') }
更多關於多項目配置的資訊請參考這裡。
4.3 Library projects(庫項目)
在上面的多項目配置中,:libraries:lib1和:libraries:lib2可能是一個Java項目,並且:app這個Android項目將會使用它們的jar包輸出。
但是,如果你想要共用代碼來訪問Android API或者使用Android樣式的資源,那麼這些庫就不能是通常的Java項目,而應該是Android庫項目。
4.3.1 Creating a Library Project(建立一個庫項目)
一個庫項目與通常的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的庫項目,並且依賴關係的配置方法與應用程式項目的配置方法一樣,同樣也支援自訂配置。
4.3.2 Differences between a Project and a Library Project(普通項目和庫項目之間的區別)
一個庫項目的main輸出是一個.aar包(它代表Android的歸檔檔案)。它組合了編譯代碼(例如jar包或者是本地的.so檔案)和資源(manifest,res,assets)。
一個庫項目同樣也可以獨立於應用程式產生一個測試用的apk來測試。
標識Task同樣適用於庫項目(assembleDebug,assembleRelease),因此在命令列上與構建一個項目沒有什麼不同。
其餘的部分,庫項目與應用程式項目一樣。它們都擁有build type和product flavor,也可以產生多個aar版本。
記住大部分Build Type的配置不適用於庫項目。但是你可以根據庫項目是否被其它項目使用或者是否用來測試來使用自訂的sourceSet改變庫項目的內容。
4.3.3 Referencing a Library(引用一個庫項目)
引用一個庫項目的方法與引用其它項目的方法一樣:
dependencies { compile project(':libraries:lib1') compile project(':libraries:lib2') }
注意:如果你要引用多個庫,那麼排序將非常重要。這類似於舊構建系統裡面的project.properties檔案中的依賴排序。
4.3.4 Library Publication(庫項目發布)
一般情況下一個庫只會發布它的release變種版本。這個版本將會被所有引用它的項目使用,而不管它們本身自己構建了什麼版本。這是由於Gradle的限制,我們正在努力消除這個問題,所以這隻是臨時的限制。
你可以控制哪一個變種版本作為發行版:
android { defaultPublishConfig "debug" }
注意這裡的發布配置名稱引用的是完整的變種版本名稱.Relesae,debug只適用於項目中沒有其它特性版本的時候使用。如果你想要使用其它變種版本取代預設的發布版本,你可以:
android { defaultPublishConfig "flavor1Debug" }
將庫項目的所有變種版本都發布也是可能的。我們計劃在一般的項目依賴項目(類似於上述所說的)情況下允許這種做法,但是由於Gradle的限制(我們也在努力修複這個問題)現在還不太可能。
預設情況下沒有啟用發布所有變種版本。可以通過以下啟用:
android { publishNonDefault true }
理解發布多個變型版本意味著發布多個arr檔案而不是一個arr檔案包含所有變型版本是非常重要的。每一個arr包都包含一個單一的變型版本。
發布一個變種版本意味著構建一個可用的arr檔案作為Gradle項目的輸出檔案。無論是發布到一個maven倉庫,還是其它項目需要建立一個這個庫項目的依賴都可以使用到這個檔案。
Gradle有一個預設檔案的概念。當添加以下配置後就會被使用到:
compile project(':libraries:lib2')
建立一個其它發布檔案的依賴,你需要指定具體使用哪一個:
dependencies { flavor1Compile project(path: ':lib1', configuration: 'flavor1Release') flavor2Compile project(path: ':lib1', configuration: 'flavor2Release') }
重要:注意發行的配置是一個完整的變種版本,其中包括了build type,並且需要像以上一樣被引用。
重要:當啟用非預設發布,maven發布外掛程式將會發布其它變種版本作為擴充包(按分類器分類)。這意味著不能真正的相容發布到maven倉庫。你應該另外發布一個單一的變種版本到倉庫中,或者允許發布所有配置以支援跨項目依賴。