تست VTS با دیباگ ramdisk

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

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

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

مجموعه تست تست با ساختن اشکال‌زدایی رم‌دیسک ریشه adb؟ تغییر نوع ساخت اندروید ۹ به ۱۰
سی تی اس سیستم OEM کاربر ن ن بدون تغییر
CTS-on-GSI جی اس آی کاربر ن ن

userdebug -> کاربر GSI

انتشار امضا شد

اس تی اس سیستم OEM کاربرdebug ن ی جدید در Q
وی تی اس جی اس آی کاربر ی ی

userdebug -> کاربر GSI

انتشار امضا شد

نمای کلی

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

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

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

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

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

دیباگ رم‌دیسک توسط تولیدکننده اصلی (OEM) که تست‌های انطباق را اجرا می‌کند، ارائه می‌شود. این دیوایس نباید دارای امضای انتشار باشد و فقط در صورت باز بودن قفل دستگاه قابل استفاده است.

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

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

اندروید ۱۲ جی‌اس‌آی

برای استفاده از debug ramdisk با Android 12 GSI هیچ دستورالعمل اضافی لازم نیست.

از تاریخ 29/09/2021، دیباگ رم‌دیسک‌ها دیگر نیازی به به‌روزرسانی با ابزار repack_bootimg ندارند. نسخه اندروید 12 GSI بیلد پس از SGR1.210929.001 (7777720) فایل به‌روز userdebug_plat_sepolicy.cil را در system.img خود گنجانده و userdebug_plat_sepolicy.cil را از دیباگ رم‌دیسک نادیده می‌گیرد. برای جزئیات بیشتر به CLها مراجعه کنید.

اندروید ۱۱ جی اس آی

وقتی از boot-debug.img یا vendor_boot-debug.img استفاده می‌شود، sepolicy سیستم از فایل userdebug_plat_sepolicy.cil در ramdisk مربوط به debug مربوط به 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 با به‌روزرسانی بخش GSI استفاده کرد.

یک رم‌دیسک دیباگ را دوباره بسته‌بندی کنید

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

مراحل به شرح زیر است:

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

  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 که استفاده می‌کنید دانلود کنید. برای مثال، اگر از arm64 GSI با RJR1.211020.001 (7840830) استفاده می‌کنید، فایل 7840830 /aosp_arm64-user/latest را از https://ci.android.com/builds/submitted/ دانلود کنید.

  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 می‌توانند بر اساس پیکربندی دستگاه تنظیم شوند. برای توضیح بیشتر به بخش بعدی مراجعه کنید.

مسیر بخش userdebug

دستور repack_bootimg بالا، فایل userdebug_plat_sepolicy.cil را از ramdisk مربوط به --src_bootimg به ramdisk مربوط به --dst_bootimg کپی می‌کند. با این حال، مسیر درون یک ramdisk مربوط به debug ممکن است در نسخه‌های مختلف اندروید متفاوت باشد. در اندروید ۱۰ و ۱۱، مسیر 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

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

تصویر اشکال‌زدایی اندروید ۱۰ اندروید ۱۱ اندروید ۱۲
بوت GKI با دیباگ-رم‌دیسک-${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 را از boot-with-debug-ramdisk-5.4.img اندروید ۱۱ به first_stage_ramdisk/userdebug_plat_sepolicy.cil در داخل 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 پیکربندی شده باشد، پس از اجرای دستور repack_bootimg باید یک پاورقی AVB اضافه شود.

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

avbtool info_image --image vendor_boot-debug.img

اگر در ابتدا دارای یک پاورقی AVB زنجیر شده باشد، باید پس از اجرای دستور repack_bootimg یک پاورقی AVB اضافه شود. استفاده از هر کلید آزمایشی برای امضای vendor_boot-debug.img کار می‌کند زیرا debug ramdisk فقط زمانی قابل استفاده است که دستگاه قفل‌گشایی شده باشد، که امکان ایجاد تصاویر امضا شده با کلید غیر آزاد را در پارتیشن 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