1. Gradle基础:Gradle简介、安装配置、构建脚本基本结构

做Android和Java项目这么多年,我越来越觉得Gradle是个绕不开的工具。说实话,刚开始接触的时候我也觉得它挺复杂——又是Groovy又是DSL,跟Maven的XML完全两个画风。但真正上手用了之后,我发现这东西的灵活性和性能潜力,是别的构建工具很难比的。

这一章,我就带你从零开始,把Gradle的来龙去脉、安装配置、以及最核心的build.gradle脚本结构讲清楚。你别看它基础,很多性能问题恰恰是基础没打好导致的——嗯,我踩过的坑还真不少。

第1章 · Gradle基础知识框架 Gradle构建系统 核心概念与原理 安装与配置 构建脚本结构 Project · Task · Plugin 生命周期(配置→执行) JDK 11+ · SDKMAN wrapper · 环境变量 build.gradle · settings dependencies · plugins 基础不牢,优化无从下手 理解底层原理才能做性能调优 合并为效率 渲染管线加速

1.1 Gradle到底是什么?

Gradle是一种基于Groovy(或Kotlin)DSL的自动化构建工具。说白了,它就是个「编译+打包+测试+部署」的流水线管家。跟Maven和Ant比,Gradle最大的优势在于——它基于有向无环图(DAG)来执行任务,天然支持增量构建和并行执行。

我记得刚转到一个大项目组时,他们的Gradle构建要跑8分钟。后来我改了依赖配置、启用了缓存和并行,硬是压到了2分钟以内。为什么能差这么多?因为很多人只把它当脚本用,没理解它背后的增量机制。

Gradle的关键特性:

  • 增量构建——只重新编译有变动的部分,不是全量重做
  • 依赖管理——支持Maven/Ivy仓库,传递依赖自动解析
  • 多项目构建——一个settings.gradle管理几十个模块很常见
  • 构建缓存——跨机器共享构建产物,持续集成效率翻倍
  • 插件生态——从Java到Android到C++,基本上什么场景都能覆盖

1.2 安装配置——别在这种小事上翻车

安装Gradle其实很简单,但我在给团队搭环境时见过太多坑了——比如JDK版本不兼容、环境变量配错、wrapper没设置好。我个人的习惯是:永远用Gradle Wrapper,不要在本地装全局Gradle。为啥?因为团队统一版本,谁拉代码都能直接./gradlew build,不会出现「在我的机器上能跑」的尴尬。

1.2.1 前置条件

确保你装了JDK 11或更高版本。你可以用java -version检查。曾经有个同事装了JDK 8,Gradle 8.x根本不认——白折腾了半天。

1.2.2 安装方式对比

方式适用场景我推荐?
SDKMAN个人开发机,需要多版本切换✅ 非常推荐
Homebrew / 包管理器macOS / Linux 用户✅ 方便
手动解压+环境变量无包管理器的环境⚠️ 容易配错Path
Gradle Wrapper(首选)所有项目✅ 永远首选

小技巧: 用SDKMAN安装Gradle只需一行命令:sdk install gradle 8.5。切换版本也简单:sdk use gradle 7.6。强烈推荐。

1.2.3 配置Gradle Wrapper

在已有项目中执行:

gradle wrapper --gradle-version 8.5

这会在项目根目录生成gradlew(Linux/Mac)、gradlew.bat(Windows)以及gradle/wrapper/gradle-wrapper.properties。以后所有人都用./gradlew,版本锁死,不会踩坑。

警告: 如果你修改了gradle-wrapper.properties中的distributionUrl,记得提交到Git,否则别人拉代码还是旧版本。我就曾经忘记提交,CI上跑出奇怪的编译错误——排查了半小时才发现是wrapper版本不一致。

1.3 构建脚本(build.gradle)基本结构

Gradle的构建脚本本质上就是一段Groovy或Kotlin代码。每个项目都有一个build.gradle(或build.gradle.kts),里面定义了项目怎么编译、依赖什么、打什么包。下面这个例子是一个最普通的Java项目脚本。

plugins {
    id 'java'
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.guava:guava:31.1-jre'
    testImplementation 'junit:junit:4.13.2'
}

application {
    mainClass = 'com.example.App'
}

1.3.1 核心要素拆解

  • plugins {} —— 声明要用的插件。插件就是Gradle的扩展包,比如java插件会自动添加编译、测试、打包任务。
  • repositories {} —— 依赖从哪里下载。企业环境一般会用私有Nexus或Artifactory。
  • dependencies {} —— 声明依赖坐标。注意作用域:implementation(编译+运行时,但不暴露给消费者)、api(暴露给依赖方)、testImplementation(仅测试用)。
  • application {} —— 应用程序插件特有配置,指定入口类。

一个我踩过的坑: 刚用Gradle时,我把所有依赖全写成compile(旧版API),结果依赖传递混乱,第三方库把一堆不需要的jar都带进来了。后来改成implementation + api 严格区分,构建时间直接降了30%。

1.3.2 settings.gradle —— 多项目的“总开关”

如果你的项目有多个子模块(比如Android的app、lib、common),就需要settings.gradle来声明:

rootProject.name = 'my-app'
include 'app'
include 'library'
include 'common'

每个子模块目录下都要有一个build.gradle。根项目的build.gradle里可以放所有子模块共享的配置(比如仓库地址、插件版本)。

1.3.3 任务(Task)—— Gradle的执行单元

Gradle里一切可执行的动作都是Task。比如compileJava、test、jar都是内置Task。你也可以自定义:

task hello {
    doLast {
        println 'Hello, Gradle!'
    }
}

运行gradlew hello就能看到输出。你想想看——整个构建过程就是一连串Task的有向无环图,Gradle只执行有变更或依赖变更的Task,这就是它快的根本原因。

本节小结

这一章我们讲了Gradle的定位(自动化构建工具)、安装配置(推荐Wrapper + SDKMAN)、以及build.gradle的基本结构(plugins → repositories → dependencies → tasks)。这些基础看似简单,但我在做性能优化时发现——大部分构建慢的根因,其实都出在对这些基础元素的理解偏差上。

一句话总结: Gradle不是黑魔法,它就是一个基于Task的DAG执行引擎。你把它当黑盒用,它就会慢给你看;你理解了它的生命周期和增量策略,优化就是水到渠成的事。