未来趋势:构建系统发展方向、Bazel 集成、模块化趋势

各位同学,今天我们来聊聊 Android 构建系统的未来。说实话,这个话题我每年都在关注,因为变化实在太快了。从早期的 Ant 到 Gradle,再到现在的 Bazel 和模块化浪潮,每一步都踩在痛点上前进。我个人习惯是每半年梳理一次技术趋势,不然真的容易掉队。

嗯,我们先从整体趋势说起,再深入 Bazel 和模块化这两个核心方向。

构建系统的三大发展方向

我总结了一下,未来构建系统会朝着三个方向演进:

  • 速度优先:增量编译、远程缓存、分布式构建会成为标配。我在项目中遇到过一个大项目,全量构建要 40 分钟,后来靠远程缓存压缩到 8 分钟,团队幸福感直线上升。
  • 可复现性:构建环境必须一致,避免“在我机器上能跑”的尴尬。Bazel 在这方面做得非常极致,它连工具链版本都锁死。
  • 跨语言/跨平台:一个项目里混着 Kotlin、C++、Rust 越来越常见,构建系统必须能统一调度。

核心观点:未来的构建系统不再是“编译工具”,而是“工程编排平台”。它要管理依赖、缓存、测试、部署,甚至代码分析。

Bazel 集成:为什么它值得关注?

Bazel 是 Google 内部使用的构建工具,现在开源了。说白了,它解决的是 Gradle 在超大项目上的性能瓶颈。我去年帮一个团队迁移 Bazel,效果确实惊艳。

先看一个简单的 Bazel 构建文件示例:

# BUILD 文件
load("@rules_java//java:defs.bzl", "java_library")

java_library(
    name = "my_lib",
    srcs = glob(["src/main/java/**/*.java"]),
    deps = [
        "//third_party:guava",
        "@maven//:com_google_inject_guice",
    ],
)

你看,它把依赖声明得非常清晰。每个目标(target)都是独立的,Bazel 会精确计算哪些需要重新编译。我曾经在 Gradle 里改了一行代码,结果触发了整个模块的重编,但在 Bazel 里只会重编受影响的部分。

Bazel 的核心优势

特性 说明 我的体验
增量编译 只重新编译变更的文件及其依赖 比 Gradle 快 3-5 倍,尤其适合大项目
远程缓存 构建产物可共享,避免重复编译 团队 CI 时间从 30 分钟降到 6 分钟
沙箱执行 每个动作在隔离环境运行,保证可复现 再也不用担心“本地能跑,CI 挂了”
多语言支持 Java、Kotlin、C++、Python 等统一管理 我们混合 Kotlin + Rust 的项目,Bazel 一把梭

小提示:Bazel 的学习曲线比 Gradle 陡,建议先从非核心模块试点。我刚开始迁移时,光写 BUILD 文件就花了两周,但后面收益巨大。

模块化趋势:从“大锅饭”到“小份菜”

模块化这个词大家听得多了,但未来几年会彻底改变构建方式。你想想看,以前一个 app 就是一个大模块,所有代码挤在一起。现在呢?每个功能都是一个独立模块,甚至可以独立编译、独立测试。

我参与过一个项目,把 20 万行代码拆成 30 多个模块。刚开始很痛苦,但后来每个团队只维护自己的模块,构建时间从 15 分钟降到 3 分钟。这就是模块化的力量。

模块化的三个层次

  1. 代码模块化:按功能拆分,每个模块有清晰的 API 边界。比如登录模块、支付模块、首页模块。
  2. 构建模块化:每个模块有独立的构建配置,可以单独编译、测试。Gradle 的 composite build 和 Bazel 的 multi-target 都是这个思路。
  3. 运行时模块化:通过动态特性模块(如 Android App Bundle)按需下载,减少安装包体积。

避坑指南:我曾经把一个模块拆得太细,结果模块间依赖关系乱成一团。建议先按业务边界拆,不要过早优化。模块数量控制在 20-30 个比较合理。

模块化与 Bazel 的结合

Bazel 天然适合模块化架构。它的依赖图是精确的,每个模块可以独立构建和缓存。我画了一张图,展示模块化项目在 Bazel 下的构建流程:

Bazel 模块化构建流程 登录模块 :login 支付模块 :payment 首页模块 :home 更多模块... :more Bazel 依赖图(精确计算) 登录 支付 首页 更多 远程缓存 + 增量编译 只编译变更模块,未变模块从缓存加载 最终产物(APK / AAB)

你看,每个模块独立编译,Bazel 通过依赖图精确计算哪些需要重编。未改动的模块直接从缓存拿结果。这就是为什么模块化 + Bazel 能大幅提升构建速度。

未来趋势总结

说了这么多,我给大家划几个重点:

  • Bazel 会越来越流行,尤其在大厂和大型项目中。Google 内部已经全面使用,外部也有 Uber、Twitter 等公司在跟进。
  • 模块化是必由之路,但不要为了模块化而模块化。我见过有人把工具类也拆成模块,结果得不偿失。
  • 构建系统正在“云化”,远程执行和缓存会成为标配。以后可能本地只需要写代码,编译全在云端完成。

我的建议:如果你现在还在用 Gradle,可以开始研究 Bazel 了。先从一个小模块试点,感受一下它的威力。模块化方面,先梳理业务边界,再动手拆分。记住,构建系统的终极目标是让开发者专注于代码,而不是等待编译。

嗯,今天就聊到这里。构建系统的世界变化很快,但核心逻辑没变:更快、更稳、更可复现。希望这些内容对你有帮助。


公众号:蓝海资料掘金营,微信deep3321