1. 程式人生 > >詳解build.gradle 檔案

詳解build.gradle 檔案

不用於Eclipse,Android Studio是採用Gradle 來構建專案的。Gradle 是一個非常先進的專案構建工具,它使用了一種基於Groovy 的領域特定語言(DSL)來宣告專案設定,摒棄了傳統基於XML(如Ant和Maven)的各種繁瑣的配置。

專案中有兩個build.gradle檔案,一個是在最外層目錄下的,一個是在app 目錄下的。這兩個檔案對構建Android Studio 專案都起到了至關重要的作用,下面我們就來對這兩個檔案中的內容進行詳細的分析。

1. 最外層目錄下的 build.gradle檔案

程式碼如下所示:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'

        // 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
}
這些程式碼都是自動生成的,雖然語法結構看上去可能有點難以理解,但是如果我們忽略語法結構,只看最關鍵的部分,其實還是很好懂的。

首先,兩處repositories的閉包中都聲明瞭jcenter() 這行配置,那麼這個jcenter是什麼意思呢?其實它是一個程式碼託管倉庫,很多Android 開源專案都會選擇將程式碼託管到jcenter上,聲明瞭這行配置之後,我們就可以在專案中輕鬆引用任何jcenter上的開源專案了。

接下來,dependencies閉包中使用classpath聲明瞭一個Gradle 外掛。為什麼要宣告這個外掛呢?因為Gradle 並不是專門為構建Android 專案而開發的,Java、C++等很多種專案都可以使用Gradle 來構建。因此如果我們要想使用它來構建Android 專案,則需要宣告 com.android.tools.build:gradle:2.3.2 這個外掛。其中,最後面的部分是外掛的版本號。

這樣最外層目錄下的build.gradle 檔案分析完了,通常情況下你並不需要修改這個檔案中的內容,除非你想新增一些全域性的專案構建配置。

2.app 目錄下的build.gradle 檔案

程式碼如下所示:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "penny.helloworld"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}
這個檔案中的內容就要相對複雜一些了,下面我們一行行的進行分析。

首先第一行應用了一個外掛,一般有兩種值可選:com.android.application 表示這是一個應用程式模組,com.android.library 表示這是一個庫模組。應用程式模組和庫模組的最大區別在於,一個是可以直接執行的,一個只能作為程式碼庫依附於別的應用程式模組來執行。

接下來是一個大的android 閉包,在這個閉包中我們可以配置專案構建的各種屬性。其中compilesdkVersion 用於指定專案的編譯版本,這裡我們用25 表示使用Android 7.1 系統的SDK 編譯。buildToolsVersion 用於指定專案構建工具的版本,目前的版本是25.0.3,如果有更新的版本時,Android Studio 會進行提示。

然後我們看到,這裡在android 閉包中又巢狀一個defaultConfig 閉包,defaultConfig 閉包中可以對專案的更多細節進行配置。其中,applicationId 用於指定專案的包名,前面我們在建立專案的時候其實已經指定過報名了,如果你想在後面對其進行修改,那麼就是在這裡修改的。minSdkVersion 用於指定專案最低相容的Android 系統版本,這裡指定成16表示最低相容到Android 4.1 系統。targetSdkVersion 指定的值表示你在該目標版本上已經做過了充分的測試,系統將為你的應用程式啟用一些最新的功能和特性。比如說Android 6.0 系統中引入了執行時許可權這個功能,如果你將targetSDKVersion 指定成23 或者更高,那麼系統就會為你的程式啟用執行時許可權功能,而如果你將targetSDKVersion 指定成22,那麼就說明你的程式最高只在Android 5.1 系統上做過充分的測試,Android 6.0 系統中引入的新功能自然就不會啟用了。剩下的兩個屬性都比較簡單,versionCode用於指定專案的版本號,versionName 用於指定專案的版本名,這兩個屬性在生成安裝檔案的時候非常重要。

分析完了defaultConfig 閉包,接下來我們看一下buildTypes 閉包。buildTypes 閉包用於指定生成安裝檔案的相關配置,通常只會有兩個子閉包,一個是debug,一個是release。debug 閉用於指定生成測試版本安裝檔案的配置,release 閉包用於指定生成正式版本安裝檔案的配置。另外debug 閉包是可以忽略不寫的,因此我們看到上面的程式碼中就只有一個release 閉包。下面來看一下release 閉包中的具體內容吧,minifyEnable 用於指定是否對專案的程式碼進行混淆,true 表示混淆,false 表示不混淆。proguardFiles 用於指定混淆時試用的規則檔案,這裡指定了兩個檔案,第一個proguard-android.txt 是在Android SDK 目錄下的,裡面是所有專案通用的混淆規則,第二個proguard-rules.pro 是在當前專案的根目錄下的,裡面可以編寫當前專案特有的混淆規則。需要注意的是,通過Android Studio 直接執行專案生產的都是測試版安裝檔案。

這樣整個android 閉包中的內容就都分析完了,接下來還剩一個dependencies 閉包。整個閉包的功能非常強大,他可以指定當前專案所有的依賴關係。通常Android Studio 專案一共有三種依賴方式:本地依賴、庫依賴和遠端依賴。本地依賴可以對本地的Jar包或目錄新增依賴關係,庫依賴可以對專案中的庫模組新增依賴關係,遠端依賴則可以對jcenter庫上的開源專案新增依賴關係。觀察一下dependencies 閉包中的配置,第一行的compile fileTree 就是一個本地依賴宣告,它表示將libs目錄下的所有.jar 字尾的檔案都新增到專案的構造路徑當中。 而第二行的compile 則是遠端依賴宣告,com.android.support:appcompat-v7:25.3.1 就是一個標準的遠端依賴庫格式,其中com.android.support 是域名部分,用於和其它公司的庫作區分;appcompat-v7 是組名稱,用於和同一個公司中不同的庫作區分;25.3.1 是版本號,用於和同一個庫不同的版本作區分。加上這句聲明後,Gradle 在構建專案時會首先檢查一下本地是否已經有這個庫的快取,如果沒有的話則會去自動聯網下載,然後再新增到專案的構建路徑當中。至於庫依賴宣告這裡沒有用到,它的基本格式是compile project 後面加上要依賴的庫名稱,比如說有一個庫模組的名字是helper,那麼新增這個庫依賴關係只需要加入compile project(':helper') 這句宣告即可。另外剩下的一句testCompile 是用於宣告測試用例庫的。