使用开发者替换项组装 Fuchsia 产品

在某些情况下,您可能需要替换 Fuchsia 产品的配置。

使用程序集替换项

如需开始使用程序集的开发者替换项,请执行以下操作:

  1. 在 Fuchsia 检出代码中,创建一个 //local/BUILD.gn 文件:

    //local.BUILD.gn 文件可能如下所示:

    import("//build/assembly/developer_overrides.gni")
    
    assembly_developer_overrides("my_overrides") {
        kernel = {
            command_line_args = ["foo"]
        }
    }
    

    BUILD.gn 文件表示以下内容:

    • 程序集开发者替换项名为 my_overrides。您可以为此字段使用任何有意义的标识符。
    • kernelcommand_line_args 均基于平台配置的支持值。如需了解详情,请参阅 PlatformConfig
  2. 创建符合要求的 //local/BUILD.gn 文件后,您可以将 fx set 命令设置为使用此汇编平台配置。例如:

    fx set --assembly-override=//local:my_overrides
  3. 构建 Fuchsia:

    fx build

    现在,您应该可以像往常一样构建 Fuchsia 了。

此外,您还可以执行以下操作:

添加软件包

在某些情况下,您可能需要向产品软件包添加其他软件包。在这种情况下,您的 //local/BUILD.gn 可能如下所示:

import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_custom_base_packages") {
  base_packages = [
    "//some/gn/target/for/a:package",
    "//some/other/target/for/a:package",
    "//third_party/sbase",
  ]
}

添加 shell 命令

在某些情况下,您可能需要在产品配置中添加 shell 命令。添加要在 Fuchsia shell 中运行的 CLI 工具时,必须同时添加软件包并配置程序集,以创建运行二进制文件组件的启动器桩。这是因为大多数 CLI 工具实际上都是组件。

为此,请在 assembly_developer_overrides 中定义 shell_commands 列表。此列表中的每个条目都是一个包含以下键的对象:

  • package:包含 shell 命令的软件包的名称(例如 cp)。这是软件包名称,而不是 GN 目标标签。
  • components:您要注册为 shell 命令的软件包中的 CLI 二进制文件列表。在查找这些名称的组件清单时,汇编程序会自动添加 meta/ 前缀和 .cm 后缀。例如,foo 会变为 meta/foo.cm

例如,如需添加 cp 软件包中的 cp 命令,您的 //local/BUILD.gn 可能如下所示:

import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_custom_shell_commands") {
  shell_commands = [
    {
      package = "cp"
      components = [ "cp" ]
    }
  ]
}

如需向 shell_commands 列表添加多个条目,请参阅以下示例:

import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_multiple_shell_commands") {
  shell_commands = [
    {
      package = "foo"
      components = [ "foo_comp" ]
    },
    {
      package = "bar"
      components = [ "bar_comp1", "bar_comp2" ]
    }
  ]
}

向软件包集添加 shell 命令

此外,如果通过软件包发现功能提供软件包还不够,您还可以将软件包目标添加到软件包集中。例如,如需将软件包添加到 base 软件包集中,您的 //local/BUILD.gn 可能如下所示:

import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_custom_shell_commands") {
  shell_commands = [
    {
      package = "cp"
      components = [ "cp" ]
    }
  ]

  # This GN target should define a package named "foo_cli".
  base_packages = [
    "//some/gn/target/for/my/package:foo_cli"
  ]
}

使用 developer_only_options

在某些情况下,您可能需要使用一些 developer_only_options。这些选项可以与使用程序集替换项中介绍的常规替换项结合使用。

在这种情况下,您的 //local/BUILD.gn 可能如下所示:

import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_overrides") {
  developer_only_options = {
    all_packages_in_base = true
    netboot_mode = true
  }
}

all_packages_in_base

此选项会将所有缓存和按需软件包集软件包重定向到基本软件包集。此功能允许在网络可能不可用或无法运行软件包服务器的环境中使用具有缓存或全集软件包的产品映像。

此选项的主要用途是允许在网络无法正常运行时在设备上使用调试工具。

netboot_mode

此选项会创建一个 ZBI(Zircon 启动映像),其中包含 ramdisk 内的 fvm/fxfs 映像,以实现产品的网络启动。

这是之前使用 //build/images/fuchsia:netboot 生成的 netboot 程序集的替代项。

替换多个平台配置

您还可以在同一 assembly_developer_overrides 定义中替换多个平台配置区域。

例如,以下替换项可自定义开发 SSH 密钥和 USB 外围设备功能:

import("//build/assembly/developer_overrides.gni")

assembly_developer_overrides("my_multi_overrides") {
  platform = {
    development_support = {
      authorized_ssh_keys_path = "//local/fuchsia_authorized_keys"
    }
    usb = {
      peripheral = {
        functions = [ "cdc" ]
      }
    }
  }
}