Gradle 是什么?
Gradle 是一个开源的构建自动化工具 ,专门负责把源代码、依赖库、资源文件等"原料",按照你定义的规则,自动编译、打包成最终可运行的应用(如 Android 的 APK)。
核心特性
- 🚀 基于 Groovy/Kotlin DSL: 用脚本语言写配置,比 XML 灵活太多
- 📦 依赖管理: 自动从 Maven 仓库下载第三方库(像 npm 一样)
- 🧩 多模块 / 多项目: 一个工程拆成多个子工程,各自独立构建
- ⚡ 增量构建: 自动判断哪些文件变了,只重编改动的部分(快)
- 🔌 插件生态: Android、Java、Kotlin、Scala、RN 都有官方插件
- 🤖 任务系统: 一切都是"任务"(Task),可以串行/并行/条件执行
历史背景
在 Gradle 出现之前,Android 官方用的是 Ant (2000 年前后出现),配置全靠写 XML,又长又难维护;后来 Google 又推了 Maven,依赖管理变好了,但写自定义构建逻辑依然痛苦。
到了 2012 年左右,Gradle 横空出世,被 Google 选为 Android Studio 的官方构建工具,核心原因就两点:
- 用脚本语言写配置,比 XML 灵活太多
- 天然支持多模块、多项目,对大型工程特别友好
为什么需要它
执行 ./gradlew tasks 时,Gradle 实际在帮你做这些事:
| 旧做法的痛点 | Gradle 的改善 |
|---|---|
手动敲 javac 编译、手动拷贝 jar 包 |
一条命令自动完成所有编译、打包 |
| 依赖库要自己下载、管理版本 | 通过 dependencies { ... } 自动解析、下载 |
| 不同环境(debug/release)配置混乱 | 用 buildTypes 清晰区分 |
| 增量构建靠记忆 | 自动判断哪些文件变了,只重编改动的部分 |
简单说:没有 Gradle,你得手动完成"编译-拷包-签名-打包"这一整套流程;有了它,一行命令搞定。
在 RN Android 项目中的角色
在 React Native 项目里,Gradle 负责打包的是整个 Android 原生壳子:
源代码层 构建层 产物
───────── ───────── ──────────
JS 业务代码 ──── Metro ──> index.bundle
↘
Java/Kotlin 源码 ── Gradle ──> classes.dex
├──> APK(可安装的 app)
资源/图片/布局 ── Gradle ──> res/
↗
第三方原生库 ── Gradle ──> .so / .aar
简单说:JS 部分归 Metro 管,Android 原生壳子归 Gradle 管,两条线最终汇合成 APK。
关键概念速查
| 概念 | 作用 | 例子 |
|---|---|---|
build.gradle |
构建脚本,定义怎么编译 | android/app/build.gradle |
settings.gradle |
工程配置,声明有哪些子模块 | include ':app' |
| Plugin | 扩展能力的插件 | apply plugin: "com.android.application" |
| Task | 一个可执行的工作单元 | assembleDebug、installDebug |
buildTypes |
区分不同环境 | debug / release |
dependencies |
声明依赖的库 | implementation 'com.facebook.react:react-android' |
gradlew |
Gradle Wrapper 启动脚本 | ./gradlew tasks |
gradle-wrapper.properties |
锁 Gradle 版本 | distributionUrl=...gradle-8.3-bin.zip |
./gradlew tasks --no-daemon 在做什么
拆开看:
| 部分 | 含义 |
|---|---|
./gradlew |
项目自带的 Gradle Wrapper 启动脚本,保证所有人用同一份 Gradle 版本 |
tasks |
列出当前项目所有可执行的构建任务 (如 assembleDebug、installDebug) |
--no-daemon |
不启动后台守护进程,每次都冷启动。适合 CI 环境或排查问题时用 |
💡 daemon 是什么 :Gradle 启动 JVM 一次比较慢(几秒到十几秒),daemon 让 Gradle 常驻内存,后续构建复用。开发时默认开 daemon(快),CI 上用
--no-daemon(干净,避免环境干扰)。
类似概念对比
| 工具 | 主要场景 | 与 Gradle 的核心区别 |
|---|---|---|
| Maven | Java 后端为主 | 用 XML 配置,约定优于配置,但灵活度低;没有原生多语言支持 |
| npm/yarn/pnpm | Node.js / RN 的 JS 侧 | 只管 JS 依赖和脚本,不懂 Java/Kotlin 编译;RN 里 JS 走 npm,Android 走 Gradle |
| Bazel | Google 等超大 monorepo | 更快、更严格,但配置复杂,Android 生态里基本被 Gradle 取代 |
| Make / CMake | C/C++ | 历史更老,语法古老,Android 不直接用 |
| Ant | 老 Java 项目 | 纯 XML,基本被 Maven/Gradle 取代 |
一句话记忆
Gradle = Android 界的"Maven 升级版",用脚本语言写配置,专门解决"源代码怎么变成 APK"这件事。RN 项目里,JS 走 Metro,Android 走 Gradle,各管一摊,最后合包成 APK。