Android 應用程式通常是使用 Gradle 建構系統建構而成。在深入瞭解如何設定建構項目之前,我們先來探討建構項目背後的概念,讓您從整體角度認識這個系統。
什麼是建構?
建構系統會將原始碼轉換為可執行的應用程式。建構作業通常會用到多種工具,用於分析、編譯、連結及封裝應用程式或程式庫。Gradle 會使用以工作為基礎的方法,整理及執行這些指令。
工作會封裝指令,將輸入內容轉換為輸出內容。外掛程式會定義工作及其設定。將外掛程式套用至建構作業時,系統會註冊外掛程式的工作,並使用輸入和輸出內容將這些工作連結在一起。舉例來說,將 Android Gradle 外掛程式 (AGP) 套用至建構檔案,會註冊建構 APK 或 Android 程式庫所需的所有工作。java-library 外掛程式可讓您從 Java 原始碼建構 jar。Kotlin 和其他語言也有類似的外掛程式,但其他外掛程式是用來擴充外掛程式。舉例來說,protobuf 外掛程式的用途是為 AGP 或 java-library 等現有外掛程式新增 protobuf 支援。
Gradle 偏好慣例而非設定,因此外掛程式會提供良好的預設值,但您仍可透過宣告式網域特定語言 (DSL) 進一步設定建構作業。DSL 的設計宗旨是讓您指定要建構的內容,而不是建構方式。外掛程式中的邏輯會管理「如何」執行。該設定是在專案 (和子專案) 的多個建構檔案中指定。
工作輸入內容可以是檔案和目錄,也可以是編碼為 Java 型別 (整數、字串或自訂類別) 的其他資訊。輸出內容只能是目錄或檔案,因為必須寫入磁碟。將工作輸出內容連線至其他工作輸入內容,即可連結工作,讓工作必須依序執行。
雖然 Gradle 支援在建構檔案中編寫任意程式碼和工作宣告,但這可能會導致工具更難瞭解您的建構作業,也讓您更難維護。舉例來說,您可以為外掛程式內的程式碼編寫測試,但無法為建構檔案編寫測試。您應該將建構邏輯和工作宣告限制在外掛程式 (由您或其他使用者定義) 中,並在建構檔案中宣告要如何使用該邏輯。
執行 Gradle 建構作業時會發生什麼情況?
Gradle 建構作業分為三個階段。每個階段都會執行您在建構檔案中定義的不同程式碼部分。
- 初始化會決定建構作業要納入哪些專案和子專案,並設定包含建構檔案和套用外掛程式的類別路徑。這個階段的重點是設定檔,您可以在其中宣告要建構的專案,以及要擷取外掛程式和程式庫的位置。
- 設定會為每個專案註冊工作,並執行建構檔案來套用使用者的建構規格。請務必瞭解,設定程式碼無法存取執行期間產生的資料或檔案。
- 執行作業會實際「建構」應用程式。設定的輸出內容是工作的有向無環圖 (DAG),代表使用者要求的所有必要建構步驟 (在指令列上提供的工作,或建構檔案中的預設工作)。這個圖表代表工作之間的關係,可能是工作宣告中明確指出,也可能是根據工作輸入和輸出內容而定。如果某項工作有輸入內容,而該內容是另一項工作的輸出內容,則該工作必須在另一項工作完成後執行。這個階段會依圖表定義的順序執行過時的工作;如果工作輸入內容自上次執行後未變更,Gradle 會略過該工作。
詳情請參閱 Gradle 的「建構生命週期」。
設定 DSL
Gradle 使用網域專屬語言 (DSL) 設定建構作業。這種宣告式做法的重點在於指定資料,而不是編寫逐步 (命令式) 指令。您可以使用 Kotlin 或 Groovy 編寫建構檔案,但我們強烈建議使用 Kotlin。
DSL 旨在讓領域專家和程式設計師等所有人都能更輕鬆地為專案貢獻心力,定義以更自然的方式呈現資料的小型語言。Gradle 外掛程式可以擴充 DSL,設定工作所需的資料。
舉例來說,設定建構作業的 Android 部分可能如下所示:
Kotlin
android { namespace = "com.example.app" compileSdk { version = release(36) { minorApiLevel = 1 } } // ... defaultConfig { applicationId = "com.example.app" minSdk { version = release(23)