一、Gradle概述
Gradle简介
在Android开发的世界里,Gradle是构建和自动化项目生命周期的核心工具。它不仅简化了项目的配置、依赖管理及构建过程,而且极大地提高了开发效率与协作体验。Gradle是一个开源的构建自动化系统,基于Groovy或Kotlin DSL(领域特定语言),并采用灵活的插件化架构设计。对于Android开发而言,Google为其定制了一套专门的Android Gradle插件,就是我们常听说的AGP,使得我们可以方便地进行模块化开发、多版本构建、资源混淆等一系列操作。
为什么选择Gradle?
- 声明式构建模型:Gradle采用声明式的构建脚本,开发者只需描述项目的结构和依赖关系,Gradle会自动处理构建细节。
- 插件化架构:丰富的官方和第三方插件库支持各种语言和框架(如Java、Kotlin、Android等),极大地简化了复杂项目的构建流程。
- 智能依赖管理:Gradle内置高级依赖解析机制,可以有效解决版本冲突问题,并利用缓存加速依赖下载。
- 高性能并发执行:Gradle通过多任务并行执行优化构建速度,尤其适合大型或模块化的项目。
二、Gradle环境搭建
2.1 安装Gradle
访问Gradle官方网站获取最新稳定版的安装包。通常有两种安装方式:
-
全局安装:直接下载并解压到指定目录,然后配置系统环境变量
GRADLE_HOME
指向解压后的目录路径,并将bin
目录添加至PATH环境变量。 -
使用Gradle Wrapper:在项目中生成Wrapper文件,这样每个项目都拥有独立且特定版本的Gradle环境。在项目根目录下运行命令
gradle wrapper --gradle-version <版本号>
来生成wrapper相关文件,之后可通过运行./gradlew
(Unix-like系统) 或gradlew.bat
(Windows系统) 执行构建任务。在安卓开发中,通常我们不需要关心下载和配置Gradle。Android Studio新建项目时会自动通过使用Gradle Wrapper处理Gradle的下载和配置。
2.2 验证安装
成功安装后,在终端或命令行窗口中输入 gradle -v
或 ./gradlew -v
(如果使用Wrapper)来查看Gradle版本及相关信息。
2.3 Gradle Wrapper
Gradle Wrapper 是一个用于自动化管理 Gradle 版本的工具,它可以帮助开发人员避免手动下载和配置 Gradle 的繁琐过程。通过使用 Gradle Wrapper,开发人员可以轻松地在项目中使用特定版本的 Gradle,并确保团队中所有成员使用相同版本的构建工具。
Gradle Wrapper 的工作原理是利用在项目的根目录下的一些文件,包括一个可执行的脚本文件(例如 gradlew
)和一个配置文件(例如 gradle-wrapper.properties
)。通过运行脚本文件(例如在命令行中输入 ./gradlew
),Gradle Wrapper 会自动检查所需的 Gradle 版本,并在必要时从配置的源下载该版本。下载完成后,Gradle Wrapper 会自动配置环境变量,以便在项目中使用该版本的 Gradle。
Gradle Wrapper 的优点包括:
- 自动化管理:Gradle Wrapper 自动处理 Gradle 的下载和配置,开发人员无需手动干预。
- 版本控制:通过使用 Gradle Wrapper,开发人员可以轻松地指定项目所需的 Gradle 版本,并确保团队中所有成员使用相同版本。
- 简化构建脚本:由于 Gradle Wrapper 自动处理 Gradle 的版本,开发人员无需在构建脚本中指定特定版本的 Gradle。
- 避免潜在的版本冲突:使用 Gradle Wrapper 可以避免因不同项目使用不同版本的 Gradle 而导致的潜在冲突。
要使用 Gradle Wrapper,开发人员需要在项目的根目录下执行一些命令来生成所需的文件。然后,开发人员可以在项目中使用特定的 Gradle 版本,并利用 Gradle Wrapper 的优点来简化构建过程。
**三、**搭建第一个Gradle Android项目
**3.1 **创建项目
-
在新建项目时,Android Studio会自动应用Gradle构建系统。填入项目名称、包名等信息后,IDE将生成包含
build.gradle
(全局脚本)及各模块下的build.gradle
文件的基本项目结构。weiwei@weiweideMacBook-Pro Test1 % tree -I 'src' . ├── app │ ├── build.gradle │ ├── libs │ └── proguard-rules.pro ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle
可以看到项目根目录存在一个build.gradle和一个setting.gradle,app模块下有一个build.gradle。
下面结合注释了解一下这几个文件
**3.2 **解析项目中的.gradle文件
1.setting.gradle
//setting.gradle
include ':app' //app模块将参与构建
rootProject.name = "My Application"//根项目名称,通常跟项目根目录文件夹一样的名字,也可以修改
可以看到仅有两行代码,此时我们新建一个module
include ':app'
rootProject.name = "My Application"
include ':mylibrary'//mylibrary模块将参与构建
可以看到sync之后自动增加了一行
settings.gradle(.kts)`文件作用如下
-
确定哪些项目将参与构建。
-
初始化各个项目实例,并为每个项目创建一个对应的
Project
对象。根目录下的
build.gradle
文件定义了项目的全局属性,如构建脚本版本、子模块等。
AS目前新建项目的setting.gradle有些变化,在下边讲解新版本build.gradle的变化时一起讲解
2.项目根目录下的 build.gradle
// 项目根目录下的 build.gradle 文件片段
buildscript { //指定了构建脚本所需的插件和其所在仓库
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.0' // Android Gradle插件版本
}
}
//应用于项目及其所有子项目所依赖的库
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
可以看到项目根目录下的 build.gradle指定了gradle插件和其所在仓库以及应用于项目及其所有子项目所依赖的库
2.模块级别的 build.gradle
// 这是用于构建Android应用程序(APK)的插件,提供了编译、打包和发布应用所需的全部功能。
apply plugin: 'com.android.application'
//AGPandroid扩展
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
//Gradle的依赖管理机制允许我们方便地声明项目所需的库,它能够处理传递依赖、冲突解决以及从Maven仓库获取依赖。
//(后面会对这点会再做详细介绍)
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
}
模块级别的build.gradle
文件则用于配置具体的模块构建规则,包括编译SDK版本、依赖库、构建类型等等。
目前AS 新建项目根目录build.gradle和setting.gradle跟老项目有一点变化,如下:
build.gradle
//通用配置,指定所有模块使用该插件的版本 ('apply false' 不参与当前脚本构建)
plugins {
id 'com.android.application' version '7.2.0' apply false
id 'com.android.library' version '7.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Setting.gradle
//gradle插件仓库
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
//项目及其子项目的依赖仓库
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "Test1"
include ':app'
include ':mylibrary'
可以看到相比旧版把gradle插件仓库和项目依赖仓库放到了setting.gradle,同时在根目录build.gradle指定了使用插件的版本。变化不大,不影响使用。
以上介绍了gradle的相关概念和由gradle构建的的项目的项目结构,并且简单介绍了各脚本文件的作用。可以看到gradle文件采用一种特殊的DSL,是由groovy这种语音来构建的。下一篇我们介绍一下groovy的基础语法和DSL。