設定總覽

AOSP 提供下列選項,可在裝置上儲存設定資訊:

  • 系統屬性
  • 提早啟動裝置設定
  • 硬體抽象層 (HAL) 屬性
  • 系統設定 XML 檔案
  • 資源覆蓋 (靜態和執行階段)

系統屬性

系統屬性是儲存在全域字典中的字串鍵/值組合。build.prop 系統屬性是全系統資源,不僅容易使用,效能負擔也很低。使用系統屬性時,即使系統屬性在多個處理序之間共用,您也不需要使用處理序間通訊 (IPC)。不過,系統屬性與全域變數類似,如果使用不當,可能會造成危害。如果系統屬性遭到濫用,可能會導致安全漏洞等問題,使用者也可能無法存取應用程式。使用系統屬性儲存設定資訊前,請先考慮其他設定選項。

如要進一步瞭解系統屬性,請參閱「新增系統屬性」。

提早啟動裝置設定

在 Android 17 以上版本中,init_dev_config 服務支援裝置設定和系統屬性初始化。這個動態架構機制會在開機初期自動執行。

如果單一系統或供應商映像檔必須支援多個硬體變體,則無法一律在建構時硬式編碼設定值。init_dev_config 服務會在 early-init 階段執行,就在 apexd-bootstrap 之前,讓供應商檢查硬體狀態 (例如來自系統啟動載入程式引數、早期掛接的分區或硬體設定資料表),並在初始化相依服務和程式庫之前,動態初始化系統屬性。

服務整合和生命週期

系統預設會在 init_dev_config 中定義 init.rc 服務,並在 early-init 期間同步執行,然後執行 apexd-bootstrap。整合人員不需要宣告新的 init 服務。

而是使用可執行路徑上的屬性擴充功能,將系統服務宣告與供應商二進位檔分離。整合人員使用 ro.vendor.init_dev_config.path 屬性指定供應商二進位檔的路徑,並設定必要的 SELinux 標籤和權限。

廠商導入規定

如要與 init_dev_config 整合,請按照下列步驟操作:

  1. 在建構時使用 PRODUCT_VENDOR_PROPERTIES 設定供應商二進位檔路徑。提供的二進位路徑必須是系統中已安裝二進位檔的有效路徑:

    PRODUCT_VENDOR_PROPERTIES += \
        ro.vendor.init_dev_config.path=/vendor/bin/init_dev_config
    

    如果未設定這項屬性,init 會略過服務執行作業,並正常繼續啟動。

  2. 由於這項服務會在 apexd-bootstrap 之前執行,因此完整 APEX 提供的 Bionic 程式庫尚未提供。在 Android.bp 中,設定 bootstrap: true

    rust_binary {
        name: "init_dev_config",
        vendor: true,
        srcs: ["src/main.rs"],
        rustlibs: [
            "librustutils",
        ],
        bootstrap: true,
    }
    
  3. 編寫服務邏輯,偵測硬體變體並設定適當的系統屬性:

    use rustutils::system_properties;
    
    fn main() {
        let hw_sku = read_hardware_sku();
    
        // Dynamically initialize vendor-specific properties:
        let display_type = match hw_sku {
            1 => "oled",
            _ => "lcd",
        };
        system_properties::write("vendor.display.panel_type", display_type)
            .expect("Failed to set vendor display property");
    }
    
  4. 使用 init_dev_config_exec 標記供應商二進位檔:

     /vendor/bin/init_dev_config u:object_r:init_dev_config_exec:s0
    
  5. 授予 init_dev_config 網域權限,設定必要資源類型:

     set_prop(init_dev_config, vendor_my_sku_prop)
    

如要瞭解如何使用 init_dev_config 啟用及停用 APEX,請參閱「啟動時選取供應商 APEX」。

HAL 屬性

如果設定的單一事實來源是裝置上的硬體元件,硬體 HAL 必須提供該元件的資訊。在現有 HAL 中定義新的 HAL 方法,以存取設定。如要進一步瞭解如何開發 HAL,請參閱「HAL 的 AIDL」。

系統設定 XML 檔案

如果設定資料是靜態但複雜 (結構化),請考慮使用 XML 或其他類似格式的設定資料。請確保檔案結構定義保持穩定。如果是 XML 檔案,您可以使用 xsd_config 確保架構穩定,並運用自動產生的 XML 剖析器。

資源覆蓋

你可以使用資源疊加層自訂產品。資源疊加層分為兩種類型:

  • 標準資源疊加:用於在建構時自訂產品。如要瞭解標準資源疊加層,請參閱「使用資源疊加層自訂建構作業」。

  • 執行階段資源疊加 (RRO) 可用於在執行階段變更目標套件的資源值。舉例來說,安裝在系統映像檔上的應用程式可能會根據資源的值變更行為。在建構時間硬式編碼資源值,安裝在不同分割區的 RRO 可以在執行階段變更應用程式資源的值。如要進一步瞭解 RRO,請參閱「在執行階段變更應用程式資源的值」。