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
,請完成下列步驟:
在
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
在分區清單中新增
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(選用) 如果是 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 arm64
核心 5.15
的 system_dlkm
分割區上安裝所有 GKI 模組,請執行下列指令:
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