我正在阅读有关Android Testing Samples项目的文章,并注意到一个名为Bazel的“新”构建工具正用于构建Android项目:
实验性Bazel支持
其中一些示例可以在Linux上使用Bazel构建。这些示例包含
BUILD.bazel
文件,类似于build.gradle
文件。外部依赖项在顶级WORKSPACE文件中定义。这是实验性功能。要运行测试,请按照Bazel网站上的说明安装最新版本的Bazel(0.12.0或更高版本)。
然后,
更新#1:更新了farhana的接受答案,感谢Jin有关google构建系统的详细信息。
更新#2:更新了bazel android introduction的谷歌代码实验室。
Bazel是内部Google构建系统Blaze的子集。因此,Bazel已经发展到解决了一个非常大的问题,这个问题在某种程度上(但可能并非完全)是Google特有的:
Bazel构建文件
Bazel使用两个配置文件:BUILD
和WORKSPACE
BUILD文件的存在告诉Bazel它正在查看代码包 - 这个代码包包括当前目录及其中的所有子目录,除非子目录包含构建文件。
WORKSPACE文件是用BUILD语言编写的,和BUILD文件一样,包中只能有一个WORKSPACE。 WORKSPACE文件的目的是跟踪项目的外部依赖项。每个外部依赖项都使用规则添加到WORKSPACE - 以下是一个示例:
Gradle构建文件
Gradle构建系统使用多个文件:build.gradle,settings.gradle和gradlew。而不是像Bazel那样以脚本序列运行每个构建步骤,Gradle使用Groovy处理构建步骤配置,Groovy是一种与Java相关的面向对象语言。
build.gradle文件定义构建的配置和执行阶段,将两个使用对象分开。脚本的执行顺序定义如下:
Bazel所做的事情包括:
- 比特再现性。这是优秀的。
- 与技术无关的内部包构建。你有一些依赖于某些C代码的python吗?有些Java需要javascript作为前端吗? Bazel可以做到这一点,它是少数可以开源的构建系统之一。
- 通过其可重复性,Bazel可以缓存构建结果并仅重建其所需的内容。这使得它很快。
- Bazel很灵活。它有自己的域语言,因此您可以扩展它以支持您需要构建的任何内容,无论创建者是否听说过它。想要“构建”(语法检查和测试)Javascript?Java? C? C ++?目标C? Fortran语言? Brainfuck?没问题。如果尚未实现,则可以实现它。如果你不喜欢它的工作方式,你可以自己编写。想使用自定义编译器吗?自定义静态检查器?自定义测试工具?没问题。世界是你的牡蛎。
关于bazel不好
Bazel不是真正的依赖管理。它管理您的依赖项是什么,但不管理要使用的版本。如果您将整个依赖关系树中的所有内容都检入一个巨大的整体代码存储库(就像Google使用perforce的分支一样),那就没问题了。 “google方式”是指始终一直在构建所有内容,而不是依赖旧版本。
结论:
这两种构建格式之间存在类似的功能级别,很明显这两种系统都是用不同的理念构建的。 Bazel提供了一个易于推理的结构化系统,为大型和不断发展的产品提供了强大的功能基础。另一方面,Gradle提供了一个灵活,有状态,面向对象的界面,对于那些不经常使用脚本语言的人来说,这种界面可能会让人感到熟悉。
有关更多参考:
我是该存储库中Bazel支持的作者,我在Bazel Android rules团队工作。 farhana已经写了一个惊人的答案,但我只想补充几点:
mobile-install
的内置命令,可以快速迭代地开发Android应用程序。它构建您的应用程序,分割本机库,dexes和资源文件,并仅将更改的分片推送到设备以减少构建和部署时间。 Read more about it here。拥有适用于Android的TWO构建工具真的很棒吗?
不仅仅是两个:Buck&Pants是Android的另外两个流行的构建系统。每个构建系统都有其优点和缺点,并且被设计和实现以解决特定的一组要求。例如,Bazel(及其周围的工具生态系统)诞生于Google庞大的monorepo之外,因此它可以很好地解决可扩展性问题。
有选择尝试不同的方法,IMO是一件好事。
这是否意味着Android开发人员未来可能需要学习这种新的构建工具?
Bazel是开源的,并通过Bazel plugin在Android Studio中提供支持。如果你认为它看起来很有趣,feel free to try it out!我们仍处于调整Android规则以在开源世界中工作的早期阶段,因此期望一些功能暂时正在进行中。