Gradle 与 AGP 构建 API: 配置您的构建文件

2021 年 12 月 21 日 谷歌开发者

欢迎阅读全新的 MAD Skills 系列 GradleAndroid Gradle plugin API 的第一篇文章。我们将在本文中了解 Android 构建系统的工作方式以及 Gradle 的基础知识。


  • Gradle
    https://gradle.org/

  • Android Gradle plugin API
    https://developer.android.google.cn/reference/tools/gradle-api


我们将会从 Gradle 的构建阶段开始,讨论如何使用 AGP (Android Gradle Plugin) 的配置选项自定义您的构建,并讨论如何使您的构建保持高效。如果您更喜欢通过视频了解此内容,请在此处查看: 

△ Gradle 与 AGP 构建 API: 配置您的构建文件

通过了解构建阶段的工作原理及配置 Android Gradle plugin 的配置方法,可以帮您基于项目的需求自定义构建。让我们回到 Android Studio,一起看看构建系统是如何工作的吧。



Gradle 简介


Gradle 是一个通用的自动化构建工具。当然,您可以使用 Gradle 来构建 Android 项目,但实际上您可以使用 Gradle 来构建任何类型的软件。

Gradle 支持单一或多项目构建。如果要将项目配置为使用 Gradle,您需要在项目文件夹中添加 build.gradle 文件。 

在多项目层级结构中,根项目中会包含一个 settings.gradle 文件,其中列出了构建中包含的其他项目。Android 使用多项目构建来帮您模块化应用。 

△ 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 列表

这些 Task 可以接收输入、执行某些操作,并根据执行的操作产生输出。

Android Gradle Plugin 定义了自己的 Task,并且知道构建 Android 项目时,需要以何种顺序执行这些 Task。

Gradle 构建文件由许多不同的部分组成。Gradle 的配置语法被称为 Gradle DSL ,其为开发者定义了配置插件的方式。Gradle 会解析 build.gradle 文件中的 android DSL 块并创建 AGP DSL 对象,例如 ApplicationExtension BuildType

  • Gradle DSL

    https://docs.gradle.org/current/dsl/index.html


典型的 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 如何使用这些信息来创建变体,以及您可以使用哪些其他选项,请参阅 构建文档 : 

https://developer.android.google.cn/studio/build

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 的仓库,以及来自文件系统的本地二进制文件。
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' }


  • Maven
    https://maven.apache.org/

  • Ivy
    http://ant.apache.org/ivy/



构建阶段


Gradle 分三个阶段评估和运行构建,分别是 Initialization (初始化)、Configuration (配置) 和 Execution (执行),更多请参阅 Gradle 文档:

https://docs.gradle.org/current/userguide/build_lifecycle.html


在 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 脚本对比

从 Groovy 迁移到 Kotlin 或其他配置脚本的方法,不会改变您执行 Task 的方式。



总结


以上便是本文的全部内容。 Gradle 与 Android Gradle Plugin 有许多可以让您自定义构建的功能。 在本文中,您已经了解了 Gradle Task、构建阶段、配置 AGP 以及使用 DSL 配置构建的基础知识。


敬请关注下一篇文章,我们将带您了解如何在编写您自己的插件时,使用 AGP 的 Variant API 来扩展您的构建。


您也可以通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!



推荐阅读

如页面未加载,请刷新重试



 点击屏末  | 即刻了解配置 build 更多内容




登录查看更多
0

相关内容

Android(安卓)是一种以 Linux 为基础开发的开放源代码的操作系统,主要应用于便携设备。2005 年,Android 公司被 Google 收购,随后 Google 联合制造商组成开放手机联盟。Android 已从智能手机领域逐渐扩展到平板电脑、智能电视(及机顶盒)、游戏机、物联网、智能手表、车载系统、VR以及PC等领域。
【Manning新书】Kafka实战,272页pdf,Kafka in Action
专知会员服务
58+阅读 · 2022年1月30日
【资源】100+本免费数据科学书
专知会员服务
105+阅读 · 2020年3月17日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
20+阅读 · 2019年11月7日
实战 | 使用 Kotlin Flow 构建数据流 "管道"
谷歌开发者
0+阅读 · 2022年3月30日
Android 基础知识课程助您轻松构建应用
谷歌开发者
0+阅读 · 2022年3月25日
通过基准配置文件改善应用性能
谷歌开发者
0+阅读 · 2022年3月9日
Android Studio 新特性详解
谷歌开发者
0+阅读 · 2022年1月19日
在 Android 12 中构建更现代的应用 Widget
谷歌开发者
0+阅读 · 2022年1月12日
Gradle 与 AGP 构建 API: 进一步完善您的插件!
谷歌开发者
0+阅读 · 2022年1月5日
Gradle 与 AGP 构建 API: 如何编写插件
谷歌开发者
0+阅读 · 2021年12月24日
领英远程开发云架构构建之路
InfoQ
0+阅读 · 2021年12月17日
Hilt 工作原理 | MAD Skills
谷歌开发者
0+阅读 · 2021年10月18日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
国家自然科学基金
1+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
7+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2010年12月31日
Arxiv
21+阅读 · 2021年12月31日
Arxiv
91+阅读 · 2020年2月28日
Arxiv
15+阅读 · 2018年4月5日
VIP会员
相关资讯
实战 | 使用 Kotlin Flow 构建数据流 "管道"
谷歌开发者
0+阅读 · 2022年3月30日
Android 基础知识课程助您轻松构建应用
谷歌开发者
0+阅读 · 2022年3月25日
通过基准配置文件改善应用性能
谷歌开发者
0+阅读 · 2022年3月9日
Android Studio 新特性详解
谷歌开发者
0+阅读 · 2022年1月19日
在 Android 12 中构建更现代的应用 Widget
谷歌开发者
0+阅读 · 2022年1月12日
Gradle 与 AGP 构建 API: 进一步完善您的插件!
谷歌开发者
0+阅读 · 2022年1月5日
Gradle 与 AGP 构建 API: 如何编写插件
谷歌开发者
0+阅读 · 2021年12月24日
领英远程开发云架构构建之路
InfoQ
0+阅读 · 2021年12月17日
Hilt 工作原理 | MAD Skills
谷歌开发者
0+阅读 · 2021年10月18日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
相关基金
国家自然科学基金
1+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
7+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2010年12月31日
Top
微信扫码咨询专知VIP会员