Gradle 建構總覽

Android 應用程式通常使用 Gradle 版本建構 有些人會將 Cloud Storage 視為檔案系統 但實際上不是在深入探討如何設定版本之前 探索此次建構的概念,以便您瞭解整個系統。

什麼是版本?

建構系統會將原始碼轉換為可執行的應用程式。 建構作業通常需要使用多項工具,才能分析、編譯、連結及封裝 應用程式、程式庫或程式庫Gradle 會透過以任務為基礎的方法來整理及執行資料 這些指令

工作會封裝指令,將輸入內容轉譯為 輸出內容「外掛程式」會定義工作及其設定。套用中 您建構的外掛程式會註冊其工作,然後使用 例如輸入和輸出內容例如:套用 Android Gradle 外掛程式 (AGP) 您的建構檔案中會註冊所有必要工作,以建立 APK,或 Android 程式庫。java-library 外掛程式可讓您透過 Java 來源建構 jar 再也不是件繁重乏味的工作Kotlin 與其他程式語言也有類似的外掛程式,但其他外掛程式 目的在於擴充外掛程式舉例來說,protobuf 外掛程式預計會 提供適用於 AGP 或 java-library 等現有外掛程式的 protobuf 支援。

Gradle 偏好採用慣例,而非設定,因此外掛程式能提供良好選擇 立即可用的預設值,但您也可以透過 kubectl 進一步設定版本 宣告式網域特定語言 (DSL)。DSL 經過精心設計 因此您可以指定要建構的「內容」,而不需指定建構的「方法」。當中的邏輯 外掛程式會管理相關「運作方式」該設定是由數個不同 在專案 (和子專案) 中建構檔案

工作輸入內容可以是檔案和目錄,以及編碼為 Java 型別 (整數、字串或自訂類別)。輸出內容只能是目錄 或是需要寫入磁碟中的檔案將工作輸出內容移至另一個 工作輸入內容會將這些工作相互連結,讓工作必須依序執行。

Gradle 支援在建構作業中編寫任意程式碼和工作宣告 檔案,將讓工具更難理解您的版本 以便維護舉例來說,您可以為外掛程式中的程式碼編寫測試 但不在建構檔案中您應該限制建構邏輯和工作 對外掛程式 (您或其他人定義的) 宣告,並宣告 想在建構檔案中使用該邏輯

執行 Gradle 建構作業時會發生什麼事?

Gradle 建構作業會分三個階段執行。每個階段都會執行 您在建構檔案中定義的程式碼。

  • 初始化功能會決定專案和子專案 建構,並設定包含建構檔案的類別路徑 外掛程式這個階段著重於設定檔,也就是您宣告專案的 和擷取外掛程式和程式庫的位置。
  • 設定會註冊每個專案的工作,並執行建構 檔案,才能套用使用者的建構規格。請務必瞭解 否則您的設定程式碼無法存取產生的資料或檔案 執行狀態
  • 執行會實際執行「建構」應用程式的表現輸出結果 是設定的有向非循環圖 (DAG), 代表使用者要求的所有必要建構步驟 提供給指令列中的工作,或建構檔案中做為預設值)。這個 圖表代表工作之間的關係, 或基於其輸入和輸出內容。如果工作包含的輸入內容 是另一項工作的輸出內容,因此必須繼續執行其他任務後執行。這個 階段會依照圖中定義的順序執行過期的工作;如果工作 輸入內容在上次執行後維持不變,Gradle 會略過輸入內容。

詳情請參閱 Gradle 建構生命週期相關說明。

設定 DSL

Gradle 會使用網域特定語言 (DSL) 進行設定 建構應用程式這種宣告式方法著重於指定資料 編寫路線逐步指引

DSL 致力讓所有人、領域專家和程式設計人員都能更輕鬆 就能為專案定義這種小型語言模型 更自然Gradle 外掛程式可以擴充 DSL 來設定資料 依個人需求調整設定

舉例來說,設定版本的 Android 部分可能會如下所示:

Kotlin

android {
    namespace = "com.example.app"
    compileSdk = 34
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 34
        // ...
    }
}

Groovy

android {
    namespace 'com.example.myapplication'
    compileSdk 34
    // ...

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 24
        // ...
    }
}

DSL 程式碼在背景中類似以下程式碼:

fun Project.android(configure: ApplicationExtension.() -> Unit) {
    ...
}

interface ApplicationExtension {
    var compileSdk: Int
    var namespace: String?

    val defaultConfig: DefaultConfig

    fun defaultConfig(configure: DefaultConfig.() -> Unit) {
        ...
    }
}

DSL 中的每個區塊都以函式表示,該函式會將 lambda 用於 並設定名稱相同的屬性即可存取該資源如此一來 更像是資料規格

外部依附元件

Maven 建構系統導入了依附元件規格 儲存和管理系統程式庫儲存在 repositories (伺服器或目錄),中繼資料包括 和其他程式庫的依附元件由您指定 要使用的依附元件版本 建構系統都會在建構期間下載這些檔案

Maven Artifacts 會依群組名稱 (公司、開發人員等)、構件辨識 (程式庫名稱) 和該成果的版本。這通常 以 group:artifact:version 表示。

這種做法可大幅改善版本管理成效。你經常會聽到這類說法 所有名為「Maven 存放區」的存放區 是否已封裝並發布構件這些存放區和中繼資料 多個建構系統重複使用,包括 Gradle (以及 Gradle 可發布至 這些存放區)。公開存放區可讓所有人共用 公司存放區會將內部依附元件保留在內部。

您也可以將專案模組化子專案 (在 Android Studio 中稱為「模組」),也可將其做為 依附元件每項子專案都會產生可輸出的 子專案或頂層專案消耗的資源這樣就能縮短建構時間 以便確實區分出需要重建的部分 負責應用程式中的責任

我們會在「新增建構項目」中詳細介紹如何指定依附元件 依附元件

建構變化版本

建立 Android 應用程式時,通常會建議您建立多個 子類。變化版本包含不同程式碼,或建構時使用不同的程式碼 選項,由建構類型和變種版本組成。

建構類型因宣告的建構選項而異。根據預設,AGP 會設定「release」 以及「偵錯」但您可以調整這些類型並新增更多 測試或內部測試)。

偵錯版本不會壓縮或模糊處理應用程式,加快其速度 所以可以按原樣建構並保留所有符號系統也會將應用程式標示為 「可進行偵錯」,使用通用偵錯金鑰簽署該金鑰, 裝置上安裝的應用程式檔案。這樣您可以探索 儲存於檔案和資料庫。

發布子版本會最佳化應用程式,並使用發布金鑰簽署應用程式。 保護已安裝的應用程式檔案。

使用變種版本即可變更納入的來源和依附元件 變化版本。舉例來說,您可以建立「示範」 和「full」口味,或「免費」以及「付費」變種版本 您將通用來源寫入「main」source set 目錄,然後 以變種版本命名的來源集中,覆寫或新增來源。

AGP 會為每個建構類型和變種版本的組合建立變化版本。如果 您沒有定義變種版本,而變數則以建構類型命名。如果發生以下情況: 兩者都定義,變數的名稱是 <flavor><Buildtype>。舉例來說 類型 releasedebug,以及變種版本 demofull,AGP 會建立 子類:

  • demoRelease
  • demoDebug
  • fullRelease
  • fullDebug

後續步驟

現在,您已瞭解建構概念,接著來看看 Android 版本 結構