בדיקת VTS באמצעות ramdisk של ניפוי באגים

החל מ-Android 10, Generic System Image (GSI) שמשמש להרצת בדיקות התאימות של CTS-on-GSI/VTS השתנה מסוג build של userdebug לסוג build של user כדי לאפשר חתימה על הגרסה. זו בעיה לבדיקת VTS כי כדי להריץ את VTS צריך את adb root, אבל adb root לא זמין במכשיר עם build של משתמש.

ה-ramdisk לניפוי באגים (או קובץ האימג' של ניפוי באגים) נועד להפעיל את adb root במכשיר build של משתמש שתוכנת האתחול שלו לא נעולה. כך פשוט יותר לבצע את תהליך הבדיקה, כי משתמשים באותו GSI system.img ל-CTS-on-GSI ול-VTS-on-GSI. כדי להגדיר את STS, עדיין צריך להשתמש ב-system.img של OEM אחר עם userdebug.

בטבלה הבאה מוצגים השינויים בסוגים של קובצי אימג' ו-build לצורך בדיקת תאימות ב-Android 10.

חבילת בדיקות בדיקה באמצעות Build ניפוי באגים ב-ramdisk adb root? שינוי של וריאנט build מ-Android 9 ל-10
CTS המערכת של יצרן הציוד המקורי משתמש לא לא ללא שינוי
CTS-on-GSI GSI משתמש לא לא

userdebug -> user GSI

גרסה חתומה

STS מערכת ה-OEM ניפוי באגים ברמת המשתמש לא Y חדש ב-Q
VTS GSI משתמש Y Y

userdebug -> user GSI

גרסה חתומה

סקירה כללית

קובצי התמונות הנוספים האלה נוצרים בתיקיית ה-build‏ (${ANDROID_PRODUCT_OUT}):

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

כש-boot-debug.img מועבר למחיצה boot של המכשיר, נטענים גרסת userdebug של קובץ המדיניות של המערכת וקובץ מאפיין נוסף, adb_debug.prop. כך אפשר להשתמש ב-adb root עם build המשתמש system.img (של GSI או של OEM).

בתמונה גנרית של ליבה (GKI) במכשירים עם מחיצה vendor_boot, אסור לבצע איפוס (flash) של boot-debug.img, כי צריך לבצע איפוס (flash) של המחיצה boot באמצעות תמונת GKI מאושרת. במקום זאת, צריך להריץ את vendor_boot-debug.img במחיצה vendor_boot כדי לאפשר ניפוי באגים של ramdisk.

דרישות מוקדמות לשימוש ב-ramdisk לניפוי באגים

דיסק ה-RAM לניפוי באגים מסופק על ידי יצרן הציוד המקורי שמריץ את בדיקות התאימות. אסור שהיא תהיה חתומה כגרסה זמינה, וניתן להשתמש בה רק אם המכשיר לא נעול.

לא ייוצר דיסק RAM לניפוי באגים ולא ישמש לשדרוג מכשירים עם:

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE נכון
  • skip_initramfs בשורת הפקודה של הליבה

Android 12 GSI

אין צורך בהוראות נוספות כדי להשתמש ב-ramdisk לניפוי באגים עם GSI של Android 12.

החל מ-29 בספטמבר 2021, לא צריך יותר לעדכן את דיסקים זמניים לניפוי באגים באמצעות הכלי repack_bootimg. גרסת build של 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, מדיניות האבטחה של המערכת נטענת מהקובץ userdebug_plat_sepolicy.cil בדיסק ה-RAM לצורכי ניפוי באגים של ה-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.

אריזה מחדש של דיסק RAM לניפוי באגים

במקום לשלב שינויים במדיניות כדי לבנות מחדש את boot-debug.img, השותפים יכולים להשתמש ב-repack_bootimg כדי לעדכן את קובץ המדיניות של GSI ב-boot-debug.img (או ב-vendor_boot-debug.img אם המכשיר משתמש ב-GKI).

השלבים הם:

  1. מורידים את otatools.zip מהכתובת https://ci.android.com. מומלץ להוריד מפריטי ה-build של aosp_arm64-userdebug ב-aosp-main.

  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 מגרסת ה-build של 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 בהתאם להגדרות המכשיר. להסבר מפורט, עיינו בקטע הבא.

נתיב של מדיניות ניפוי הבאגים של המשתמש

הפקודה repack_bootimg מעבירה את הקובץ userdebug_plat_sepolicy.cil מה-ramdisk של --src_bootimg ל-ramdisk של --dst_bootimg. עם זאת, הנתיב ב-ramdisk של ניפוי באגים עשוי להיות שונה בגרסאות שונות של Android. בגרסאות Android 10 ו-11, הנתיב הוא first_stage_ramdisk/userdebug_plat_sepolicy.cil במכשירים עם androidboot.force_normal_boot=1 בשורת הפקודה בליבה (kernel). אחרת, הנתיב הוא 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.

תמונה של ניפוי באגים 10 Android Android 11 12 ‏Android
GKI start-with-debug-ramdisk-${KERNEL_VERSION}.img לא רלוונטי first_stage_ramdisk/userdebug_plat_sepolicy.cil userdebug_plat_sepolicy.cil
קובץ boot-debug.img ספציפי למכשיר תלוי ב-force_normal_boot תלוי ב-Force_regular_boot userdebug_plat_sepolicy.cil
ספק_אתחול-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 ב-Android 11 אל first_stage_ramdisk/userdebug_plat_sepolicy.cil ב-vendor_boot-debug.img ב-Android 11.

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, צריך להוסיף כותרת תחתונה של AVB אחרי שמריצים את הפקודה repack_bootimg.

לדוגמה, לפני שמריצים את repack_bootimg, מריצים את הפקודה הבאה כדי לבדוק אם ל-vendor_boot-debug.img יש כותרת תחתונה של AVB מקושרת.

avbtool info_image --image vendor_boot-debug.img

אם במקור יש לו כותרת תחתונה של AVB מקושרת, צריך להוסיף כותרת תחתונה של AVB אחרי הרצת הפקודה repack_bootimg. אפשר להשתמש בכל מפתח בדיקה כדי לחתום על vendor_boot-debug.img כי אפשר להשתמש ב-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