---
# System prepended metadata

title: '[Video Note] [Gradle] PhilippLackner - The Ultimate Gradle Kotlin Beginner''s Crash Course For 2025'
tags: [Gradle, Video Note]

---

# Introduction
- Gradle 是開發中不可或缺的工具，幾乎所有專案都需要使用。
- 理解 Gradle 可幫助解決許多錯誤和問題。
- 這是一個針對初學者的 Gradle Crash Course，專注於 Android 開發中必須知道的內容。

# Gradle in Android Studio
- 新專案會自動生成包含 Gradle 文件的結構。
- Gradle 用來管理專案中的任務，例如編譯、打包、安裝及部署應用。
- 主要負責下載依賴、編譯代碼、打包 APK 並安裝至裝置。
- Gradle 依賴於其他工具，如 ADB，來完成安裝和運行應用。
- 不僅限於 Android，也可用於其他類型的專案。

# The Gradle Wrapper
![CleanShot 2024-11-28 at 17.57.39](https://hackmd.io/_uploads/r1Ui0nSXJl.png)

- Gradle Wrapper 是命令列工具，提供執行 Gradle 任務的功能。
- 通過 `gradlew` 命令列出 Gradle 任務，並執行必要的步驟來構建和安裝應用。
- Gradle 會依照任務之間的依賴順序執行，並能並行執行不相依的任務。

# build.gradle.kts (project)
- 這是專案級的 Gradle 文件，適用於整個專案的配置。
- 用來管理插件、依賴和全專案級別的設定。
- 其中包含插件配置，這些插件負責處理特定的構建邏輯，例如 Android 應用的構建。

# Gradle Plugins
- 插件是 Gradle 中用來封裝特定構建邏輯的 Kotlin 類。
- 插件可重用，並可應用於多個模組。
- 需要將插件配置添加到 `build.gradle` 文件中，並通過 `apply` 函數使用。

# build.gradle.kts (app)
- 模組級的 Gradle 文件，用來設定此應用模組的特定配置。
- 包含應用的 namespace、編譯 SDK 版本、最小 SDK 和目標 SDK 等。
- 設定應用 ID、版本碼和版本名稱等 Google Play 所需的屬性。
- 配置編譯選項，包含 Java 和 Kotlin 的編譯選項。
# Version Catalogs

### 概念介紹
- **版本目錄（Version Catalog）** 是用來管理和集中控制專案內的庫版本的工具。
- 可以在 `libs.versions.toml` 檔案中指定所有庫的版本和相關配置，這樣可以在專案中輕鬆更新和重用版本。

### 實作方法
- **libs.versions.toml** 是一個版本配置檔，其中定義了不同庫的版本和名稱。
- 範例：
```toml
[versions]
junit = "5.7.1"

[libraries]
junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" }
```
- **Gradle 插件** 也能在版本目錄中配置，例如 `com.android.application` 或 `kotlin` 插件，這樣可以集中管理所有版本。

### 工作原理
- 在應用的 `build.gradle` 檔案中，使用 `implementation(libs.junit)` 來引入指定的庫版本。
- 這些配置會從版本目錄中取得版本資訊，避免了在專案中多次重複更新版本號碼。

---

# Gradle Modules

### 概念介紹
- **模組（Module）** 是一個可重用的程式碼單位，通常被稱為「庫」。
- 每個模組都有自己的 `build.gradle` 檔案，定義其依賴和構建配置。

### 模組類型
- **Android Library 模組**：用於需要 Android SDK 功能的模組，如 `Context`、`Activity` 等。
- **Kotlin/Java Library 模組**：純邏輯模組，不依賴於 Android SDK。

### 如何建立與使用
- 在 Android Studio 中，可以通過右鍵點擊專案並選擇「Create New Module」來創建新的模組。
- 當創建一個新模組後，Gradle 會自動同步專案以更新依賴。

### 模組之間的關聯
- 若要在應用模組中使用其他模組，需在應用的 `build.gradle` 檔案中添加：
```gradle
implementation project(":streaming")
```
- 這樣可以讓應用模組引用並使用 `streaming` 模組中的程式碼和功能。

# Build Types

### 概念介紹
- **構建類型（Build Type）** 是用來定義不同版本的應用程式配置，如 `debug` 和 `release`。
- 每個構建類型可以有不同的設定，如 `minifyEnabled`、`proguardFiles` 等。

### 常見配置
- **Debug**：用於開發階段，通常包含更多的日誌和調試資訊。
- **Release**：用於發佈版本，會啟用混淆、縮減等優化來保護應用程式並提高性能。

### 如何配置
- 可以在應用的 `build.gradle` 檔案中設定：
```gradle
buildTypes {
debug {
debuggable true
applicationIdSuffix ".debug"
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
```
- **`proguard-rules.pro`** 文件用於配置 ProGuard 的混淆規則，確保應用的安全性和大小優化。

# Build Config
- Build config 字段允許定義針對不同建置的設定，例如 API 網址。
- 你可以為每個建置類型定義不同的 base URL（例如，`uat` 用於測試和 `live` 用於發佈）。
- Gradle 會生成一個 `BuildConfig` 類，其中包含這些字段，可在應用程式的代碼中使用。
- Gradle 確保根據建置變體應用正確的值，無需在代碼中進行手動檢查。

# Product Flavors
- Product flavors 定義應用程式的不同版本，例如免費版和付費版。
- 你可以為每個 flavor 設定不同的配置，例如設置不同的 `applicationIdSuffix` 或 `buildConfigFields`。
- Product flavors 可以有不同的 flavor dimensions（例如，`paid status` 或 `style`）。
- 你可以將 product flavors 與 build types 組合來創建多個建置變體（例如，`free green debug` 或 `paid red release`）。
- Gradle 管理這些組合，並在建置應用程式時提供正確的變體。

# Source Sets
- Source sets 是 Gradle 查找代碼和資源的目錄。
- 每個 source set 用於將代碼和資源分組，以針對不同的建置變體或測試類型。
- 預設的 source sets 包括 `main`、`test` 和 `androidTest`。
- Gradle 允許為特定的 product flavors 或 build types 創建自訂的 source sets（例如，`free`、`paid`、`debug`）。
- 這些自訂的 source sets 包含與對應變體相關的代碼或資源（例如，為付費用戶設計的 `paidText` 類）。
- Gradle 根據選定的建置變體合併來自相應 source sets 的代碼。


# Terminology
- Gradle：一種強大的構建工具，用於自動執行軟體構建過程中的任務。
- Gradle Kotlin DSL：Gradle 的 Kotlin 配置語法，提供更好的型別安全與開發體驗。
- Gradle Groovy DSL：Gradle 的 Groovy 配置語法，早期版本的主要語法方式。
- Gradle Wrapper：一個用於確保項目使用正確版本 Gradle 的腳本。
- Plugin：Gradle 的擴展模組，用於增加或修改構建邏輯。
- build.gradle.kts：以 Kotlin DSL 編寫的 Gradle 配置文件，用於定義構建邏輯。
- settings.gradle.kts：用於定義多模組項目的設定文件。
- Dependencies：應用程式需要的外部庫或模組，用於添加功能。
- Tasks：Gradle 中的基本執行單元，完成特定的構建步驟。
- Linting：靜態代碼分析過程，用於檢查代碼規範與潛在問題。
- Compile SDK：應用程式編譯時使用的 Android API 級別。
- Min SDK：應用程式支持的最低 Android API 級別。
- Target SDK：應用程式設計用於運行的目標 Android API 級別。
- Build Types：不同的構建類型，如 Debug 和 Release。
- Variants：不同配置的構建版本，根據 Build Types 和 Flavors 生成。
- Flavors：用於創建應用不同變體的自定義配置。
- Proguard：用於壓縮、優化和混淆 Java 與 Kotlin 代碼的工具。
- ADB（Android Debug Bridge）：一個與 Android 設備通信的命令行工具。
- Dependencies Configuration：定義依賴項的作用範圍與類型的 Gradle 配置。
- JVM Target：指定 Kotlin 編譯後的目標 Java 虛擬機版本。
- **Version Catalog**: 一種管理依賴版本的集中化方式，允許在一個位置定義版本號以便於更新和重用。
- **Gradle**: 一種構建自動化工具，用於配置和管理Android項目構建過程。
- **Dependencies Block**: 定義專案中需要引用的外部或內部庫的區塊。
- **Library**: 提供額外功能的模組，可以是Android Library或Kotlin/Java Library。
- **Module**: 專案中的獨立代碼容器，可以作為Library或應用程式模組存在。
- **Gradle File**: 包含模組配置的腳本文件，通常為`build.gradle`或`build.gradle.kts`。
- **Gradle Plugin**: 用於擴展Gradle功能的模組，例如Android插件。
- **Application Module**: 包含主應用代碼的模組，通常是專案的核心部分。
- **Implementation**: 在依賴中指定一個庫或模組的Gradle配置語句。
- **Remote Repository**: 提供庫和插件的遠程服務器，例如Maven Central或Google Repository。
- **Local Module Dependency**: 從專案內部添加模組作為依賴的方式。
- **Settings.gradle.kts**: 定義專案包含的模組及其配置的文件。
- **Maven Central**: 常見的Java與Kotlin庫的公共存儲庫。
- **Minimum SDK Version**: 定義應用或模組所支持的最低Android系統版本。
- **Multi-Module Architecture**: 將專案劃分為多個模組以提升代碼重用性和可維護性的設計模式。
- **Gradle Synchronization**: 更新專案的構建設定以反映最近的變更的過程。
- **Isolated Container**: 用於封裝獨立功能或邏輯的模組。
- **Indexing**: 在IDE中分析代碼結構以提供自動完成和其他開發者工具的過程。
- **Build Logic**: 定義構建過程中的配置與邏輯，例如依賴管理和任務腳本。
- **Gradle Include Function**: 在`settings.gradle.kts`中用於將模組添加到專案的函數。
- **Build Type**：定義應用程式的開發階段，例如 `debug` 和 `release`。
- **Minify Enabled**：設定是否啟用代碼壓縮與混淆，通常 `release` 啟用，`debug` 停用。
- **R8**：用於壓縮和混淆代碼的工具，增強應用安全性和減少 APK 大小。
- **Obfuscation**：代碼混淆過程，使代碼難以閱讀，增加逆向工程難度。
- **Build Variant**：Build Type 與 Product Flavor 的組合，例如 `debug-free`。
- **Build Config Field**：允許為每個 Build Type 或 Product Flavor 定義變數，例如 `baseUrl`。
- **Product Flavor**：用於區分應用不同版本，例如 `free` 和 `paid`。
- **Flavor Dimension**：將 Product Flavor 分組的概念，例如 `paidStatus` 或 `style`。
- **Application ID Suffix**：用於區分 Product Flavor 的應用程式 ID 後綴，例如 `.free`。
- **Source Set**：每個 Build Variant 的代碼和資源目錄，例如 `main`、`debug` 或 `free`。
- **Android Test Source Set**：包含需在 Android 裝置上運行的測試代碼。
- **Unit Test Source Set**：包含不需實際裝置即可運行的測試代碼。
- **UAT**：用戶驗收測試（User Acceptance Testing）的 API 或伺服器環境。
- **White Label**：品牌定製應用，用於不同客戶或公司的定製版本。
- **Debug UI**：僅在 Debug Build 中顯示的測試用戶介面。
- **Compose**：Jetpack Compose，Android 現代化的 UI 工具。
- **Gradle Synchronization**：同步 Gradle 設定以應用更改的過程。
- **APK**：Android 安裝包文件，包含應用程式的所有資源與代碼。
- **Rebuild Project**：重新構建項目，清除舊的構建輸出以解決構建問題。
- **Merge Source Set**：將特定 Source Set 的代碼合併到主應用程式的過程，例如 `main` 與 `debug`。