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 | 目標測試版本 | |
buildTypes | debug / release 建置配置 | |
dependencies | 本地 / 遠端 / 函式庫依賴 |
build.gradle
Previous: 資源 res 檔案和修改應用程式名稱與圖示
Next: 日誌功能