产品配置封装了一组所需的软件包和组件
为底层硬件上的目标用户体验提供支持。每件商品
配置使用其 GN 标签声明其默认的软件包列表,
GN 导入 (.gni
) 文件。您可以扩充当前 build 的内容,
配置方式
依赖项集
build 配置中的软件包会被分配给以下三个依赖项集之一:
- 基础:捆绑到系统映像中的系统关键软件包。基本 软件包始终解析为系统映像中的版本,即使 软件包代码库中提供了不同的版本。更新基础 软件包需要系统 (OTA) 更新。
- 缓存:捆绑到系统映像的其他软件包。缓存的软件包 如果有其他版本可用,则会从软件包代码库进行更新。
- 宇宙:所有其他事物。这组软件包只能通过 以及按需分发的软件包代码库
<ph type="x-smartling-placeholder">
以下是产品配置文件的示例代码段。此商品
会继承 core
产品中定义的所有软件包,然后添加一个
向每个依赖项集添加几个额外的软件包:
import("//products/core.gni")
legacy_base_package_labels += [
"//src/chromium:web_engine",
"//src/fonts",
]
legacy_cache_package_labels += [
"//src/media/playback/bundles:services",
]
discoverable_package_labels += [
"//src/ui/examples:bouncing_ball",
]
在此示例中,构建系统会将运行时、资源和 复制到目标设备的磁盘映像中这些示例只有 可按需从软件包服务器获取。
手动 build 自定义
创建新的完整产品配置并不是自定义产品的唯一方式
和构建。您还可以使用以下代码为 fx set
命令提供其他标签:
以下标志:
--with
:向 Universe 依赖项集添加目标标签。--with-base
:向基础依赖项集添加目标标签。--with-cache
:向缓存依赖项集添加目标标签。
这是临时为开发启用软件包的好方法,
想要包含到最终 build 目标(例如测试)中。例如,
以下命令会将 Fuchsia tests
软件包中的所有软件包添加到
标准 workstation_eng
build。
fx set workstation_eng.x64 --with //bundles/tests
使用软件包进行开发
回想一下简介中有关 Fuchsia 软件包不“安装”的信息设备 它们会从本地软件包缓存或软件包代码库中解析。时间 开发 Fuchsia 软件,这意味着测试您的代码涉及 操作步骤:
- 通过任何代码更改构建更新后的软件包。
- 将更新后的软件包发布到软件包代码库。
- 在目标设备上触发更新。
fx build
等开发者工具会将软件包更新发布到本地软件包
在构建流程中创建代码库依赖项集
产品声明软件包确定如何在目标上触发更新
设备:
- 只能通过执行整个系统更新 (OTA) 来更新基础软件包。
使用
fx ota
触发系统更新,或将新的系统映像刷写到 设备来更新基础软件包。 - 缓存的软件包和 Universe 软件包会在下次更新时自动更新 已解决。
练习:自定义 build
在本练习中,您将临时自定义 workstation_eng
build,具体方法是:
包含宇宙软件包中的其他软件包,
可用。
将软件包添加到 build
您可以使用
fx set
的 --with
标志。重新配置 workstation_eng
build 以包含
Fuchsia 示例:
fx set workstation_eng.x64 --with //examples
这通常用于包括您需要在设备上运行的测试软件包或 您正在处理的新软件包尚未包含在产品中 配置。
验证示例软件包是否已添加到 build 中:
fx list-packages example
使用 GN 探索构建目标
GN 附带一套功能强大的诊断工具,
您的 build 中配置的目标。遵照说明,了解如何使用 fx gn
子命令来探索构建目标。
首先使用 desc
命令输出有关 //examples
的详细信息
刚刚添加到 build 的 app bundle。
fx gn desc out/default //examples
此命令会输出有关目标类型及其所有依赖项的详细信息。对于
//examples
软件包,依赖项列表表示
示例软件包。
使用同一命令探索 hello-world
目标的详细信息。
fx gn desc out/default //examples/hello_world:hello-world
此目标表示包含多个组件的软件包,因此您可以 会看到其他依赖项,例如组件清单和软件包 元数据。
继续向下,探索 hello-world-rust
组件。
fx gn desc out/default //examples/hello_world/rust:hello-world-rust-component
从特定目标(例如 hello-world-rust
)的角度来看
组件,也可以使用 refs
命令在构建图中向上看。
这会报告对指定目标的传入引用。
fx gn refs out/default //examples/hello_world/rust:hello-world-rust-component
最后,使用 path
命令报告任意两个路径之间的引用链
目标。这有助于确定目标的添加位置和方式
检查目标和映像之间的引用路径,
//:default
。
fx gn path out/default //:default //examples/hello_world:hello-world
在模拟器中运行示例
再次运行 fx build
以构建更新后的软件包:
fx build
使用 ffx component
命令运行 Hello World 组件示例:
ffx component run /core/ffx-laboratory:hello-world-cpp fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
打开一个新的终端窗口,然后过滤设备日志中是否存在来自 示例:
ffx log --filter hello
您应该会在设备日志中看到以下输出:
[hello-world-cpp][I] Hello, World!
练习:创建新的构建产品
在下一个练习中,您需要将这些额外的软件包封装为
扩展 workstation_eng
的产品配置。
声明商品配置
在 //vendor
下创建一个名为 fuchsia-codelab
的新目录:
mkdir -p vendor/fuchsia-codelab
在 //vendor/fuchsia-codelab/products
下创建一个新文件 fuchsialab.gni
内容如下:
# Extend the workstation_eng product
import("//products/workstation_eng.gni")
这将创建一个名为 fuchsialab
的新商品,并扩展 workstation_eng
,
并继承其定义的所有软件包标签
验证构建系统能否通过
fx list-products
命令。您应该会在商品列表中看到 fuchsialab
。
fx list-products
将软件包添加到您的产品中
若要自定义产品附带的特定套餐,可将其添加到 为产品配置中设置的相应软件包设置标签。
将以下代码行添加到 //vendor/fuchsia-codelab/products/fuchsialab.gni
中
在您的自定义产品中添加 Hello World 示例:
discoverable_package_labels += [
"//examples/hello_world",
]
构建新产品
为在 FEMU 板上运行的 fuchsialab
产品重新配置 build:
fx set fuchsialab.x64
验证 Hello World 示例软件包现在是否已添加到 build 中:
fx list-packages hello
运行 fx build
为您的自定义商品生成新图片:
fx build
重启模拟器
运行以下命令以关闭您当前拥有的所有模拟器实例 打开:
ffx emu stop --all
启动新的模拟器实例:
ffx emu start --headless
启动完成后,模拟器将输出以下消息和 返回:
Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log" Waiting for Fuchsia to start (up to 60 seconds)........ Emulator is ready.
检查设备
打开另一个终端窗口,然后运行以下命令以输出详细信息 :
ffx target show
查找目标输出的 build 配置:
Version: "2000-01-01T12:00:00+00:00"
Product: "fuchsialab"
Board: "x64"
Commit: "2000-01-01T12:00:00+00:00"
恭喜!您刚刚基于 Fuchsia 构建了自己的定制商品!