Fuchsia 源代码树

在本部分中,您将了解 Fuchsia 源代码的组织结构以及用于管理开源项目的工具。

源代码管理

Fuchsia 使用 jiri 工具来管理 Fuchsia 项目中的 Git 代码库。它会将源代码的本地签出与全局集成清单同步,并提供将更改贡献回 Fuchsia 所需的必要设施。全局集成是定义 Fuchsia 树中各种项目的当前状态的中央账本。

您可以使用 import 命令初始化本地 Jiri 代码库,该命令会使用一个 XML 清单来声明所有代码库及其组织方式。默认全局集成清单的导入如下所示:

jiri import -name=integration flower https://fuchsia.googlesource.com/integration

此命令会将清单添加到本地签出根目录中的本地 .jiri_manifest 文件。

<manifest>
  <imports>
    <import manifest="flower" name="integration"
            remote="https://fuchsia.googlesource.com/integration" />
  </imports>
</manifest>

在开发机器上初始化本地签出后,jiri 可以随时使用一个命令从全局集成拉取最新更改:

jiri update

源代码布局

Fuchsia 是一个大型开源项目。与任何大型软件项目一样,如果没有路线图来引导您,很容易迷失方向。本部分简要介绍了本地 Fuchsia 代码库,并总结了您在其中可能会遇到的各种元素:

path 说明
boards 包含 Fuchsia 团队支持和维护的所有默认主板配置。
build Fuchsia 构建系统的共享配置和默认模板。
bundles 通常在 build 配置中一起包含的 build 目标标签的顶级分组。如需了解详情,请参阅软件包。
docs Fuchsia 文档,包括 Fuchsia.dev 开发者网站的源材料。
examples 展示 Fuchsia 平台各个方面的示例软件组件。
products 包含 Fuchsia 团队支持和维护的所有默认产品配置。
scripts 各种开发者工具,可简化 Fuchsia 源代码树的使用,包括 fx 工作流中使用的子命令。
sdk 包含 Fuchsia 平台 API 的源代码,包括 FIDL 协议定义和用于创建 Fuchsia SDK 分发归档的 build 目标。
src Fuchsia 的源代码,包括在目标设备上运行的组件、服务和工具。这是花茎。
tools 在宿主机上运行的 Fuchsia 开发者工具。
vendor 为产品 build 保留的用于存放供应商特定二进制文件和自定义项的位置。构建系统支持发现 vendor/products 和 vendor/boards 下的配置文件,以针对特定于供应商的设备目标平台构建 Fuchsia。
zircon Fuchsia 的 Zircon 核心(包括内核)的源代码。

Fuchsia 平台的源代码进一步细分为在设备上运行的各种组件和服务。以下列表并非详尽无遗,但可提供一些有趣的探索起点:

path 说明
src/bringup 用于启动系统用户空间环境的核心系统二进制文件。
src/camera 支持相机设备驱动程序的服务。
src/cobalt 用于记录、收集和分析指标的 Fuchsia 服务。
src/connectivity 网络协议支持和设备驱动程序。
src/developer 在目标上运行的开发者工具,包括 ffx。
src/devices 适用于常见硬件子系统的设备驱动程序支持库。
src/diagnostics 诊断支持服务,例如日志记录、崩溃报告、快照和统计信息。
src/factory 实现对出厂配置数据存储空间的访问的组件。
src/fonts 内置系统字体的提供程序。
src/graphics 显示设备驱动程序的支持服务。
src/identity 用户账号处理和身份令牌管理。
src/media 媒体编解码器和播放服务。
src/power 电源管理服务。
src/starnix POSIX 兼容性库。
src/recovery 恢复系统和恢复出厂设置服务。
src/security 安全政策和分析工具。
src/session 用于管理会话组件的基础设施和工具。
src/storage 支持文件系统和卷管理。
src/sys 用于软件包管理的组件框架和服务。
src/tests 平台端到端 (E2E) 集成测试。
src/ui 支持图形界面 (GUI) 的服务,包括 Scenic。
src/virtualization 虚拟机客户操作系统支持的 Hypervisor。
src/zircon 用于与 Zircon 内核交互的库。

练习:浏览源代码树

在本练习中,您将使用环境中提供的命令行工具探索 Fuchsia 源代码树的本地签出。熟悉这些工具后,您在开始为代码库贡献代码时,工作效率会更高。

搜索树

如果您不确定从何处着手,可以使用 fd 实用程序对目录执行模糊搜索,然后前往搜索结果的位置。

运行以下命令,以针对 session_manager 运行 fd 搜索:

fd session_manager

该实用程序会打印一些可能的选项供您选择。选择选项 2 可前往 src/session/bin/session_manager:

[1] src/session/bin/session_manager
[2] src/session/tests/session_manager

这样一来,您就可以轻松找到并浏览要处理的代码段。如果搜索内容足够具体,可以返回单个结果,fd 会自动将您引导至该结果。

运行以下命令,搜索 archivist - Fuchsia 的诊断服务,用于收集日志数据、快照和生命周期事件:

fd archivist

请注意,该命令实际上并未输出任何结果,但您的工作目录已自动设置为 src/diagnostics/archivist!

这有助于您入门,但您可能需要在 Fuchsia 树中搜索一些内容,而这需要在文件中进行搜索。

在源文件中搜索

如需在特定源文件中搜索树中的模式,请使用 git grep 命令。

在树中运行搜索,以使用 git grep 查找对 hello-world 示例的引用:

git grep hello-world

这会返回树中各处的长引用列表,因为此示例在文档、构建文件和其他来源中都有引用。

您可以使用路径规范来优化搜索,以便更精确地找到协议定义。再次执行相同的搜索,但这次仅在 GN build 文件中搜索:

git grep hello-world -- '*.gn' '*.gni'

结果表明,协议定义位于 examples/hello_world。您可以将此信息与 fd 结合使用,以便前往相应位置:

fd hello_world