天天看點

Gradle for Android 第五篇( 多子產品建構 )

android studio不僅允許你為你的app和依賴庫建立子產品,同時也可為android wear,android tv,google app engine等建立子產品,而這些單獨的子產品又可以在一個單獨的項目中使用。舉個栗子,在你的app開發後期階段,你可能需要用到google clound或者android wear。這種情況下,你可以在你的工程下擁有三個子產品:分别是app,google cloud,android wear整合。了解在一個工程下的多子產品建構将會加速你的開發周期。

在這一章,我們将學習到多子產品的建構,并且展示一些實際且有用的栗子:

多子產品建構的結構

為你的項目添加子產品

建議

通常情況下,一個工程包含多子產品,這些子產品會在一個父目錄檔案夾下。為了告訴gradle,該項目的結構以及哪一個子檔案夾包含子產品,你需要提供一個settings.gradle檔案。每個子產品可以提供其獨立的build.gradle檔案。我們已經學習了關于setting.gradle和build.gradle如何正常工作,現在我們隻需要學習如何使用它們。

這是多子產品項目的結構圖:

project 

  ├─── setting.gradle 

  ├─── build.gradle 

  ├─── app 

  │    └─── build.gradle 

  └─── library 

       └─── build.gradle   

這是最簡單最直接的方式來建立你的多子產品項目了。setting.gradle檔案申明了該項目下的所有子產品,它應該是這樣:

include ':app', ':library' 

這保證了app和library子產品都會包含在建構配置中。你需要做的僅僅隻是為你的子產品添加子檔案夾。

為了在你的app子產品中添加library子產品做為其依賴包,你需要在app的build.gradle檔案中添加以下内容:

dependencies { 

      compile project(':library')  

}  

為了給app添加一個子產品作為依賴,你需要使用project()方法,該方法的參數為子產品路徑。

如果在你的子產品中還包含了子子產品,gradle可以滿足你得要求。舉個栗子,你可以把你的目錄結構定義為這樣:

├─── setting.gradle 

├─── build.grade 

├─── app 

│    └─── build.gradle 

└─── libraries 

     ├─── library1 

     │    └─── build.gradle 

     └─── library2 

          └─── build.gradle     

該app子產品依然位于根目錄,但是現在項目有2個不同的依賴包。這些依賴子產品不位于項目的根目錄,而是在特定的依賴檔案夾内。根據這一結構,你需要在settings.xml中這麼定義:

include ':app', ':libraries:library1', ':libraries:library2' 

你會注意到在子目錄下申明子產品也非常的容易。所有的路徑都是圍繞着根目錄,即當你添加一個位于子檔案夾下的子產品作為另外一個子產品的依賴包得實惠,你應該将路徑定為根目錄。這意味着如果在上例中app子產品想要依賴library1,build.gradle檔案需要這麼申明:

    compile project(':libraries:library1') 

如果你在子目錄下申明了依賴,所有的路徑都應該與根目錄相關。這是因為gradle是根據你的項目的根目錄來定義你的依賴包的。

建構生命周期

了解了建構過程讓你了解多子產品的建構變得容易。我們很早前談過關于建構的生命周期。是以現在你應該知道其基本的過程,但是一些很重要的細節可能你并不是很清楚。

在第一步驟中,即初始化階段,gradle會尋找到settings.grade檔案。如果該檔案不存在,那麼gradle就會假定你隻有一個單獨的構模組化塊。如果你有多個子產品,settings.gradle檔案定義了這些子產品的位置。如果這些子目錄包含了其自己的build.gradle檔案,gradle将會運作它們,并且将他們合并到建構任務中。這就解釋了為什麼你需要申明在一個子產品中申明的依賴是相對于根目錄。

一旦你了解了建構任務是如何将所有的子產品聚合在一起的時候,那關于幾種不同的建構多子產品政策就會變得簡單易懂。你可以配置所有的子產品在根目錄下的build.gradle。這讓你能夠簡單的浏覽到整個項目的配置,但是這将會變得一團亂麻,特别是當你的子產品需要不同的插件的時候。另外一種方式是将每個子產品的配置分隔開,這一政策保證了每個子產品之間的互不幹擾。這也讓你跟蹤建構的改變變得容易,因為你不需要指出哪個改變導緻了哪個子產品出現錯誤等。

gradle的最大政策是混合。你可以在根目錄下定義一個build檔案去定義所有子產品相同的熟悉,然後在每個子產品中的build檔案去配置隻屬于該子產品的參數。android studio遵循了該原則,其建立了一個build.gradle檔案在根目錄,然後再每個子產品檔案夾下建立了另外一個build檔案。

子產品tasks

當你在你的項目中有多個子產品的時候,你需要在運作任務之前想一想。當你在指令行界面運作一個task的時候,gradle将會找到哪個子產品将會執行這個任務。舉個栗子,當你有個mobile app子產品和一個android wear子產品,你運作了gradlew assembledebug任務。當你改變其中一個子產品的檔案夾位置,gradle将隻會運作哪個特殊的子產品,縱使你使用了gradle wrapper在根目錄。舉個栗子,當你運作../gradlew assembledebug在android wear子產品的目錄下,其隻會建構android wear子產品。

切換不同的檔案夾去執行不同的任務會讓人很不爽,幸運的是,我們有其他的辦法。你可以準備一個特别的task來執行你的子產品。舉個栗子,為了隻建構android wear子產品,你僅僅隻需在根目錄下運作 gradlew :wear:assembledebug。

在android studio中添加新子產品是很容易的一件事,該視圖同時也會為你建立build檔案。如下圖所示:

Gradle for Android 第五篇( 多子產品建構 )

添加java依賴庫

當你建立了一個java子產品,build.grade檔案會是這樣:

apply plugin: 'java' 

   dependencies { 

       compile filetree(dir: 'libs', include: ['*.jar']) 

java子產品使用了java插件,這意味着很多android特性在這兒不能使用,因為你不需要。

build檔案也有基本的庫管理,你可以添加jar檔案在libs檔案夾下。你可以添加更多的依賴庫,根據第三章的内容。

給你的app子產品添加java子產品,這很簡單,不是嗎?

  compile project(':javalib') 

這告訴了gradle去引入一個叫做javelin的子產品吧,如果你為你的app子產品添加了這個依賴,那麼javalib子產品将會總是在你的app子產品建構之前建構。

添加android依賴庫

同樣的,我們利用android studio的圖形化界面建立android子產品,然後其建構檔案如下:

apply plugin: 'com.android.library' 

記住:android依賴庫不僅僅包含了java代碼,同樣也會包含android資源,像manifest和strings,layout檔案,在你引入該子產品後,你可以使用該子產品的所有類和資源檔案。

我有點建議關于多子產品項目,并且有些東西你們應該了解清楚,知道這些将會節約你們的時間。

在android studio中運作子產品tasks

當你有多個子產品,android studio會分析出來,并且展示在cradle中:

Gradle for Android 第五篇( 多子產品建構 )

grade圖形化讓你運作子產品間的任務變得簡單,但是其沒有為所有子產品同時運作一個任務,是以如果你希望這麼做,最快的方式是使用指令行。

加速你的多子產品建構

當你建構你的多子產品項目,gradle會依次執行所有的子產品。當你的電腦記憶體夠大的時候,讓你的建構過程多線程将會更快。該特性在gradle早已存在,但是其預設關閉。

是以如果你希望啟動parallel建構,你需要在grade.properties檔案中配置如下屬性:

org.gradle.parallel=true 

gradle會選擇盡可能多的線程去執行你的建構過程,每個線程都會執行一個子產品。parallel執行的是獨立的子產品,即你的子產品是獨立的。

子產品耦合

即你可以在一個子產品中引用其他子產品的屬性,但是我不建議你們這麼做,我們完全可以在根目錄下的build檔案中定義這些屬性。

總結

我們學習了如何在一個項目中建構多個子產品,以及添加新子產品是如何影響到建構任務的執行。

我們學習了相關事例,并且給出了一些建議。

在下一章節,我們将會學習到測試,如何利用gradle讓你的測試更加簡單。我們将會學習到如何在jvm中運作你的單元測試,以及如何運作測試在你的手機上。

本文作者:佚名

來源:51cto

繼續閱讀