Fuchsia 建構系統會結合平台、產品和主機板設定,建立最終的產品套件。雖然這些設定定義了產品的標準版本,但您可能需要進行暫時性修改,以利測試或偵錯。如要進一步瞭解軟體組裝的概念資訊,請參閱「軟體組裝」。
開發人員覆寫機制可讓您對產品設定進行僅限本機的修改,不必變更 Fuchsia 樹狀結構中的來源檔案。
本文說明如何使用開發人員覆寫功能修改產品的設定。
使用組件覆寫
如要使用組裝的開發人員覆寫功能,請按照下列步驟操作:
- 在 GN 目標中定義覆寫,通常是在 //local/BUILD.gn中。
- 將覆寫內容套用至建構設定。
舉例來說,如要啟用核心引數,請先在 //local/BUILD.gn 中定義覆寫:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("enable_kernel_debug") {
  kernel = {
    command_line_args = [ "foo" ]
  }
}
然後,使用下列其中一種方法,將這項覆寫套用至建構設定:
使用fx set
fx set 指令包含 --assembly-override 選項,可指定主要產品組件的覆寫 (而非測試組件、復原等)。例如:
fx set core.x64 --assembly-override //local:enable_kernel_debug
--assembly-override 選項支援兩種格式:
- --assembly-override <overrides_target>:將覆寫內容套用至主要產品組件。- 舉例來說,下列指令會將 - //local:enable_kernel_debug覆寫套用至- core.x64產品:- fx set core.x64 --assembly-override //local:enable_kernel_debug
- --assembly-override <assembly_target_pattern>=<overrides_target>:將覆寫項目套用至特定組件目標模式。- 舉例來說,如要只將 - //local:zedboot_overrides中定義的覆寫套用至- zedboot組件,請執行下列指令:- fx set core.x64 --assembly-override '//build/images/zedboot/*=//local:zedboot_overrides'
詳情請參閱下列章節:
- 如要瞭解如何指定組裝目標,請參閱「產品標籤模式」。
- 如要瞭解如何定義覆寫目標,請參閱「定義 assembly_developer_overrides目標」。
使用 fx args 或 args.gn
您可以編輯 args.gn 檔案或使用 fx args 來套用覆寫。可用的 GN 引數如下:
- product_assembly_overrides_label: 指定主要產品組件的單一覆寫目標。
- product_assembly_overrides_contents:在主要產品組件的- args.gn中,定義內嵌的覆寫項目。
- product_assembly_overrides:明確將覆寫目標對應至所套用組件目標的清單。
product_assembly_overrides_label
product_assembly_overrides_label 引數會將指定的覆寫項目套用至所選產品的主要組件。這不會影響其他產品組合,例如復原、zedboot 或測試。
args.gn 範例:
import("//products/...")
import("//boards/...")
product_assembly_overrides_label = "//local:my_overrides"
product_assembly_overrides_contents
您可以使用 product_assembly_overrides_contents 引數,直接在 args.gn 中定義覆寫。這些覆寫設定只會套用至主要產品組裝。
args.gn 範例:
import("//products/...")
import("//boards/...")
product_assembly_overrides_contents = {
  kernel = {
    command_line_args = [ "kernel.enable-debugging-syscalls=true" ]
  }
}
這個值使用的語法與 assembly_developer_overrides() GN 範本相同,請參閱「定義 assembly_developer_overrides 目標」。
product_assembly_overrides
product_assembly_overrides 引數可用於指定多個或非主要組件的覆寫項目。這項功能會使用 GN 標籤模式,將覆寫目標與對應的組件目標配對。
args.gn 範例:
import("//products/....")
import("//boards/....")
product_assembly_overrides = [
  {
    # zedboot
    assembly = "//build/images/zedboot/*"
    overrides = "//local:zedboot_overrides"
  },
  {
    # For assemblies in Bazel, use their product label
    assembly = "//products/minimal/*"
    overrides = "//local:minimal_overrides"
  },
  {
    # core or terminal products:
    assembly = "//build/images/fuchsia/*"
    overrides = "//local:enable_kernel_debug"
  },
]
定義 assembly_developer_overrides 目標
如要定義一組開發人員覆寫項目,請在 BUILD.gn 檔案中使用 assembly_developer_overrides() 範本。建議您將這些定義放在 Fuchsia 結帳的 //local 目錄中,因為這個目錄會遭到 Git 忽略。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("enable_kernel_debug") {
  kernel = {
    command_line_args = [
      "foo",
    ]
  }
}
# Multiple override sets can be defined in the same file.
assembly_developer_overrides("bar_debug") {
  kernel = {
    command_line_args = [ "bar" ]
  }
}
可用的覆寫選項
以下各節說明可在 assembly_developer_overrides 目標中設定的可用選項:
僅限開發人員使用的組裝選項
這些組裝選項只能透過開發人員覆寫啟用,且通常不允許用於產品或主機板設定。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("netboot_with_all_packages") {
  developer_only_options = {
    all_packages_in_base = true
    netboot_mode = true
  }
}
- all_packages_in_base:將所有- cache和- on_demand套件重新導向至- base套件組合。如果網路無法運作,這項功能有助於在裝置上使用偵錯工具。
- netboot_mode:建立 Zircon 開機映像檔 (ZBI),其中包含 ramdisk 內的 FVM/Fxfs 映像檔,讓產品能夠透過網路開機。
平台設定
您可以覆寫產品組裝件設定的 platform 設定。詳情請參閱 PlatformSettings 參考資料。
系統會根據欄位,將您指定的值與產品的平台設定合併。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("enable_sl4f") {
  platform = {
    development_support = {
      include_sl4f = true
      include_netsvc = true
    }
  }
}
如要將項目附加至清單,而非取代清單,請參閱「使用 __append_to_<key> 將項目附加至清單」。
核心指令列引數
您可以新增核心指令列引數。系統不會保留核心指令列引數的順序。如需可用選項的清單,請參閱 Zircon 核心指令列選項說明文件。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("bar_debug") {
  kernel = {
    command_line_args = [ "bar" ]
  }
}
其他套件
您可以將開發人員指定的套件新增至 base、cache、bootfs 和 flexible 套件組合。flexible 套件組合會放在 cache 中,適用於 eng 建構類型,並放在 base 中,適用於 user 和 userdebug 建構類型。
範本需要套件的特定 GN 標籤,且不會使用 GN 中繼資料來遍歷套件群組。
//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",
  ]
}
殼層指令
如要將指令列工具新增至 Fuchsia Shell,您必須新增包含該工具的套件,並指示組件建立元件的啟動器存根。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("my_custom_shell_commands") {
  shell_commands = [
    {
      package = "cp"
      components = [ "cp" ]
    }
  ]
}
如果透過套件探索功能提供套件仍不夠,您也可以將套件新增至套件集。
//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 "cp".
  base_packages = [
    "//some/gn/target/for/my/package:cp"
  ]
}
開發板設定
您可以覆寫特定開發板的設定,測試變更或新功能。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("add_new_feature") {
  board = {
    provided_features = [ "fuchsia::new_feature" ]
    filesystems = {
      gpt_all = true
    }
  }
}
如要將項目附加至清單,而非取代清單,請參閱「使用 __append_to_<key> 將項目附加至清單」。
已編譯的套件和元件
您可以將開發人員指定的內容和 CML 分片新增至由組件編譯的套件和元件。
//local/BUILD.gn 範例:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("add_core_shard") {
  core_shards = [ "//local/testing.core_shard.cml" ]
}
使用 __append_to_<key> 將項目附加至清單
根據預設,開發人員覆寫會以您指定的新內容取代清單。如要改為附加至清單,請使用 __append_to_<key> 語法,其中 <key> 是清單名稱。
舉例來說,假設有下列開發板設定:
board_configuration("bar") {
  provided_features = [ "fuchsia::feature1", "fuchsia::feature2"]
}
您可以使用這項覆寫項目附加新功能:
import("//build/assembly/developer_overrides.gni")
assembly_developer_overrides("foo") {
  board = {
    __append_to_provided_features = [ "fuchsia::new_feature" ]
  }
}
產生的設定如下所示:
board: {
  provided_features: [
    "fuchsia::feature1",
    "fuchsia::feature2",
    "fuchsia::new_feature",
  ]
}
重要詳細資訊
組裝警告文字
使用覆寫的組裝作業一律會產生警告,詳細說明套用的覆寫。例如:
WARNING!:  Adding the following via developer overrides from: //local:enable_kernel_debug
  Additional kernel command line arguments:
    foo
產品標籤模式
系統會透過標籤模式比對,建立覆寫目標與產品組合之間的對應關係。
- //some/label/with/wildcard/*:比對該路徑和路徑下的所有組件。
- //some/label/with/wildcard:*:只比對該資料夾中的所有組件。
建構圖中的不同路徑會找到不同的組件。常見位置包括:
- GN 組裝產品:
- bringup個產品:- //build/images/bringup/*
- core個產品:- //build/images/fuchsia/*
- zedboot:- //build/images/zedboot/*
- guest:- //build/images/guest/*
 
- Bazel 組裝產品 (minimal、terminal、workbench等):- 登機時間:fuchsia.git//products/<name>/*
 
- 登機時間: