یک پارتیشن ماژول GKI را پیاده سازی کنید

ماژول‌های 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 به بیلد خود انجام دهید:

  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_dlkm اضافه کنید: BOARD_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 در طول ساخت پلت فرم ارائه دهید.

برای اندروید 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 به بیلد خود انجام دهید:

  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_dlkm اضافه کنید: BOARD_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 در طول ساخت پلت فرم ارائه دهید.

برای اندروید 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