在本部分中,您将了解 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