آزمایش VTS با ramdisk اشکال‌زدایی

در Android 10 و نسخه‌های بالاتر، تصویر سیستم عمومی (GSI) که برای اجرای آزمایش انطباق CTS-on-GSI/VTS استفاده می‌شد از نوع ساخت اشکال‌زدایی از سمت کاربر به نوع ساخت کاربر تغییر کرد تا با امضای انتشار سازگار شود. این یک مشکل برای آزمایش VTS است زیرا VTS برای اجرا به adb root نیاز دارد، اما adb root در دستگاه ساخت کاربر دردسترس نیست.

‫ramdisk اشکال‌زدایی (یا تصویر راه‌اندازی اشکال‌زدایی) برای فعال کردن adb root در دستگاه ساخت کاربر که bootloader آن قفل‌باز است معرفی شده است. این کار بااستفاده از ساخت کاربر GSI یکسان system.img برای CTS-on-GSI و VTS-on-GSI، جریان آزمایش را ساده می‌کند. برای راه‌اندازی STS، همچنان باید از OEM کاربر اشکال‌زدایی دیگری system.img استفاده کنید.

جدول زیر تغییرات نوع تصویر و ساخت را برای آزمایش انطباق در Android 10 نشان می‌دهد.

مجموعه آزمون آزمایش کردن با ساخت اشکال‌زدایی ramdisk ‫adb root؟ تغییر تنوع ساخت Android 9 -> 10
CTS سیستم سازنده اصلی محصول کاربر از شمال از شمال تغییری نیست
CTS-on-GSI تصویر سیستم عمومی کاربر از شمال از شمال

userdebug -> کاربر GSI

نسخه پخش امضاشده

STS سیستم سازنده اصلی محصول userdebug از شمال س جدید در Q
VTS GSI کاربر س س

userdebug -> کاربر GSI

نسخه پخش امضاشده

نمای کلی

این فایل‌های تصویر اضافی در پوشه ساخت (${ANDROID_PRODUCT_OUT}) تولید می‌شوند:

  • boot-debug.img
  • vendor_boot-debug.img

وقتی boot-debug.img در پارتیشن boot دستگاه نصب می‌شود، نسخه userdebug فایل sepolicy سیستم و فایل دارایی اضافی، adb_debug.prop، بار می‌شود. این کار به adb root با ساخت کاربر system.img (GSI یا سازنده اصلی محصول) اجازه می‌دهد.

برای تصویر هسته عمومی (GKI) بااستفاده از دستگاه‌هایی که پارتیشن vendor_boot دارند، boot-debug.img نباید فلش شود، زیرا پارتیشن boot باید با تصویر GKI دارای گواهینامه فلش شود. درعوض، vendor_boot-debug.img باید روی vendor_boot پارتیشن چشمک بزند تا اشکال‌زدایی ramdisk تسهیل شود.

پیش‌نیازهای استفاده از ramdisk اشکال‌زدایی

سازنده اصلی محصول که آزمایش‌های انطباق را اجرا می‌کند، ramdisk اشکال‌زدایی را ارائه می‌دهد. نباید امضای نسخه نهایی داشته باشد و فقط درصورتی می‌توان از آن استفاده کرد که قفل دستگاه باز باشد.

از ramdisk اشکال‌زدایی برای ارتقای دستگاه‌های زیر استفاده نخواهد شد یا تولید نخواهد شد:

  • ‫BOARD_BUILD_SYSTEM_ROOT_IMAGE درست
  • ‫skip_initramfs در خط فرمان هسته

‫Android 12 GSI

برای استفاده از ramdisk اشکال‌زدایی با Android 12 GSI، دستورالعمل اضافی لازم نیست.

از تاریخ ۰۹/۲۹/۲۰۲۱، ramdisk‌های اشکال‌زدایی دیگر نیازی به به‌روزرسانی با ابزار repack_bootimg ندارند. ساختمان Android 12 GSI بعداز SGR1.210929.001 (7777720) فایل userdebug_plat_sepolicy.cil به‌روز را در system.img خود ادغام می‌کند و userdebug_plat_sepolicy.cil را از ramdisk اشکال‌زدایی نادیده می‌گیرد. برای جزئیات، CLs را ببینید.

Android 11 GSI

وقتی از boot-debug.img یا vendor_boot-debug.img استفاده می‌شود، سیستم sepolicy از فایل userdebug_plat_sepolicy.cil در ramdisk اشکال‌زدایی boot-debug.img یا vendor_boot-debug.img بار می‌شود. برای راه‌اندازی تصاویر GSI، لطفاً همیشه تغییرات به‌روز sepolicy را از شاخه android11-gsi در boot-debug.img یا vendor_boot-debug.img خود بگنجانید و آن‌ها را بازسازی کنید.

یا می‌توان از ابزار repack_bootimg برای بازسازی boot-debug.img یا vendor_boot-debug.img با sepolicy GSI به‌روزشده استفاده کرد.

بسته‌بندی مجدد ramdisk اشکال‌زدایی

شرکا به‌جای ادغام تغییرات sepolicy برای بازسازی boot-debug.img، می‌توانند از repack_bootimg برای به‌روزرسانی فایل sepolicy «میانای استاندارد عمومی» در boot-debug.img (یا vendor_boot-debug.img درصورتی‌که دستگاه از GKI استفاده می‌کند) استفاده کنند.

مراحل به این صورت است:

  1. otatools.zip را از https://ci.android.com بارگیری کنید. توصیه می‌کنیم از مصنوعات ساخت aosp_cf_arm64_only_phone-userdebug در شاخه aosp-android-latest-release بارگیری کنید.

  2. راه‌اندازی محیط اجرا برای repack_bootimg:

    unzip otatools.zip -d otatools
    export PATH="${PWD}/otatools/bin:${PATH}"
    repack_bootimg --help
  3. userdebug_plat_sepolicy.cil یا boot-with-debug-ramdisk-${KERNEL_VERSION}.img را از ساخت GSI که استفاده می‌کنید بارگیری کنید. برای مثال، اگر از GSI arm64 از RJR1.211020.001 (7840830) استفاده می‌کنید، از https://ci.android.com/builds/submitted/7840830/aosp_arm64-user/latest بارگیری کنید.

  4. دستگاه boot-debug.img یا vendor_boot-debug.img را با userdebug_plat_sepolicy.cil به‌روز کنید:

    repack_bootimg --local --dst_bootimg boot-debug.img \
        --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    # If using GKI
    repack_bootimg --local --dst_bootimg vendor_boot-debug.img \
        --ramdisk_add userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

    با boot-with-debug-ramdisk-${KERNEL_VERSION}.img:

    repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \
        --dst_bootimg boot-debug.img \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil
    # If using GKI
    repack_bootimg --src_bootimg boot-with-debug-ramdisk-5.4.img \
        --dst_bootimg vendor_boot-debug.img \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil \
        --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

    آرگومان‌های --ramdisk_add را می‌توان براساس پیکربندی‌های دستگاه تنظیم کرد. برای توضیحات دقیق، بخش بعدی را ببینید.

مسیر sepolicy کاربر اشکال‌زدایی

دستور بالا repack_bootimg فایل userdebug_plat_sepolicy.cil را از دیسک حافظه --src_bootimg به دیسک حافظه --dst_bootimg کپی می‌کند. بااین‌حال، مسیر در ramdisk اشکال‌زدایی ممکن است در نسخه‌های مختلف Android متفاوت باشد. در Android 10 و 11، مسیر first_stage_ramdisk/userdebug_plat_sepolicy.cil برای دستگاه‌های دارای androidboot.force_normal_boot=1 در خط فرمان هسته است. درغیراین‌صورت، مسیر userdebug_plat_sepolicy.cil است.

فرمان زیر را اجرا کنید تا بررسی کنید آیا androidboot.force_normal_boot در خط فرمان هسته وجود دارد یا نه:

adb root
adb shell cat /proc/cmdline | grep force_normal_boot

در Android 12 و بالاتر، مسیر درون ramdisk اشکال‌زدایی همیشه userdebug_plat_sepolicy.cil است، صرف‌نظر از وجود androidboot.force_normal_boot=1 در خط فرمان هسته. جدول زیر مسیرهای داخل ramdisk اشکال‌زدایی را در نسخه‌های مختلف Android نشان می‌دهد.

اشکال‌زدایی تصویر Android 10 Android 11 ‫Android نسخه ۱۲
GKI boot-with-debug-ramdisk-${KERNEL_VERSION}.img موجود نیست first_stage_ramdisk/userdebug_plat_sepolicy.cil userdebug_plat_sepolicy.cil
boot-debug.img ویژه دستگاه به force_normal_boot بستگی دارد به force_normal_boot بستگی دارد userdebug_plat_sepolicy.cil
vendor_boot-debug.img ویژه دستگاه موجود نیست به force_normal_boot بستگی دارد userdebug_plat_sepolicy.cil

می‌توانید --ramdisk_add را مشخص کنید تا فایل‌ها را از مسیرهای مختلف و به مسیرهای مختلف با فهرستی از src_path:dst_path جفت کپی کنید. برای مثال، فرمان زیر فایل first_stage_ramdisk/userdebug_plat_sepolicy.cil را از Android 11 boot-with-debug-ramdisk-5.4.img در first_stage_ramdisk/userdebug_plat_sepolicy.cil در Android 11 vendor_boot-debug.img کپی می‌کند.

repack_bootimg \
    --src_bootimg boot-with-debug-ramdisk-5.4.img \
    --dst_bootimg vendor_boot-debug.img \
    --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:first_stage_ramdisk/userdebug_plat_sepolicy.cil

اگر androidboot.force_normal_boot=1 در خط فرمان هسته وجود ندارد، باید فرمان را به‌صورت زیر اصلاح کنید تا مسیر مقصد به userdebug_plat_sepolicy.cil تغییر کند.

repack_bootimg \
    --src_bootimg boot-with-debug-ramdisk-5.4.img \
    --dst_bootimg vendor_boot-debug.img \
    --ramdisk_add first_stage_ramdisk/userdebug_plat_sepolicy.cil:userdebug_plat_sepolicy.cil

اگر تصویر منتقل‌شده به --dst_bootimg به‌عنوان AVB-chained پارتیشن پیکربندی شده باشد، پس‌از اجرای فرمان repack_bootimg ، باید یک پانویس AVB اضافه شود.

برای مثال، قبل‌از اجرای repack_bootimg، فرمان زیر را اجرا کنید تا بررسی کنید که آیا vendor_boot-debug.img دارای پانویس AVB زنجیره‌ای است یا خیر.

avbtool info_image --image vendor_boot-debug.img

اگر در ابتدا دارای پانویس AVB زنجیره‌ای باشد، پانویس AVB باید پس‌از اجرای فرمان repack_bootimg اضافه شود. استفاده از هر کلید آزمایشی برای امضای vendor_boot-debug.img کار می‌کند زیرا دیسک مجازی اشکال‌زدایی فقط زمانی قابل‌استفاده است که قفل دستگاه باز باشد، که این امر اجازه می‌دهد تصاویر امضاشده با کلید غیرانتشار در بخش boot یا vendor_boot قرار گیرند.

avbtool add_hash_footer --partition_name vendor_boot \
    --partition_size 100663296 \
    --algorithm SHA256_RSA4096 \
    --key otatools/external/avb/test/data/testkey_rsa4096.pem \
    --image vendor_boot-debug.img