在本部分,您将了解 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/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 树中搜索某些内容,也就是需要在文件内搜索。
在源文件中搜索
如需在特定源文件中搜索树中的模式,请使用 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