Android 与Gradle相比,使用Bazel的附加优势是什么?

Android 与Gradle相比,使用Bazel的附加优势是什么?,android,gradle,android-gradle-plugin,android-testing,bazel,Android,Gradle,Android Gradle Plugin,Android Testing,Bazel,我在阅读有关该项目的信息时,注意到一个名为Bazel的“新建”构建工具正在用于构建Android项目: 实验支撑 其中一些示例可以在Linux上使用Bazel构建。这些示例包含一个BUILD.bazel文件,它类似于BUILD.gradle文件。外部依赖项在顶级工作区文件中定义 这是实验特性。要运行测试,请按照Bazel网站上的说明安装最新版本的Bazel(0.12.0或更高版本) 那么 与现有Gradle相比,使用Bazel的附加优势是什么 有两个Android构建工具真的好吗 这是否意味着

我在阅读有关该项目的信息时,注意到一个名为Bazel的“新建”构建工具正在用于构建Android项目:

实验支撑 其中一些示例可以在Linux上使用Bazel构建。这些示例包含一个
BUILD.bazel
文件,它类似于
BUILD.gradle
文件。外部依赖项在顶级工作区文件中定义

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

那么

  • 与现有Gradle相比,使用Bazel的附加优势是什么
  • 有两个Android构建工具真的好吗
  • 这是否意味着Android开发者将来可能需要学习这个新的构建工具

更新#1:更新了来自并感谢的已接受答案,以获得有关谷歌构建系统的详细信息


更新#2:用谷歌代码实验室更新。

Bazel是谷歌内部构建系统Blaze的一个子集。因此,Bazel已经发展到解决一个非常大的问题,这在某种程度上(但可能并非完全)是谷歌独有的:

  • Bazel的配置文件比Gradle的要结构化得多, 让Bazel确切了解每个动作的作用。这允许 以获得更多的平行性和更好的再现性
Bazel生成文件

Bazel使用两个配置文件进行操作:
BUILD
WORKSPACE

构建文件的存在告诉Bazel它正在查看一个代码包 — 此代码包包括当前目录及其任何子目录,除非子目录包含构建文件

工作区文件是用构建语言编写的,与构建文件一样,包中只能有一个工作区。工作区文件的用途是跟踪项目的外部依赖关系。使用规则将每个外部依赖项添加到工作区 — 以下是一个例子:

渐变生成文件

Gradle生成系统使用几个文件:build.Gradle、settings.Gradle和gradlew。Gradle不像Bazel那样按脚本顺序运行每个构建步骤,而是使用Groovy(一种与Java相关的面向对象语言)处理构建步骤配置

build.gradle文件定义了构建的配置和执行阶段,将两个使用对象分开。脚本的执行顺序定义如下:

Bazel做得很好的事情包括

  • 逐位再现性。这太棒了

  • 与技术无关的包内构建。你有一些依赖于C代码的python吗?一些需要javascript作为前端的Java?Bazel可以做到这一点,它是为数不多的能够做到这一点的开源构建系统之一

  • 由于其可再现性,Bazel可以缓存构建结果,并且只重建需要的内容。这使它很快

  • 巴泽尔很灵活。它有自己的领域语言,因此您可以扩展它以支持您需要构建的任何内容,无论创建者是否听说过它。想要“构建”(语法检查和测试)Javascript?Java?CC++?目标C?Fortran?笨蛋?没问题。如果尚未实现,则可以实现它。如果你不喜欢它的工作方式,你可以自己写。要使用自定义编译器吗?自定义静态检查器?定制测试线束?没问题。世界就是你的牡蛎

巴泽尔不好

Bazel不是真正的依赖关系管理。它管理您的依赖项,但不管理要使用的版本。如果您将整个依赖关系树中的所有内容都检查到一个大型单片代码存储库中(就像Google使用他们的fork of perforce所做的那样),那么这很好。“谷歌之路”是在任何时候构建所有东西,永远不依赖旧版本

结论:

这两个版本之间的功能级别相似 格式,这两个系统显然是由 不同的哲学。Bazel提供了一个结构化系统 易于推理并提供强有力的功能基础。 大型和不断增长的产品。另一方面,格拉德尔提供了一个 灵活、有状态、面向对象的界面,让人感觉熟悉 对于那些不经常使用脚本语言的人

更多参考资料:


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

  • Bazel是谷歌内部使用的构建系统,这意味着它与用于构建YouTube、Gmail和照片等谷歌应用程序的构建系统相同
  • 其中一些谷歌应用程序非常庞大,Bazel需要很长时间才能在本地构建它们。因此,Bazel中有一个类似Gradle的,但更细粒度的IIUC,它允许您将构建操作分散到远程执行器群。Bazel有一个静态和封闭的操作依赖关系图,设计为完全可复制,每个操作都有一组完全声明的输入、输出、环境变量、命令行,以及Bazel内有关配置、工具链和主机/目标/执行平台的其他知识。通过该图,Bazel可以安全地将操作分配给远程工作者,从而实现非常大程度的并行性。我已经成功构建了Tensorflow Android应用程序,拥有500个-