การทดสอบ VTS ด้วย RAMdisk สำหรับการแก้ไขข้อบกพร่อง

ตั้งแต่ Android 10 เป็นต้นมา Generic System Image (GSI) ที่ใช้ในการทดสอบการปฏิบัติตามข้อกำหนด CTS-on-GSI/VTS ได้เปลี่ยนจากประเภทบิลด์ userdebug เป็น user เพื่อให้สามารถลงนามในการเผยแพร่ได้ นี่เป็นปัญหาสำหรับการทดสอบ VTS เนื่องจาก VTS ต้องใช้ adb root ในการเรียกใช้ แต่ adb root ไม่พร้อมใช้งานในอุปกรณ์ที่สร้างขึ้นสำหรับผู้ใช้

เราขอแนะนำ debug ramdisk (หรืออิมเมจการบูตสำหรับแก้ไขข้อบกพร่อง) เพื่อเปิดใช้ adb root ใน อุปกรณ์ที่สร้างขึ้นสำหรับผู้ใช้ซึ่งมี Bootloader ที่ปลดล็อก ซึ่งจะช่วยลดความซับซ้อนของขั้นตอนการทดสอบ โดยใช้ GSI system.img สำหรับ CTS-on-GSI และ VTS-on-GSI ที่สร้างขึ้นสำหรับผู้ใช้เดียวกัน สำหรับการตั้งค่า STS คุณยังคงต้องใช้ OEM system.img userdebug อื่น

ตารางต่อไปนี้แสดงการเปลี่ยนแปลงประเภทรูปภาพและบิลด์สำหรับการทดสอบการปฏิบัติตามข้อกำหนดใน Android 10

ชุดทดสอบ ทดสอบด้วย สร้าง แก้ไขข้อบกพร่องของ Ramdisk adb root? การเปลี่ยนแปลงตัวแปรบิลด์จาก Android 9 เป็น 10
CTS ระบบของ OEM ผู้ใช้ N N ไม่มีการเปลี่ยนแปลง
CTS-on-GSI GSI ผู้ใช้ N N

userdebug -> user GSI

เผยแพร่โดยมีลายเซ็น

STS ระบบของ OEM userdebug N Y มีอะไรใหม่ใน Q
VTS GSI ผู้ใช้ Y Y

userdebug -> user GSI

เผยแพร่โดยมีลายเซ็น

ภาพรวม

ระบบจะสร้างไฟล์รูปภาพเพิ่มเติมเหล่านี้ในโฟลเดอร์บิลด์ (${ANDROID_PRODUCT_OUT})

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

เมื่อแฟลช boot-debug.img ลงในพาร์ติชัน boot ของอุปกรณ์ ระบบจะโหลดไฟล์ sepolicy ของระบบเวอร์ชัน userdebug และไฟล์พร็อพเพอร์ตี้เพิ่มเติม adb_debug.prop ซึ่งจะช่วยให้ adb root ที่มีบิลด์ของผู้ใช้ system.img (ไม่ว่าจะเป็น GSI หรือของ OEM)

สำหรับ Generic Kernel Image (GKI) ที่ใช้อุปกรณ์ที่มีพาร์ติชัน vendor_boot จะต้องไม่แฟลช boot-debug.img เนื่องจากต้องแฟลชพาร์ติชัน boot ด้วยอิมเมจ GKI ที่ได้รับการรับรอง แต่ควรแฟลช vendor_boot-debug.img ไปยังพาร์ติชัน vendor_boot เพื่อให้การดีบัก ramdisk เป็นไปได้

ข้อกำหนดเบื้องต้นในการใช้ Ramdisk สำหรับการแก้ไขข้อบกพร่อง

OEM ที่ทำการทดสอบการปฏิบัติตามข้อกำหนดจะเป็นผู้จัดเตรียม Ramdisk สำหรับการแก้ไขข้อบกพร่อง โดยต้องไม่ได้รับการลงนามรุ่น และจะใช้ได้ก็ต่อเมื่ออุปกรณ์ปลดล็อกแล้วเท่านั้น

ระบบจะไม่สร้างหรือใช้ debug ramdisk สำหรับการอัปเกรดอุปกรณ์ที่มีคุณสมบัติดังนี้

  • BOARD_BUILD_SYSTEM_ROOT_IMAGE จริง
  • skip_initramfs ในบรรทัดคำสั่งของเคอร์เนล

GSI ของ Android 12

คุณไม่จำเป็นต้องมีวิธีการเพิ่มเติมในการใช้ debug ramdisk กับ GSI ของ Android 12

ตั้งแต่วันที่ 29/09/2021 เป็นต้นไป คุณไม่จำเป็นต้องอัปเดต debug ramdisk ด้วยเครื่องมือ repack_bootimg อีกต่อไป GSI ของ Android 12 ที่สร้างหลังSGR1.210929.001 (7777720)จะรวมไฟล์ userdebug_plat_sepolicy.cil ที่อัปเดตล่าสุด ไว้ใน system.img และไม่สนใจ userdebug_plat_sepolicy.cil จาก debug ramdisk ดูรายละเอียดได้ที่ CL

GSI ของ Android 11

เมื่อใช้ boot-debug.img หรือ vendor_boot-debug.img ระบบจะโหลด sepolicy จากไฟล์ userdebug_plat_sepolicy.cil ใน debug 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 สำหรับการแก้ไขข้อบกพร่องอีกครั้ง

ซึ่งจำเป็นเมื่อใช้ GSI ของ Android 11 เท่านั้น

พาร์ทเนอร์ไม่จำเป็นต้องรวมการเปลี่ยนแปลง sepolicy เพื่อสร้าง boot-debug.img ใหม่ แต่สามารถใช้ repack_bootimg เพื่ออัปเดตไฟล์ sepolicy ของ GSI เป็น 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 สำหรับ userdebug

คำสั่ง 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 ในบรรทัดคำสั่งเคอร์เนล ไม่เช่นนั้น เส้นทางจะเป็น userdebug_plat_sepolicy.cil

เรียกใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่ามี androidboot.force_normal_boot ในบรรทัดคำสั่งของเคอร์เนลหรือไม่

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

ตั้งแต่ Android 12 เป็นต้นไป เส้นทางภายใน debug ramdisk จะเป็น userdebug_plat_sepolicy.cil เสมอ ไม่ว่าจะมี androidboot.force_normal_boot=1 ในบรรทัดคำสั่งของเคอร์เนลหรือไม่ก็ตาม ตารางต่อไปนี้แสดงเส้นทางภายใน ramdisk การแก้ไขข้อบกพร่องใน Android เวอร์ชันต่างๆ

รูปภาพการแก้ไขข้อบกพร่อง Android 10 Android 11 Android 12
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 คุณจะต้องเพิ่มส่วนท้ายของ 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 จะใช้งานได้เนื่องจากใช้ 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