产品包

产品配置封装了一组所需的软件包和组件 为底层硬件上的目标用户体验提供支持。每件商品 配置使用其 GN 标签声明其默认的软件包列表, GN 导入 (.gni) 文件。您可以扩充当前 build 的内容, 配置方式

<ph type="x-smartling-placeholder">

依赖项集

build 配置中的软件包会被分配给以下三个依赖项集之一:

  • 基础:捆绑到系统映像中的系统关键软件包。基本 软件包始终解析为系统映像中的版本,即使 软件包代码库中提供了不同的版本。更新基础 软件包需要系统 (OTA) 更新。
  • 缓存:捆绑到系统映像的其他软件包。缓存的软件包 如果有其他版本可用,则会从软件包代码库进行更新。
  • 宇宙:所有其他事物。这组软件包只能通过 以及按需分发的软件包代码库

显示软件包如何在基本、缓存或 Universe 依赖项中的情况的示意图
构建配置集。此集合决定了新版本的
成功解决

<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 软件,这意味着测试您的代码涉及 操作步骤:

  1. 通过任何代码更改构建更新后的软件包。
  2. 将更新后的软件包发布到软件包代码库。
  3. 在目标设备上触发更新。

显示开发者工具在开发过程中如何发布软件包的示意图
TUF 存储库,以通知 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 子命令来探索构建目标。

<ph type="x-smartling-placeholder">

首先使用 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

重启模拟器

  1. 运行以下命令以关闭您当前拥有的所有模拟器实例 打开:

    ffx emu stop --all
  2. 启动新的模拟器实例:

    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 构建了自己的定制商品!