build.gradle

build.gradle 檔案的作用

一、Gradle 建置系統簡介

Android Studio 使用 Gradle 來建置專案。Gradle 是一款非常先進的建置工具,它採用基於 Groovy 的領域特定語言(DSL)來宣告專案設定,而非傳統的 XML。

一個 HelloWorld 專案中會有兩個 build.gradle 檔案:外層(專案層級)與內層(模組層級)。


二、外層 build.gradle(專案層級)

路徑:專案根目錄/build.gradle

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'

        // 注意:請勿在此處加入應用程式依賴;這些應放在個別模組的 build.gradle 檔案中
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}Code language: JavaScript (javascript)
關鍵配置解析
配置項說明
jcenter()宣告使用 JCenter 程式碼託管倉庫。許多開源 Android 專案都託管在 JCenter 上,宣告後即可直接引用這些開源函式庫
google()宣告使用 Google Maven 倉庫,用於取得 Android Support Library、Constraint Layout 等 Google 官方函式庫
classpath 'com.android.tools.build:gradle:3.1.2'宣告 Gradle 的 Android 外掛程式。Gradle 本身可用於建置 Java、C++ 等專案,建置 Android 專案則需要此外掛
allprojects為所有模組(包含子模組)統一配置倉庫位址
task clean定義了一個清理任務,執行時會刪除整個專案的 build 目錄

外層的 build.gradle 基本上不需要修改,除非你需要新增全域倉庫或升級 Gradle 外掛版本。


三、內層 build.gradle(模組層級 / app 目錄)

路徑:app/build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "com.foxdevelop.www.myapplication"
        minSdkVersion 14
        targetSdkVersion 27
        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:27.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}Code language: PHP (php)

以下逐一拆解每個部分。


四、apply plugin —— 外掛程式宣告

apply plugin: 'com.android.application'Code language: JavaScript (javascript)
值含義
com.android.application應用程式模組,可以直接執行
com.android.library函式庫模組,不能獨立執行,供其他模組依賴呼叫

這是區分一個模組是「App」還是「Library」的關鍵配置。


五、android 閉包 —— 核心建置配置

1. 編譯版本與建置工具
compileSdkVersion 27
buildToolsVersion "27.0.3"Code language: CSS (css)
配置說明
compileSdkVersion指定用哪個 Android SDK 版本編譯專案。27 對應 Android 8.1
buildToolsVersion建置工具的版本號,有新版本時 AS 會提示更新
2. defaultConfig —— 預設配置
defaultConfig {
    applicationId "com.foxdevelop.www.myapplication"
    minSdkVersion 14
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}Code language: JavaScript (javascript)
屬性說明
applicationId應用的唯一套件名稱,對應應用的唯一標識(Google Play 上架用)
minSdkVersion最低支援的 Android 版本,14 對應 Android 4.0
targetSdkVersion表示專案在該版本上進行了充分測試。系統會據此啟用對應版本的新功能(如 7.0 多視窗模式)
versionCode版本號,整數,用於應用程式商店判斷升級
versionName版本名稱,字串,使用者可見
testInstrumentationRunner指定 Android 自動化測試的執行器
3. buildTypes —— 建置類型
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}Code language: JavaScript (javascript)
配置說明
debug測試版配置(可省略,有預設值)
release正式版配置
minifyEnabled是否開啟程式碼混淆。false = 不混淆,true = 混淆
proguardFiles指定混淆規則檔案:
• 第一個:SDK 目錄下的通用混淆規則
• 第二個:proguard-rules.pro,可編寫專案特有規則

AS 預設執行的是 debug(測試)包,後面會講解如何產生正式發佈包。


六、dependencies —— 依賴管理

這是 最常修改 的部分,用於宣告專案依賴的所有函式庫。

三種依賴方式
類型說明範例
本地依賴依賴本地的 jar 檔或目錄compile fileTree(dir: 'libs', include: ['*.jar'])
函式庫依賴依賴專案中的函式庫模組compile project(':library')
遠端依賴依賴 JCenter / Google 倉庫上的開源函式庫compile 'com.android.support:appcompat-v7:27.+'
逐行解析
// 本地依賴:將 libs 目錄下所有 .jar 檔案加入建置路徑
compile fileTree(dir: 'libs', include: ['*.jar'])Code language: PHP (php)
// 遠端依賴:AppCompat 相容函式庫
// 格式:域名:組名:版本號
compile 'com.android.support:appcompat-v7:27.+'Code language: JavaScript (javascript)
// 遠端依賴:ConstraintLayout 佈局函式庫
compile 'com.android.support.constraint:constraint-layout:1.0.2'Code language: JavaScript (javascript)
// 測試依賴:JUnit 單元測試
testCompile 'junit:junit:4.12'Code language: JavaScript (javascript)
// Android 測試依賴:Espresso UI 測試
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})Code language: JavaScript (javascript)

遠端依賴工作流程:Gradle 先檢查本地是否快取了該函式庫 → 有則直接使用 → 沒有則自動連網下載 → 下載後加入建置路徑。


七、總結對照

檔案作用修改頻率
外層 build.gradle全域倉庫配置、Gradle 外掛版本極少修改
內層 app/build.gradle模組建置配置、依賴管理經常修改
核心配置關鍵屬性
——————
apply plugin區分 application / library
compileSdkVersion編譯 SDK 版本
applicationId應用唯一標識
minSdkVersion最低相容版本
targetSdkVersion目標測試版本
buildTypesdebug / release 建置配置
dependencies本地 / 遠端 / 函式庫依賴

build.gradle

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *