實作 GKI 模組分區

GKI 和 GKI 模組可獨立於分區的其他部分更新 因為 GKI 模組位於超級映像檔中的個別動態分區 名為 system_dlkm。GKI 模組由 Google 使用核心簽署 建構時間金鑰組,並且只與它們建構時使用的 GKI 相容。 GKI 和 GKI 模組沒有 ABI 穩定性。以便載入模組 請務必在執行階段中正確建構及更新 GKI 和 GKI 模組 。

實作 system_dklm 分區支援

system_dlkm 分區位於超分區中,做為另一個動態值 此分區可包含:

  • Google 建構期間已簽署的核心模組
  • depmod 個成果

建立 system_dlkm

建構 system_dlkm 的程序類似於建立其他動態 多個分區請按照下列步驟將 system_dlkm 新增至建構作業:

  1. BoardConfig.mk 中新增下列項目:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. 在分區清單中,新增 system_dlkmBOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (選��) 如果是 A/B 和虛擬 A/B 裝置,請在 裝置適用的 device.mk 檔案:

    AB_OTA_PARTITIONS += system_dlkm
    

找出要複製到 system_dlkm 的核心模組

您必須建立 GKI 和 GKI 模組,才能在執行階段成功載入模組 。因此,您必須在 GKI 版本中找出針對 並做為 system_dlkm 分區的來源 測試環境

針對 Android 13

BOARD_SYSTEM_DLKM_SRC 指向包含必要 GKI 模組的資料夾 裝置的核心物件檔案,做為建構系統的輸入內容 system_dlkm 分區。例如:

提供資料夾中的 GKI 模組來源,並將 BOARD_SYSTEM_DLKM_SRC 指向 資料夾例如:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

在建構期間,BOARD_SYSTEM_DLKM_SRC 中列出的模組會安裝在 $ANDROID_PRODUCT_OUT/system_dlkm

針對 Android 14

我們已利用巨集簡化導入程序 (BOARD_*_KERNEL_MODULES) 用於其他用途 *_dlkm 個分區。裝置所需的 GKI 模組清單應如下: BOARD_SYSTEM_KERNEL_MODULES 巨集所參照的像素。這些模組在建構期間 會安裝在 $ANDROID_PRODUCT_OUT/system_dlkm 中。位於 vendor_dlkm 分區具有 system_dlkm 中模組的依附元件 分區會在 modules.dep 檔案中產生正確的 vendor_dlkm 個分區。由於應用程式使用跨分區依附元件 建立者:modules.dep 廠商模組隨即會載入,並自動載入所有必要的 GKI 模組。

例如,如要在 GKI 的 system_dlkm 分區中安裝所有 GKI 模組 來自預先建構的 arm64 核心 5.15

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

在執行階段掛接 system_dlkm

根據做為唯讀檔案系統使用的檔案系統,新增 fstab 中以下內容,以在執行階段掛接 system_dlkm 分區:

ext4 做為唯讀檔案系統

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

erofs 做為唯讀檔案系統

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

分區掛接和模組載入

first_stage_init 期間,system_dlkm 分區會掛接在 /system_dlkm 做為唯讀檔案系統。如要順利安裝在座架上,請保持符號化 /system/lib/modules 上有指向 /system_dlkm/lib/modules 的連結 廣告。

接著,供應商程序 (例如 .rc 指令碼) 就能載入核心模組 視您在 modules.load 中指定的順序而定。供應商程序必須使用 使用符號連結 /system/lib/modules 載入模組。 必要時,供應商程序也可以稍後再載入模組。

SELinux

system_dlkm」分區中的每個檔案都會根據 system_dlkm_file。如要在 system_dlkm 分區中載入 GKI 模組檔案, 負責載入模組的廠商程序需要 sepolicy 供應商網域

例如 Cuttlefish 用來載入 GKI 模組的 dlkm_loader 都有 註冊下列權限所需的權限: shared/sepolicy/vendor/dlkm_loader.te

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

驗證 system-dlkm 分區

Google 提供 GKI VTS 測試案例,用於驗證 system_dlkm 分區。目的地: 手動叫用測試,請使用下列 atest 指令:

  atest -c vts_dlkm_partition_test