Gradle 與 AGP 構建 API: 配置您的構建檔案

Android開發者發表於2021-12-27

歡迎閱讀全新的 MAD Skills 系列GradleAndroid Gradle plugin API 的第一篇文章。我們將在本文中瞭解 Android 構建系統的工作方式以及 Gradle 的基礎知識。

我們將會從 Gradle 的構建階段開始,討論如何使用 AGP (Android Gradle Plugin) 的配置選項自定義您的構建,並討論如何使您的構建保持高效。如果您更喜歡通過視訊瞭解此內容,請在 此處 檢視。

通過了解構建階段的工作原理及配置 Android Gradle plugin 的配置方法,可以幫您基於專案的需求自定義構建。讓我們回到 Android Studio,一起看看構建系統是如何工作的吧。

Gradle 簡介

Gradle 是一個通用的自動化構建工具。當然,您可以使用 Gradle 來構建 Android 專案,但實際上您可以使用 Gradle 來構建任何型別的軟體。

Gradle 支援單一或多專案構建。如果要將專案配置為使用 Gradle,您需要在專案資料夾中新增 build.gradle 檔案。

在多專案層級結構中,根專案中會包含一個 settings.gradle 檔案,其中列出了構建中包含的其他專案。Android 使用多專案構建來幫您模組化應用。

△ Android 專案結構與 build.gradle 及 settings.gradle 檔案

△ Android 專案結構與 build.gradle 及 settings.gradle 檔案

由於外掛的存在,Gradle 可以處理不同型別的專案,比如 Android 或 Java。這些外掛會包含預定義的功能,用於配置和構建特定型別的專案。

例如,為了構建 Android 專案,您需要使用 Android Gradle 外掛配置您的 Gradle 構建檔案。無論當前的 Android 專案是應用還是依賴庫,Android Gradle 外掛都知道如何對其進行構建和打包。

Task (任務)

Gradle 的構建流程圍繞名為 Task (任務) 的工作單元展開。您可以通過終端檢視 Task 列表,或通過啟用 Android Studio Gradle 皮膚中的 Task 列表來檢視任務。

△ Gradle Task 列表

△ Gradle Task 列表

這些 Task 可以接收輸入、執行某些操作,並根據執行的操作產生輸出。

Android Gradle Plugin 定義了自己的 Task,並且知道構建 Android 專案時,需要以何種順序執行這些 Task。

Gradle 構建檔案由許多不同的部分組成。Gradle 的配置語法被稱為 Gradle DSL,其為開發者定義了配置外掛的方式。Gradle 會解析 build.gradle 檔案中的 android DSL 塊並建立 AGP DSL 物件,例如 ApplicationExtensionBuildType

典型的 Android 專案會包含一個頂層 Gradle 構建檔案。Android 專案中的每個模組又分別有一個 Gradle 構建檔案。在示例專案中,我僅有一個應用模組。

在模組層的 build.gradle 檔案中,我需要宣告和應用構建專案所需的外掛。為了讓 Gradle 知道我正在構建 Android 專案,我需要應用 com.android.applicationcom.android.library 外掛。這兩個外掛分別定義瞭如何配置和構建 Android 應用和依賴庫。在本例中,我要構建的是 Android 應用專案,所以我需要應用 com.android.application 外掛。由於我需要使用 Kotlin,所以在示例中也應用了 kotlin.android 外掛。

plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
}

Android Gradle Plugin 提供了它自己的 DSL,您可以用它配置 AGP,並使該配置在構建時應用於 Task。

想要配置 Android Gradle Plugin,您需要使用 android 塊。在該程式碼塊中,您可以為不同的構建型別 (如 debug 或 release) 定義 SDK 版本、工具版本、應用詳情及其它一些配置。如需瞭解更多有關 gradle 如何使用這些資訊來建立變體,以及您可以使用哪些其他選項,請參閱 構建文件:

android {
    compileSdk 31

    defaultConfig {
        applicationId "com.example.myapp"
        minSdk 21
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

在下一部分中,您可以定義依賴。Gradle 的依賴管理支援相容 MavenIvy 的倉庫,以及來自檔案系統的本地二進位制檔案。

dependencies {
 
   implementation 'androidx.core:core-ktx:1.7.0'
   implementation 'com.google.android.material:material:1.4.0'
   implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
   testImplementation 'junit:junit:4.13.2'
   androidTestImplementation 'androidx.test.ext:junit:1.1.3'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
 
}

構建階段

Gradle 分三個階段評估和執行構建,分別是 Initialization (初始化)、Configuration (配置) 和 Execution (執行),更多請參閱 Gradle 文件

在 Initialization (初始化) 階段,Gradle 會決定構建中包含哪些專案,並會為每個專案建立 Project例項。為了決定構建中會包含哪些專案,Gradle 首先會尋找 settings.gradle 來決定此次為單專案構建還是多專案構建。

在 Configuration (配置) 階段,Gradle 會評估構建專案中包含的所有構建指令碼,隨後應用外掛、使用 DSL 配置構建,並在最後註冊 Task,同時惰性註冊它們的輸入。

需要注意的是,無論您請求執行哪個 Task,配置階段都會執行。為了保持您的構建簡潔高效,請避免在配置階段執行任何耗時操作。

最後,在 Execution (執行) 階段,Gradle 會執行構建所需的 Task 集合。

下篇文章中,在編寫我們自己的外掛時,我們將深入剖析這些階段。

Gradle DSL 支援使用 Groovy 與 Kotlin 指令碼編寫構建檔案。到目前為止,我都在使用 Groovy DSL 指令碼來配置此工程的構建。您可以在下面看到分別由 Kotlin 和 Groovy 編寫的相同構建檔案。注意 Kotlin 指令碼檔名字尾為 ".kts"。

△ Kotlin 與 Groovy 指令碼對比

△ Kotlin 與 Groovy 指令碼對比

從 Groovy 遷移到 Kotlin 或其他配置指令碼的方法,不會改變您執行 Task 的方式。

總結

以上便是本文的全部內容。Gradle 與 Android Gradle Plugin 有許多可以讓您自定義構建的功能。在本文中,您已經瞭解了 Gradle Task、構建階段、配置 AGP 以及使用 DSL 配置構建的基礎知識。

敬請關注下一篇文章,我們將帶您瞭解如何在編寫您自己的外掛時,使用 AGP 的 Variant API 來擴充套件您的構建。

歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!

相關文章