Fuchsia 源代码树

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

源代码管理

Fuchsia 使用 jiri 工具管理 Fuchsia 项目中的 Git 代码库。它会将源代码的本地检出与全局集成清单同步,并提供必要的工具,将更改贡献回 Fuchsia。全局集成是一个中央分类记录器,用于定义 Fuchsia 树中各个项目的当前状态。

您可以使用 import 命令和 XML 清单初始化本地 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 各种开发者工具,包括 fx 工作流中使用的子命令,可简化 Fuchsia 源代码树的使用。
sdk 包含 Fuchsia 平台 API 的源代码(包括 FIDL 协议定义),以及用于创建 Fuchsia SDK 发行版归档的构建目标。
src Fuchsia 的源代码,包括在目标设备上运行的组件、服务和工具。这是花的茎
tools 在主机上运行的 Fuchsia 开发者工具
vendor 为产品 build 的供应商专用二进制文件和自定义项预留的位置。构建系统支持发现 vendor/productsvendor/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 树中搜索某些内容,也就是需要在文件内搜索

在源文件中搜索

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

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

fx grep hello-world

这样会返回整个树中引用的长列表,因为文档、build 文件和其他来源中引用了此示例。

您可以使用过滤条件缩小搜索范围,从而缩小协议定义范围。再次执行相同的搜索,但这次仅在 GN build 文件中使用过滤条件执行:

fx grep hello-world -- build

结果表明协议定义位于 examples/hello_world。您可以将这些信息与 fd 结合使用,以导航到相应页面:

fd hello_world