软件组装

借助软件组装,开发者可以使用自定义的操作系统快速构建产品。具体来说,软件组装是一组工具,可根据输入(包括一组 Fuchsia 软件包、一个内核和配置文件)生成产品软件包 (PB)。

产品套装

产品软件包是一个目录,其中包含可交付到任何环境的规范化制品,用于刷写、更新或模拟 Fuchsia 目标。不建议开发者直接检查 Product Bundle 的内容,而是可以依赖 Fuchsia 提供的工具。例如,ffx 工具用于使用产品软件包刷写或模拟设备:

# Flash a hardware target with the product bundle.
$ ffx target flash --product-bundle <PATH/TO/PRODUCT_BUNDLE>

# Start a new emulator instance with the product bundle.
$ ffx emu start <PATH/TO/PRODUCT_BUNDLE>

产品包可能包含产品和恢复产品,它们是不同的可启动体验。main 通常用于真实产品体验,如果 main 出现故障且无法启动,则使用 recoveryrecovery 通常是一种轻量级体验,能够通过恢复出厂设置或无线更新 (OTA) 来解决 main slot 中的问题。通常,最终用户可以在启动期间按住设备上的某个实体按钮,切换要启动的产品。

软件组装提供用于构建产品软件包的 build 工具,定义了输入(平台、产品配置、主板配置)的格式,并提供了用于构建这些输入的 build 规则。

包含主商品和恢复商品的商品套装

图 1. 商品套装可能包含主商品和恢复商品。

平台、产品配置和板级配置

组装的三个输入(平台产品配置主板配置)是制品目录。内部格式可能会发生变化,不应依赖于此。开发者需要使用提供的 Bazel 或 GN 构建规则来构建和使用这些输入。

  • 平台由 Fuchsia 团队打造。它包含任何 Fuchsia 产品可能想要使用的每一位已编译的平台代码。Fuchsia 团队将平台发布到 https://chrome-infra-packages.appspot.com/p/fuchsia/assembly/platform

  • 产品配置由开发者定义最终用户体验来生成。它可能包含标志,用于指明要包含的平台功能。例如,产品配置可以设置 platform.fonts.enabled=true,从而使程序集包含来自平台的相应字体支持。 如需了解所有可用标志,请参阅此参考文档。产品配置还可以包含用于构建用户体验的自定义代码。

  • 主板配置由支持特定硬件目标的开发者生成。它包含在该硬件上启动所需的所有驱动程序。 此外,主板配置还可以声明平台可使用的硬件。例如,如果硬件具有实时时钟 (RTC),则板配置可以通过设置 provided_features=["fuchsia::real_time_clock"] 标志来指明这一点。程序集会读取此标志,并包含来自平台的必要代码,以使用此硬件。Fuchsia 团队维护着一小部分主板配置,并将其发布到 https://chrome-infra-packages.appspot.com/p/fuchsia/assembly/boards

如何调用软件组装

从本质上讲,Fuchsia 的软件组装是一个 Rust 库,可供多个不同的 CLI 工具用来生成产品软件包。下图展示了调用程序集的最常见方式:

  • 构建系统集成(Bazel 和 GN):Bazel 和 GN 等构建系统提供简单的构建目标(例如,fuchsia_product_bundle 中的)来处理生成正确输入文件和为您调用汇编工具的复杂性。这是最常见且最推荐的软件组装方式。

  • ffx product-bundle create:生成一次性产品软件包以进行测试的最快方法是使用 ffx product-bundle create。此工具在处理预构建的平台、产品和主板配置时特别有用,因为它无需完全集成到构建系统中即可实现非常快速的组装。

Bazel

# A product bundle can contain both 'main' and 'recovery' products (systems/slots).
fuchsia_product_bundle(
    name = "my_product_bundle",
    main = ":main_product",
    recovery = "...",
)

# A product is a single bootable experience that is built by combining
# a platform, product configuration, and board configuration.
fuchsia_product(
    name = "main_product",
    platform = "//platform:x64",
    product = ":my_product",
    board = "//boards:x64",
)

# A product configuration defines the user experience by enabling
# platform features and including custom product code.
fuchsia_product_configuration(
    name = "my_product",
    product_config_json = {
        platform = {
            fonts = {
                enabled = True,
            },
        },
    },

    # The product code is included as packages.
    base_packages = [ ... ],
)

如需查看完整示例,请参阅 getting-started 代码库。

命令行界面

ffx product-bundle create --platform 28.20250718.3.1 \
                          --product-config <PATH/TO/MY_PRODUCT_CONFIG> \
                          --board-config cipd://fuchsia/assembly/boards/x64@version:28.20250718.3.1

您可以运行 ffx product-bundle create 命令,使用已构建的平台、主板和产品制品生成新的产品软件包。

静态分析工具

软件组装提供用于验证产品包质量的工具。

大小检查工具会告知用户商品包是否符合目标硬件的分区大小限制。您可以使用以下 Bazel 规则生成产品大小报告

fuchsia_product_size_check(
    name = "main_product_size_report",
    product_image = ":main_product",
)

fuchsia_product(
    name = "main_product",
    ...
)

审查工具可确保产品包符合一组安全标准。如果开发者提供必要的 scrutiny 配置,scrutiny 会在构建 Product Bundle 期间运行。请参阅以下审查配置示例:

fuchsia_product_bundle(
    name = "my_product_bundle",
    main = ":main_product",
    main_scrutiny_config = ":main_scrutiny_config",
)

fuchsia_scrutiny_config(
    name = "main_scrutiny_config",
    base_packages = [ ... ],    # Allowlist of base packages to expect.
    kernel_cmdline = [ ... ],   # Allowlist of kernel arguments to expect.
    pre_signing_policy = "...", # File containing the policies to check before signing.
)

附录:开发者替换

开发者有时会想通过添加新代码或翻转功能标志来在现有产品上本地测试某些内容。修改产品或主板配置是不理想的,因为这会污染 git 树 (fuchsia.git)。Assembly 支持一种在本地修改现有产品的方法,该方法使用开发者替换项,不会污染 git 树。