【轉載】Gradle for Android 第五篇( 多模塊構建 )

Android studio不只容許你爲你的app和依賴庫建立模塊,同時也可爲Android wear,Android TV,Google App Engine等建立模塊,而這些單獨的模塊又能夠在一個單獨的項目中使用。舉個栗子,在你的app開發後期階段,你可能須要用到Google Clound或者Android Wear。這種狀況下,你能夠在你的工程下擁有三個模塊:分別是app,google cloud,Android Wear整合。瞭解在一個工程下的多模塊構建將會加速你的開發週期。php

在這一章,咱們將學習到多模塊的構建,而且展現一些實際且有用的栗子:css

  • 多模塊構建的結構
  • 爲你的項目添加模塊
  • 建議

多模塊構建的結構

一般狀況下,一個工程包含多模塊,這些模塊會在一個父目錄文件夾下。爲了告訴gradle,該項目的結構以及哪個子文件夾包含模塊,你須要提供一個settings.gradle文件。每一個模塊能夠提供其獨立的build.gradle文件。咱們已經學習了關於setting.gradle和build.gradle如何正常工做,如今咱們只須要學習如何使用它們。java

這是多模塊項目的結構圖:android

 project
   ├─── setting.gradle ├─── build.gradle ├─── app │ └─── build.gradle └─── library └─── build.gradle

這是最簡單最直接的方式來建立你的多模塊項目了。setting.gradle文件申明瞭該項目下的全部模塊,它應該是這樣:nginx

include ':app', ':library'

這保證了app和library模塊都會包含在構建配置中。你須要作的僅僅只是爲你的模塊添加子文件夾。swift

爲了在你的app模塊中添加library模塊作爲其依賴包,你須要在app的build.gradle文件中添加如下內容:多線程

dependencies {
      compile project(':library') }

爲了給app添加一個模塊做爲依賴,你須要使用project()方法,該方法的參數爲模塊路徑。app

若是在你的模塊中還包含了子模塊,gradle能夠知足你得要求。舉個栗子,你能夠把你的目錄結構定義爲這樣:jvm

project
├─── 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文件須要這麼申明:

dependencies {
       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模塊,這很簡單,不是嗎?

dependencies {
       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中運行你的單元測試,以及如何運行測試在你的手機上。

相關文章
相關標籤/搜索