歡迎閱讀全新的 MAD Skills 系列 之 Gradle 及 Android Gradle plugin API 的第一篇文章。我們將在本文中了解 Android 構(gòu)建系統(tǒng)的工作方式以及 Gradle 的基礎(chǔ)知識(shí)。
我們將會(huì)從 Gradle 的構(gòu)建階段開始另锋,討論如何使用 AGP (Android Gradle Plugin) 的配置選項(xiàng)自定義您的構(gòu)建极祸,并討論如何使您的構(gòu)建保持高效观谦。如果您更喜歡通過視頻了解此內(nèi)容顷窒,請(qǐng)?jiān)?此處 查看谢床。
通過了解構(gòu)建階段的工作原理及配置 Android Gradle plugin 的配置方法性含,可以幫您基于項(xiàng)目的需求自定義構(gòu)建洲赵。讓我們回到 Android Studio,一起看看構(gòu)建系統(tǒng)是如何工作的吧。
Gradle 簡介
Gradle 是一個(gè)通用的自動(dòng)化構(gòu)建工具叠萍。當(dāng)然芝发,您可以使用 Gradle 來構(gòu)建 Android 項(xiàng)目,但實(shí)際上您可以使用 Gradle 來構(gòu)建任何類型的軟件苛谷。
Gradle 支持單一或多項(xiàng)目構(gòu)建辅鲸。如果要將項(xiàng)目配置為使用 Gradle,您需要在項(xiàng)目文件夾中添加 build.gradle 文件腹殿。
在多項(xiàng)目層級(jí)結(jié)構(gòu)中独悴,根項(xiàng)目中會(huì)包含一個(gè) settings.gradle 文件,其中列出了構(gòu)建中包含的其他項(xiàng)目锣尉。Android 使用多項(xiàng)目構(gòu)建來幫您模塊化應(yīng)用刻炒。
由于插件的存在,Gradle 可以處理不同類型的項(xiàng)目自沧,比如 Android 或 Java坟奥。這些插件會(huì)包含預(yù)定義的功能,用于配置和構(gòu)建特定類型的項(xiàng)目暂幼。
例如筏勒,為了構(gòu)建 Android 項(xiàng)目,您需要使用 Android Gradle 插件配置您的 Gradle 構(gòu)建文件旺嬉。無論當(dāng)前的 Android 項(xiàng)目是應(yīng)用還是依賴庫管行,Android Gradle 插件都知道如何對(duì)其進(jìn)行構(gòu)建和打包。
Task (任務(wù))
Gradle 的構(gòu)建流程圍繞名為 Task (任務(wù)) 的工作單元展開邪媳。您可以通過終端查看 Task 列表捐顷,或通過啟用 Android Studio Gradle 面板中的 Task 列表來查看任務(wù)。
這些 Task 可以接收輸入雨效、執(zhí)行某些操作迅涮,并根據(jù)執(zhí)行的操作產(chǎn)生輸出。
Android Gradle Plugin 定義了自己的 Task徽龟,并且知道構(gòu)建 Android 項(xiàng)目時(shí)叮姑,需要以何種順序執(zhí)行這些 Task。
Gradle 構(gòu)建文件由許多不同的部分組成据悔。Gradle 的配置語法被稱為 Gradle DSL传透,其為開發(fā)者定義了配置插件的方式。Gradle 會(huì)解析 build.gradl
e 文件中的 android DSL 塊并創(chuàng)建 AGP DSL 對(duì)象极颓,例如 ApplicationExtension
和 BuildType
朱盐。
典型的 Android 項(xiàng)目會(huì)包含一個(gè)頂層 Gradle 構(gòu)建文件。Android 項(xiàng)目中的每個(gè)模塊又分別有一個(gè) Gradle 構(gòu)建文件菠隆。在示例項(xiàng)目中兵琳,我僅有一個(gè)應(yīng)用模塊狂秘。
在模塊層的 build.gradle
文件中,我需要聲明和應(yīng)用構(gòu)建項(xiàng)目所需的插件躯肌。為了讓 Gradle 知道我正在構(gòu)建 Android 項(xiàng)目者春,我需要應(yīng)用 com.android.application
或 com.android.library
插件。這兩個(gè)插件分別定義了如何配置和構(gòu)建 Android 應(yīng)用和依賴庫羡榴。在本例中碧查,我要構(gòu)建的是 Android 應(yīng)用項(xià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)建時(shí)應(yīng)用于 Task卦方。
想要配置 Android Gradle Plugin羊瘩,您需要使用 android 塊。在該代碼塊中盼砍,您可以為不同的構(gòu)建類型 (如 debug 或 release) 定義 SDK 版本尘吗、工具版本、應(yīng)用詳情及其它一些配置浇坐。如需了解更多有關(guān) gradle 如何使用這些信息來創(chuàng)建變體睬捶,以及您可以使用哪些其他選項(xiàng),請(qǐ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 的依賴管理支持兼容 Maven 與 Ivy 的倉庫,以及來自文件系統(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 分三個(gè)階段評(píng)估和運(yùn)行構(gòu)建介劫,分別是 Initialization (初始化)、Configuration (配置) 和 Execution (執(zhí)行)案淋,更多請(qǐng)參閱 Gradle 文檔座韵。
在 Initialization (初始化) 階段,Gradle 會(huì)決定構(gòu)建中包含哪些項(xiàng)目踢京,并會(huì)為每個(gè)項(xiàng)目創(chuàng)建 Project實(shí)例誉碴。為了決定構(gòu)建中會(huì)包含哪些項(xiàng)目,Gradle 首先會(huì)尋找 settings.gradle 來決定此次為單項(xiàng)目構(gòu)建還是多項(xiàng)目構(gòu)建漱挚。
在 Configuration (配置) 階段翔烁,Gradle 會(huì)評(píng)估構(gòu)建項(xiàng)目中包含的所有構(gòu)建腳本,隨后應(yīng)用插件旨涝、使用 DSL 配置構(gòu)建蹬屹,并在最后注冊(cè) Task侣背,同時(shí)惰性注冊(cè)它們的輸入。
需要注意的是慨默,無論您請(qǐng)求執(zhí)行哪個(gè) Task贩耐,配置階段都會(huì)執(zhí)行。為了保持您的構(gòu)建簡潔高效厦取,請(qǐng)避免在配置階段執(zhí)行任何耗時(shí)操作潮太。
最后,在 Execution (執(zhí)行) 階段虾攻,Gradle 會(huì)執(zhí)行構(gòu)建所需的 Task 集合铡买。
下篇文章中,在編寫我們自己的插件時(shí)霎箍,我們將深入剖析這些階段奇钞。
Gradle DSL 支持使用 Groovy 與 Kotlin 腳本編寫構(gòu)建文件。到目前為止漂坏,我都在使用 Groovy DSL 腳本來配置此工程的構(gòu)建景埃。您可以在下面看到分別由 Kotlin 和 Groovy 編寫的相同構(gòu)建文件。注意 Kotlin 腳本文件名后綴為 ".kts"顶别。
從 Groovy 遷移到 Kotlin 或其他配置腳本的方法谷徙,不會(huì)改變您執(zhí)行 Task 的方式。
總結(jié)
以上便是本文的全部內(nèi)容驯绎。Gradle 與 Android Gradle Plugin 有許多可以讓您自定義構(gòu)建的功能完慧。在本文中,您已經(jīng)了解了 Gradle Task条篷、構(gòu)建階段骗随、配置 AGP 以及使用 DSL 配置構(gòu)建的基礎(chǔ)知識(shí)。
敬請(qǐng)關(guān)注下一篇文章赴叹,我們將帶您了解如何在編寫您自己的插件時(shí)鸿染,使用 AGP 的 Variant API 來擴(kuò)展您的構(gòu)建。
歡迎您 點(diǎn)擊這里 向我們提交反饋乞巧,或分享您喜歡的內(nèi)容涨椒、發(fā)現(xiàn)的問題。您的反饋對(duì)我們非常重要绽媒,感謝您的支持蚕冬!