پیاده‌سازی پارتیشن واحد GKI

‫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 به ساختار، مراحل زیر را انجام دهید:

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

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