Gradle for Android系列之一 Gradle基礎

ChuckChenLw發表於2017-01-06

  project 和task
  project和task是Gradle中最重要的兩個概念。每一次構建,都至少包括一個project,每一個專案又包括至少一個task。相信大家都對Android Studio生成的專案結構已經很熟悉了。一般情況下,在專案的root的目錄下會有一個build.gradle檔案,這個檔案就是代表的一個project,這個檔案可以使得新增模組,或者共用外掛變得簡單一些。然後專案下的每一個module一般也會對應一個build.gradle檔案。
  task又是定義在build.gradle中的。當初始化構建過程時,Gradle會基於build檔案組裝project和task物件。一個task物件又包含一系列的動作,這些動作會安裝一定的順序執行。一個單獨的動作就是一段待執行的程式碼塊。是不是和java中的方法類似?在以後的文章中可以深刻的體會到。

  Build的生命週期
  一旦某個tasks被執行,那麼它不會再次執行了,不包含依賴的Tasks總是優先執行,一次構建將會經歷下列三個階段:
  1.初始化階段:project例項在這兒建立,如果有多個模組,即有多個build.gradle檔案,多個project將會被建立。
  2.配置階段:在該階段,build.gradle指令碼將會執行,為每個project建立和配置所有的tasks。
  3.執行階段:這一階段,gradle會決定哪一個tasks會被執行,該tasks會被執行完全依賴於開始構建時傳入的引數和當前所在的資料夾位置。

  build.gradle配置檔案
  基於grade構建的專案通常至少有一個build.gradle,現在就來看看Android的root目錄下的build.gradle:
  

uildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

  這就是Android專案實際構建就是從這裡開始的,我們使用了JCenter作為我們的倉庫,JCenter類似maven庫,不需要任何額外的配置,grade還支援其他幾個倉庫,不論是遠端還是本地倉庫。倉庫包含了一系列的依賴,配置了某個倉庫,那麼我們就可以使用這個倉庫包含的依賴了。其他具體,內容篇幅有限,在後邊的文章在詳細介紹。
  build.gradle檔案定義了一個Android構建工具,這個就是Android plugin的來源。Android plugin提供了所有需要去構建和測試的應用。每個Android應用都需要如下外掛:
  

apply plugin: 'com.android.application'

  外掛用於擴充套件gradle指令碼的能力,在一個專案中使用外掛,這樣該專案的構建指令碼就可以定義該外掛定義好的屬性和使用它的tasks。
  
  注意:當你在開發一個依賴庫,那麼你應該使用com.android.library,一個模組要麼使用Android application,要麼Android library外掛,不能同時使用兩者,否則會構建失敗

  當使用Android 外掛的時候,android tag將可以被使用,如下所示:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    ....
}

  更多的屬性我們將在後邊的文章中進行分析。

  專案結構
  Android Studio構建的專案結構如下所示:

DemoProject
   ├── build.gradle
   ├── settings.gradle
   └── app
       ├── build.gradle
       ├── build
       ├── libs
       └── src
           └── main
               ├── java
               │   └── com.package.demoproject
               └── res
                   ├── drawable
                   ├── layout
                   └── etc.

  在前文已經強調過grade專案通常在root資料夾中包含一個build.gradle,使用的程式碼在app這個資料夾中,這個資料夾也可以使用其他名字,並不一定是app,例如當你利用Android Studio建立一個project,針對一個phone應用和一個Android wear應用的時候,模組將被預設叫做application和wearable。

  Gradle使用了一個叫做source set的概念,官方解釋:一個source set就是一系列資原始檔,其將會被編譯和執行。對於Android專案,main資料夾就是一個source set,其包含了所有的資原始碼。當你開始編寫測試用例的時候,你一般會把程式碼放在一個單獨的source set,叫做AndroidTest,這個資料夾只包含測試。

  使用Gradle Wrapper
  Grade只是一個構建工具,其版本迭代速度是很快的,所以使用Gradle Wrapper可以幫助你相容低版本的Gradle,就和Android SDK提供的V4,V7相容包一樣。Gradle Wrapper提供了一個windows的batch檔案和其他系統的shell檔案,當你使用這些指令碼的時候,當前gradle版本將會被下載,並且會被自動用在專案的構建,所以每個開發者在構建自己app的時候只需要使用Wrapper。所以開發者不需要為你的電腦安裝任何gradle版本,在mac上你只需要執行./gradlew,而在windows上你只需要執行gradlew.bat。
  你也可以利用命令列./gradlew -v來檢視當前gradle版本。下列是wrapper的資料夾:
  

myapp/
   ├── gradlew
   ├── gradlew.bat
   └── gradle/wrapper/
       ├── gradle-wrapper.jar
       └── gradle-wrapper.properties

  可以看到,Gradle Wrapper有三個部分:
  1.一個對應於Windows系統的bat檔案和一個對應於Linux、Mac的shell檔案
  2.batch和shell檔案所需要的jar檔案,
  3.一個配置檔案properties。
  配置檔案包含引數配置,並能通過distributionUrl決定使用哪一個Gradle版本:
  

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

  基本的構建命令
  如果你使用的Android Studio那麼切換到terminal標籤頁,一般預設是在專案的root目錄路徑下的。執行以下命令

$ gradlew tasks

  如果是在linux或者mac下則需要執行:

$ ./gradlew tasks

  這一命令將會列出所以可執行的tasks,你也可以新增–all引數,來檢視所有的task。當你在開發的時候,你可以通過執行帶有Debug或者Release引數的assemble命令:
  

$ gradlew assembleDebug

  這個任務會生成一個debug版的APK。這裡還要提一點,Gradle可以使用駝峰式縮寫命令。例如上邊的命令,可以簡寫為
  

$ gradlew assDeb

  或者

$ gradlew aD

  當然必須保證縮寫是獨一無二的,如果不是唯一的,那麼命令是無效的。

  總結:通過本文,我們認識到Gradle的優勢,同時也簡單的瞭解了一下Android Studio的專案結構,以及其為我們自動生成的build.gradle檔案的結果。在接下來的文章會詳細介紹這些內容

相關文章