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
分區的來源。
適用於安卓 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
中。
適用於安卓 14
我們透過用於其他*_dlkm
分區的巨集 ( BOARD_*_KERNEL_MODULES
) 簡化了實作。設備所需的 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