【问题标题】:What is the added advantage of using Bazel over Gradle? [closed]与 Gradle 相比,使用 Bazel 的额外优势是什么? [关闭]
【发布时间】:2025-11-28 15:20:05
【问题描述】:

我在阅读有关 Android Testing Samples 项目的信息,并注意到名为 Bazel 的“”构建工具正在用于构建 Android 项目:

实验性 Bazel 支持

其中一些示例可以在 Linux 上使用 Bazel 构建。这些样本包含一个BUILD.bazel 文件,类似于build.gradle 文件。外部依赖项在* WORKSPACE 文件中定义。

这是实验性功能。要运行测试,请按照 Bazel 网站上的说明安装最新版本的 Bazel(0.12.0 或更高版本)。

那么,

  • 与现有 Gradle 相比,使用 Bazel 的额外优势是什么?
  • 拥有两个适用于 Android 的构建工具真的很好吗?
  • 这是否意味着 Android 开发人员将来可能需要学习这个新的构建工具?

更新 #1: 更新了来自 farhana 的已接受答案,感谢 Jin 提供有关 google 构建系统的详细信息。

更新 #2: 使用谷歌代码实验室更新 bazel android introduction

【问题讨论】:

  • 是的,正在寻找相同的。仅供参考 - *.com/questions/29245787/…
  • Google 是否有将 Android 开发从 Gradle 迁移到 Bazel 的路线图?
  • @shizhen 没有,但是有codelabs给你试试看。
  • Android Gradle 插件。个人期待它在未来成为Android Bazel Plugin

标签: android gradle android-gradle-plugin android-testing bazel


【解决方案1】:

我是该存储库中 Bazel 支持的作者,我在 Bazel Android rules 团队工作。 farhana 已经写了一个了不起的答案,但我只想补充几点:

  • Bazel 是 Google 内部使用的构建系统,这意味着它与用于构建 YouTube、Gmail 和照片等 Google 应用的构建系统相同。
  • 其中一些 Google 应用程序非常庞大,Bazel 需要很长时间才能在本地构建它们。因此,在 Bazel 中有一个 remote execution feature(在 remote cache 之上,就像 Gradle 一样,但更细粒度的 IIUC)允许您将构建操作分散到远程执行器场。 Bazel 有一个静态和封闭的动作依赖图,旨在完全可重现,每个动作都有一组完全声明的输入、输出、环境变量、命令行,以及 Bazel 中关于配置、工具链和主机/目标的额外知识/执行平台。借助此图表,Bazel 可以安全地将操作分包给远程工作人员,从而实现非常大 度的并行性。我之前在Google Cloud Remote Build Execution 上成功构建了具有 500-800 个并行作业的 Tensorflow Android 应用。
  • 自动测试发现。 Bazel 的静态图还对测试、二进制文件/库和数据之间的依赖关系进行编码,因此对源文件进行更改会自动使依赖它们的所有测试无效。这告诉 Bazel 重新运行测试,如果不需要再次运行,则跳过缓存的测试。是的,您也可以对测试使用远程执行,因此您可以同时运行数百到数千个测试。
  • Bazel 可以build many languages:C++、Go、Java、Scala、Rust,甚至是 Haskell。它还可以构建 iOS 和 Angular/TypeScript/JavaScript 等客户端。这意味着您不需要像 CMake 这样的单独工具来build your NDK and C++ code。您可以使用相同的构建工具来构建前端和后端,并一起运行集成测试。
  • Bazel 有一个名为mobile-install 的内置命令,它允许快速和迭代地开发Android 应用程序。它构建您的应用程序,分片本地库、dexes 和资源文件,并且仅将更改的分片推送到设备以减少构建和部署时间。 Read more about it here

拥有两个适用于 Android 的构建工具真的很好吗?

不仅仅是两个:Buck & Pants 是另外两个流行的 Android 构建系统。每个构建系统都有其优点和缺点,并且被设计和实施以解决一组特定的需求。例如,Bazel(及其周围的工具生态系统)诞生于 Google 巨大的 monorepo,因此它很好地解决了可扩展性问题。

IMO 可以选择尝试不同的方法,这是一件好事。

这是否意味着 Android 开发者将来可能需要学习这种新的构建工具?

Bazel 是开源的,并通过Bazel plugin 在 Android Studio 中提供支持。如果你觉得它看起来很有趣,feel free to try it out!我们仍处于调整 Android 规则以在开源世界中工作的早期阶段,因此预计某些功能目前正在开发中。

【讨论】:

  • @MarkHan 准备好了 :-) github.com/bazelbuild/rules_jvm_external
  • Bazel 是否支持我们习惯从 Maven Central 使用的所有 android 库?
  • 是的。您可以使用 rules_jvm_external 并设置要从中查找的存储库,例如 maven.google.com 和 Maven Central。
最近更新 更多