写点什么

【Android 构建新工具】Bazel 构建工具介绍

用户头像
轻口味
关注
发布于: 24 分钟前

Android 开发我们主要用到的编译器是 Java 的 Java 编译器以及 C/C++的 gcc/clang 编译器。对应 Java 层构建工具最初是 Ant,后面 Maven 以及 gradle;C/C++构建工具主要是 make/cmake,做过系统开发或者 chromeium,可能还用过 ninjia、gclient、mm 等。最近在编译 Android 平台的 tensorflow lite 库,发现官方使用的是 Bazel 构建工具,大概了解了下,它不仅可以构建 Native 层还可以构建 Java 层库。今天我们简单介绍下什么是 Bazel,后续我们逐步深入了解 Bazel 构建工具,使用 Bazel 构建我们的 Android 项目。

Bazel 概述

Bazel 是一个开源的构建和测试工具,类似于 Make、Maven 和 Gradle。它使用人类可读的高级构建语言。Bazel 支持多种语言的项目,并为多种平台构建输出。Bazel 支持跨多个存储库和大量用户的大型代码库。


为什么选择 Bazel?

Bazel 构建工具有以下优势:

  • 高级构建语言。Bazel 使用一种抽象的、人类可读的语言来在高级语义级别描述项目的构建属性。与其他工具不同,Bazel 操作的是库、二进制文件、脚本和数据集的概念,避免了编写对编译器和连接器等工具的单独调用的复杂性。

  • Bazel 快速可靠。Bazel 将缓存所有以前完成的编译结果,并跟踪对文件内容和构建命令的更改。这样,Bazel 可以知道什么时候需要重建,而且只重建该处改动。还可以将项目设置为以高度并行和增量的方式进行构建以进一步加快构建速度。

  • Bazel 是跨平台的。Bazel 可以在 Linux、macOS 和 Windows 上运行。Bazel 可以从同一个项目中为多个平台(包括桌面、服务器和移动)构建二进制文件和可执行文件。

  • Bazel 是规模化的。Bazel 在处理带有 100k 以上源文件的构建时保持了敏捷性。它可以与数以万计的多个存储库和用户群一起工作。

  • Bazel 是可扩展的。它支持许多语言,您可以扩展 Bazel 以支持任何其他语言或框架。


Bazel 使用教程

要使用 Bazel 构建或测试一个项目,我们需要怎么操作呢?通常需要做以下操作:

  1. 设置 Bazel 环境。下载并安装Bazel

  2. 设置工作空间,该目录是 Bazel 查找构建输入和 build 文件以及存储构建输出的目录。

  3. 编写一个 BUILD 文件,用以向 Bazel 描述要构建什么以及如何构建。

  4. 从命令行运行 Bazel。

我们可以使用 Starlark(一种特定于领域的语言)来声明构建目标,从而编写构建文件。

构建目标指定了一组 Bazel 将构建的输入构件以及它们的依赖项、Bazel 将用于构建的构建规则,以及配置构建规则的选项。

构建规则指定 Bazel 将使用的构建工具,比如编译器和链接器,以及它们的配置。Bazel 附带了许多构建规则,涵盖了受支持平台上受支持语言中最常见的工件类型。

除了构建之外,我们还可以使用 Bazel 运行测试和查询构建,以跟踪代码中的依赖项。


Bazel 是如何工作的?

当我们运行构建或测试时,Bazel 会做以下事情:

  1. 加载与目标相关的 Build 文件;

  2. 分析输入及其依赖关系,应用指定的构建规则,并生成动作图。

  3. 在输入上执行构建操作,直到生成最终的构建输出。

由于所有以前的构建工作都被缓存了,Bazel 可以识别和重用缓存的工件,只重新构建或重新测试更改的内容。为了确保正确,我们可以设置 Bazel 以通过沙箱密封地运行构建和测试,最大限度地减少偏差和最大化复用性。


什么是动作图?

动作图表示构建工件、它们之间的关系以及 Bazel 将执行的构建操作。通过这个图,Bazel 可以跟踪对文件内容的更改以及对操作(比如构建或测试命令)的更改,并知道之前已经完成了哪些构建工作。该图还使我们能够轻松地跟踪代码中的依赖项。

发布于: 24 分钟前阅读数: 2
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017.10.17 加入

Android音视频、AI相关领域从业者,开源RTMP播放器:https://github.com/qingkouwei/oarplayer

评论

发布
暂无评论
【Android构建新工具】Bazel构建工具介绍