一、构建系统概览:Android构建系统发展史
做Android开发这么多年,我见过不少新人一上来就敲 ./gradlew assembleDebug,然后等着APK出来。至于背后发生了什么,很少有人关心。但说实话,构建系统这东西,你越早搞懂,后面踩的坑就越少。
今天我们就从源头开始,把Android构建系统的来龙去脉捋一遍。
1.1 从Make到Ant,再到Gradle
Android构建系统最早用的是Make。那时候Android源码还在AOSP里,整个系统用Makefile组织。你想想看,一个几百万行的项目,全靠Make来管理依赖和编译顺序——嗯,维护起来确实够呛。
后来Google推出了Ant,配合ADT插件在Eclipse里用。Ant的好处是跨平台,写起来比Makefile友好一些。但我个人觉得,Ant最大的问题是没有依赖管理。你要手动下载jar包放到libs目录,版本冲突全靠人工排查。我记得有一次项目里引了三个不同版本的support包,编译没问题,运行直接崩溃——查了两天才发现是版本不一致。
再后来,Gradle来了。2013年Google I/O大会上,官方正式宣布Gradle成为Android的默认构建工具。为什么选Gradle?说白了,它解决了两个核心痛点:
- 依赖管理:Maven/Ivy仓库,一行代码搞定依赖
- 可编程性:基于Groovy/Kotlin DSL,构建逻辑就是代码
到现在,Gradle + Android Gradle Plugin(AGP)已经是业界标准。Kotlin DSL也逐渐取代了Groovy,写起来更安全、更现代。
1.2 核心概念:Task、Plugin、Build Variant
这三个概念,是理解Gradle构建的钥匙。我一个个说。
Task(任务)
Task是Gradle里最小的执行单元。每个Task做一件具体的事:编译Java文件、打包资源、签名APK……你可以把Task想象成流水线上的一个工位。
举个例子,你执行 ./gradlew assembleDebug,实际上触发了一串Task:
:preBuild
:mergeDebugResources
:compileDebugJavaWithJavac
:dexBuilderDebug
:packageDebug
:assembleDebug
每个Task都有输入和输出。如果输入没变,Gradle会跳过这个Task——这就是增量构建。我在项目中遇到过,第一次构建花了3分钟,第二次只用了20秒,就是因为大部分Task被跳过了。
Plugin(插件)
Plugin就是一组Task的集合。Android Gradle Plugin(com.android.application)帮你注册了所有构建APK需要的Task。你不需要自己写编译、打包、签名的逻辑,插件全包了。
当然,你也可以自己写插件。比如统一处理所有图片资源、自动生成版本号等。我建议团队里如果有重复性的构建工作,写成插件是最优雅的方式。
Build Variant(构建变体)
Build Variant = Build Type + Product Flavor。这个设计真的很巧妙。
- Build Type:debug / release,控制是否可调试、是否混淆
- Product Flavor:免费版 / 付费版 / 国内版 / 海外版,控制不同的功能集
组合起来,你能得到多个变体:freeDebug、freeRelease、paidDebug、paidRelease……每个变体都有自己的APK。我在做海外市场项目时,用这个特性同时维护了Google Play版和华为市场版,代码复用率超过95%。
1.3 构建流程全景图
下面这张图,是我自己总结的Android构建全流程。你盯着看三分钟,后面学细节时会轻松很多。
整个流程可以概括为:资源 → 源码 → DEX → 打包 → 签名 → 对齐 → 安装。每一步都有对应的Task和工具链。
核心要点:构建不是一次性的。你改一行代码,Gradle只会重新编译受影响的部分。这就是增量构建的威力。
1.4 避坑指南
我曾经在一个老项目里遇到过,每次构建都要跑5分钟,改个字符串都要等半天。后来发现是没有开启构建缓存。在 gradle.properties 里加上一行:
org.gradle.caching=true
构建时间直接砍半。嗯,有时候问题就这么简单。
小技巧:用 ./gradlew build --scan 可以生成构建报告,哪个Task慢一目了然。
注意:不要随意修改AGP版本。AGP和Gradle版本有严格的对应关系,升错了会导致构建失败。建议参考官方兼容性表格。
1.5 小结
这一章我们聊了Android构建系统的演变:从Make到Ant再到Gradle。核心概念就三个——Task、Plugin、Build Variant。最后用一张全景图把构建流程串了起来。
说白了,构建系统就是一套自动化流水线。你理解了每个环节做什么,后面遇到问题就知道从哪里下手。
下一章,我们会深入Gradle的构建脚本,看看 build.gradle 里每一行代码到底在干什么。
公众号:蓝海资料掘金营,微信deep3321