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 در پارتیشن 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 برچسبگذاری میشوند. برای بار کردن فایل واحدهای GKI در پارتیشن system_dlkm،
فرایند فروشنده مسئول بار کردن واحدها به sepolicy در
دامنه فروشنده نیاز دارد.
برای مثال، dlkm_loader که Cuttlefish برای بار کردن واحدهای GKI استفاده میکند، اجازههای زیر را در فایل خطمشی در
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