ماژولهای GKI و GKI را میتوان بهطور مستقل از بقیه پارتیشن بهروزرسانی کرد، زیرا ماژولهای GKI روی یک پارتیشن پویا جداگانه در تصویر فوقالعاده به نام system_dlkm
قرار دارند. ماژولهای GKI توسط Google با استفاده از جفت کلید زمان ساخت هسته امضا میشوند و فقط با GKI که با آن ساخته شدهاند سازگار هستند. هیچ ثبات ABI بین ماژول های GKI و GKI وجود ندارد. برای بارگیری صحیح ماژول ها در زمان اجرا، ماژول های GKI و GKI باید با هم ساخته و به روز شوند.
پیاده سازی پشتیبانی از پارتیشن system_dklm
پارتیشن system_dlkm
در پارتیشن super به عنوان پارتیشن پویا دیگر قرار دارد. این پارتیشن می تواند شامل موارد زیر باشد:
- ماژول های هسته امضا شده در زمان ساخت گوگل
- مصنوعات
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
برای ایجاد پارتیشن system_dlkm
BOARD_SYSTEM_DLKM_SRC
به پوشهای حاوی فایلهای شی هسته ماژولهای GKI مورد نیاز برای دستگاه، اشاره کنید. به عنوان مثال:
منبع ماژول های 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
ما پیاده سازی را با استفاده از ماکروهای ( 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)
mount 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
ماژولهای GKI و GKI را میتوان بهطور مستقل از بقیه پارتیشن بهروزرسانی کرد، زیرا ماژولهای GKI روی یک پارتیشن پویا جداگانه در تصویر فوقالعاده به نام system_dlkm
قرار دارند. ماژولهای GKI توسط Google با استفاده از جفت کلید زمان ساخت هسته امضا میشوند و فقط با GKI که با آن ساخته شدهاند سازگار هستند. هیچ ثبات ABI بین ماژول های GKI و GKI وجود ندارد. برای بارگیری صحیح ماژول ها در زمان اجرا، ماژول های GKI و GKI باید با هم ساخته و به روز شوند.
پیاده سازی پشتیبانی از پارتیشن system_dklm
پارتیشن system_dlkm
در پارتیشن super به عنوان پارتیشن پویا دیگر قرار دارد. این پارتیشن می تواند شامل موارد زیر باشد:
- ماژول های هسته امضا شده در زمان ساخت گوگل
- مصنوعات
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
برای ایجاد پارتیشن system_dlkm
BOARD_SYSTEM_DLKM_SRC
به پوشهای حاوی فایلهای شی هسته ماژولهای GKI مورد نیاز برای دستگاه، اشاره کنید. به عنوان مثال:
منبع ماژول های 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
ما پیاده سازی را با استفاده از ماکروهای ( 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)
mount 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