Gradle 與 AGP 構(gòu)建 API: 配置您的構(gòu)建文件

image

歡迎閱讀全新的 MAD Skills 系列GradleAndroid Gradle plugin API 的第一篇文章。我們將在本文中了解 Android 構(gòu)建系統(tǒng)的工作方式以及 Gradle 的基礎(chǔ)知識。

我們將會從 Gradle 的構(gòu)建階段開始,討論如何使用 AGP (Android Gradle Plugin) 的配置選項自定義您的構(gòu)建,并討論如何使您的構(gòu)建保持高效。如果您更喜歡通過視頻了解此內(nèi)容,請在 此處 查看。

通過了解構(gòu)建階段的工作原理及配置 Android Gradle plugin 的配置方法,可以幫您基于項目的需求自定義構(gòu)建。讓我們回到 Android Studio,一起看看構(gòu)建系統(tǒng)是如何工作的吧。

Gradle 簡介

Gradle 是一個通用的自動化構(gòu)建工具。當(dāng)然,您可以使用 Gradle 來構(gòu)建 Android 項目,但實(shí)際上您可以使用 Gradle 來構(gòu)建任何類型的軟件。

Gradle 支持單一或多項目構(gòu)建。如果要將項目配置為使用 Gradle,您需要在項目文件夾中添加 build.gradle 文件。

在多項目層級結(jié)構(gòu)中,根項目中會包含一個 settings.gradle 文件,其中列出了構(gòu)建中包含的其他項目。Android 使用多項目構(gòu)建來幫您模塊化應(yīng)用。

△ Android 項目結(jié)構(gòu)與 build.gradle 及 settings.gradle 文件

由于插件的存在,Gradle 可以處理不同類型的項目,比如 Android 或 Java。這些插件會包含預(yù)定義的功能,用于配置和構(gòu)建特定類型的項目。

例如,為了構(gòu)建 Android 項目,您需要使用 Android Gradle 插件配置您的 Gradle 構(gòu)建文件。無論當(dāng)前的 Android 項目是應(yīng)用還是依賴庫,Android Gradle 插件都知道如何對其進(jìn)行構(gòu)建和打包。

Task (任務(wù))

Gradle 的構(gòu)建流程圍繞名為 Task (任務(wù)) 的工作單元展開。您可以通過終端查看 Task 列表,或通過啟用 Android Studio Gradle 面板中的 Task 列表來查看任務(wù)。

△ Gradle Task 列表

這些 Task 可以接收輸入、執(zhí)行某些操作,并根據(jù)執(zhí)行的操作產(chǎn)生輸出。

Android Gradle Plugin 定義了自己的 Task,并且知道構(gòu)建 Android 項目時,需要以何種順序執(zhí)行這些 Task。

Gradle 構(gòu)建文件由許多不同的部分組成。Gradle 的配置語法被稱為 Gradle DSL,其為開發(fā)者定義了配置插件的方式。Gradle 會解析 build.gradle 文件中的 android DSL 塊并創(chuàng)建 AGP DSL 對象,例如 ApplicationExtensionBuildType。

典型的 Android 項目會包含一個頂層 Gradle 構(gòu)建文件。Android 項目中的每個模塊又分別有一個 Gradle 構(gòu)建文件。在示例項目中,我僅有一個應(yīng)用模塊。

在模塊層的 build.gradle 文件中,我需要聲明和應(yīng)用構(gòu)建項目所需的插件。為了讓 Gradle 知道我正在構(gòu)建 Android 項目,我需要應(yīng)用 com.android.applicationcom.android.library 插件。這兩個插件分別定義了如何配置和構(gòu)建 Android 應(yīng)用和依賴庫。在本例中,我要構(gòu)建的是 Android 應(yīng)用項目,所以我需要應(yīng)用 com.android.application 插件。由于我需要使用 Kotlin,所以在示例中也應(yīng)用了 kotlin.android 插件。

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

Android Gradle Plugin 提供了它自己的 DSL,您可以用它配置 AGP,并使該配置在構(gòu)建時應(yīng)用于 Task。

想要配置 Android Gradle Plugin,您需要使用 android 塊。在該代碼塊中,您可以為不同的構(gòu)建類型 (如 debug 或 release) 定義 SDK 版本、工具版本、應(yīng)用詳情及其它一些配置。如需了解更多有關(guān) gradle 如何使用這些信息來創(chuàng)建變體,以及您可以使用哪些其他選項,請參閱 構(gòu)建文檔:

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 的倉庫,以及來自文件系統(tǒng)的本地二進(jìn)制文件。

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'
 
}

構(gòu)建階段

Gradle 分三個階段評估和運(yùn)行構(gòu)建,分別是 Initialization (初始化)、Configuration (配置) 和 Execution (執(zhí)行),更多請參閱 Gradle 文檔。

在 Initialization (初始化) 階段,Gradle 會決定構(gòu)建中包含哪些項目,并會為每個項目創(chuàng)建 Project實(shí)例。為了決定構(gòu)建中會包含哪些項目,Gradle 首先會尋找 settings.gradle 來決定此次為單項目構(gòu)建還是多項目構(gòu)建。

在 Configuration (配置) 階段,Gradle 會評估構(gòu)建項目中包含的所有構(gòu)建腳本,隨后應(yīng)用插件、使用 DSL 配置構(gòu)建,并在最后注冊 Task,同時惰性注冊它們的輸入。

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

最后,在 Execution (執(zhí)行) 階段,Gradle 會執(zhí)行構(gòu)建所需的 Task 集合。

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

Gradle DSL 支持使用 Groovy 與 Kotlin 腳本編寫構(gòu)建文件。到目前為止,我都在使用 Groovy DSL 腳本來配置此工程的構(gòu)建。您可以在下面看到分別由 Kotlin 和 Groovy 編寫的相同構(gòu)建文件。注意 Kotlin 腳本文件名后綴為 ".kts"。

△ Kotlin 與 Groovy 腳本對比

從 Groovy 遷移到 Kotlin 或其他配置腳本的方法,不會改變您執(zhí)行 Task 的方式。

總結(jié)

以上便是本文的全部內(nèi)容。Gradle 與 Android Gradle Plugin 有許多可以讓您自定義構(gòu)建的功能。在本文中,您已經(jīng)了解了 Gradle Task、構(gòu)建階段、配置 AGP 以及使用 DSL 配置構(gòu)建的基礎(chǔ)知識。

敬請關(guān)注下一篇文章,我們將帶您了解如何在編寫您自己的插件時,使用 AGP 的 Variant API 來擴(kuò)展您的構(gòu)建。

歡迎您 點(diǎn)擊這里 向我們提交反饋,或分享您喜歡的內(nèi)容、發(fā)現(xiàn)的問題。您的反饋對我們非常重要,感謝您的支持!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容