与Badle相比,使用Bazel有什么额外的优势?

时间:2019-01-03 05:08:10

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

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

  

实验性淡褐色支持

     

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

     

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

然后

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

更新#1:已更新,其中包含farhana的可接受答案,并感谢Jin提供了有关Google构建系统的详细信息。

更新#2:已针对bazel android introduction的Google代码实验室进行了更新。

2 个答案:

答案 0 :(得分:8)

Bazel 是内部Google构建系统的一部分,称为Blaze。因此,Bazel已发展为解决一个非常大的问题,该问题在Google看来(但可能不是全部)是独一无二的:

  • Bazel配置文件的结构比Gradle的文件结构更紧密, 让Bazel准确了解每个动作的作用。这允许 以获得更高的并行度和更好的可重复性。

Bazel构建文件

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

存在的BUILD 文件告诉Bazel,它正在查看代码包-该代码包包括当前目录及其中的任何子目录,除非该子目录包含构建文件。

enter image description here

WORKSPACE 文件是使用BUILD语言编写的,并且与BUILD文件一样,一个程序包中只能有一个WORKSPACE。 WORKSPACE文件的目的是跟踪项目的外部依赖关系。使用规则将每个外部依赖项添加到WORKSPACE,以下是示例:

enter image description here

Gradle构建文件

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

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

enter image description here

Bazel做得很好的事情包括

  
      
  • 位用于位再现性。这太好了。

  •   
  • 与技术无关的内部封装版本。您是否有依赖于某些C代码的python?某些Java前端需要javascript吗? Bazel可以做到这一点,它是少数可以做到的开源构建系统之一。

  •   
  • 由于具有可重复性,Bazel可以缓存构建结果,并且仅重建所需的内容。这使其变得快速。

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

  •   

关于榛子的问题

Bazel不是 real 依赖项管理。它管理您的依赖项是什么,但不管理要使用的版本。如果您将整个依赖关系树中的所有内容都签入了一个大型的整体代码存储库(例如Google使用perforce的fork进行了存储),那就很好了。 “ Google方式”是始终构建所有内容,而不是依赖于旧版本。

结论:

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

有关更多参考:

答案 1 :(得分:5)

我是该存储库中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之类的客户端。这意味着您不需要像build your NDK and C++ code那样的CMake这样的单独工具。您可以使用相同的构建工具来构建前端和后端,并一起运行集成测试。
  • 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规则以在开源世界中工作的早期阶段,因此希望某些功能目前仍在开发中。