Gradle for Android系列之二 build.gradle檔案

ChuckChenLw發表於2017-01-07

  上一篇結合Android 專案大致的介紹了一下Gradle在Android中的應用。其中也多次提到了build.gradle。但是沒有詳細的介紹其的基本結構和其作用。那麼本文就將圍繞這些展開。在這之前先看看Android中的Gradle指令碼也哪些

  Android專案中的Gradle指令碼
  一般情況下,使用Android Studio建立的Android專案會預設產生3個Gradle指令碼:
  1.root目錄下build.gradle
  2.root目錄下setting.gradle
  3.app目錄下build.gradle
  如下圖

 BaseProject
   ├── build.gradle
   ├── settings.gradle
   └── app
       └── build.gradle

  root目錄下的build.gradle檔案,主要是定義整個專案的所有模組的公共屬性,主要內容如下:
  

buildscript {
    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還支援其他幾個倉庫,不論是遠端還是本地倉庫。倉庫包含了一系列的依賴,配置了某個倉庫,那麼我們就可以使用這個倉庫包含的依賴了。allprojects方法給我們提供了一種可以用來定義各個模組的預設屬性的途徑,這樣我們可以自己在allprojects中定義一些tasks,在所有的模組中都能使用。最後一個task clean(也可以定義為別的名字),任務型別是Delete(也可以是Copy),就是每當修改settings.gradle檔案後點選同步,就會刪除rootProject.buildDir下的檔案。
  setting.gradle檔案在專案只有一個模組的時候是這個樣子:
  

include ':app'

  如果是多模組的話,會相應的include對應的模組,改檔案定義了哪一個模組將會被構建(setting.gradle是針對多模組操作的,所以單獨的模組工程完全可以刪除掉該檔案)。在這之後,Gradle會為我們建立一個Setting物件,併為其包含必要的方法,我們不必知道Settings類的詳細細節,但是最好能夠知道這個概念。
  app目錄下的build.gradle檔案,只對app模組起作用,而且其可以重寫任何在root檔案目錄build.gradle檔案中定義的引數。該檔案類似於:
  

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.chuck.moblie.baseproject"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

}

  可以看到該檔案的結構很清晰:
  1.apply plugin: ‘com.android.application’該語句中的apply是一個方法,給它傳遞了一個引數plugin,plugin 的值是’com.android.application’。如果有多個引數,則以逗號隔開。
  2.android:主要配置Android相關的引數屬性
  3.dependencies:可以新增需要的依賴包。

  下面來詳細的分析一下android這個方法中的內容:
  
  compileSdkVersion
  buildToolsVersion
  defaultConfig
  buildTypes
  compileSdkVersion和buildToolsVersion 是必須的,前者指定編譯專案的sdk後者指定構建工具(build tools)的版本。這裡的build tools(在sdk/build-tools/目錄下)包含了我們在構建專案時的很多實用工具,像aapt,dx等。
25.0.2版本的build-tools
  
  defaultConfig指定的是Android應用的核心屬性,在defaultConfig指定之後,會覆蓋在AndroidManifest.xml指定的相對應的屬性。
  

defaultConfig {
        applicationId "com.chuck.moblie.baseproject"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

  
  applicationId: 指定專案的包名,該屬性會覆蓋AndroidManifest.xml指定的package name屬性,但是它又package name不完全一樣,applicationId可以被用作app在各應用商店或者裝置上的唯一標示,package name可以用作資原始碼和R檔案的包名。
  minSdkVersion:應用最低支援的Android版本。這裡我指定是API10應用的Android系統版本就是Gingerbread(Android2.3)了。
  targetSdkVersion:指定最高能支援的Android系統版本。API23對應的是Android M(Android6.0)
  versionCode :改app的版本一般在升級系統時需要用到
  versionName :改app版本名稱。
  
  有了這些屬性,並且會覆蓋AndroidManifest.xml的相應屬性,所以可以不用在AndroidManifest.xml檔案中定義。
  
  dependencies是Gradle的預設屬性,所以不用定義在android方法中,它主要指定對應的模組所需要的依賴。只需要通過compile一句話就可以搞定:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

}

  下面介紹一下常用的依賴引用方式:
  1.compile fileTree(dir, ‘libs’ ,include : ‘*.jar’) 依賴本地libs目錄下的所有jar檔案
  2.compile file(‘libs/xxx’) 依賴當個libs目錄(可以自己指定路徑,不一定要是libs)下的單個jar檔案。
  3. compile project(:xx:xx) 依賴某個工程。
  4. compile ‘group:name:version’ 依賴倉庫中的庫,當然這裡的倉庫根據前文介紹是在root目錄下的build.gradle中指定的,可以是JCenter也可以是本地的倉庫。
  build.gradle的配置基本內容,基本介紹完了,接下來就是根據自己的專案定義一些task來處理。下一篇文章將繼續介紹task。

相關文章