การทดสอบ VTS ด้วย RAM การแก้ไขข้อบกพร่อง

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

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

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

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

การแก้ไขข้อบกพร่องของผู้ใช้ -> ผู้ใช้ GSI

ลงนามในผลงานแล้ว

STS ระบบของ OEM การแก้ไขข้อบกพร่องของผู้ใช้ ไม่ใช่ Y ใหม่ใน Q
VTS GSI ผู้ใช้ Y Y

แก้ไขข้อบกพร่องของผู้ใช้ -> ผู้ใช้ GSI

ลงนามในผลงานแล้ว

ภาพรวม

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

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

เมื่อ boot-debug.img กะพริบในพาร์ติชัน boot ของอุปกรณ์ userdebug ของไฟล์นโยบายระบบและไฟล์พร็อพเพอร์ตี้เพิ่มเติม โหลด 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 สำหรับการแก้ไขข้อบกพร่อง

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

ระบบจะไม่สร้างหรือใช้ RAM สำหรับแก้ไขข้อบกพร่องในการอัปเกรดอุปกรณ์ที่มีรายการต่อไปนี้

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

Android 12 GSI

ไม่ต้องมีคำแนะนำเพิ่มเติมในการใช้ RAM แก้ไขข้อบกพร่องกับ Android 12 GSI

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

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 Branch เพื่อสร้าง boot-debug.img หรือ vendor_boot-debug.img ของคุณใหม่

หรือจะใช้เครื่องมือ repack_bootimg เพื่อสร้าง boot-debug.img หรือ vendor_boot-debug.img ที่มีนโยบาย GSI ที่อัปเดตแล้ว

แพ็ค RAM การแก้ไขข้อบกพร่องอีกครั้ง

พาร์ทเนอร์แทนที่จะรวมการเปลี่ยนแปลงนโยบายเพื่อสร้าง boot-debug.img ใหม่ ใช้ repack_bootimg เพื่ออัปเดตไฟล์ sepolicy ของ GSI เป็น boot-debug.img ได้ (หรือ vendor_boot-debug.img หากอุปกรณ์ใช้ GKI)

ขั้นตอนมีดังนี้

  1. ดาวน์โหลด otatools.zip จาก https://ci.android.com เราขอแนะนำให้ดาวน์โหลดจากอาร์ติแฟกต์ของบิลด์ของ 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 จากบิลด์ GSI ที่คุณเป็น ด้วย เช่น หากคุณใช้ arm64 GSI จาก 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 จาก ramdisk ของ --src_bootimg ไปยัง RAM ของ --dst_bootimg อย่างไรก็ตาม เส้นทาง ภายใน RAM การแก้ไขข้อบกพร่องอาจแตกต่างออกไปใน 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 ในบรรทัดคำสั่งของเคอร์เนล ดังต่อไปนี้ ตารางแสดงเส้นทางภายใน RAM การแก้ไขข้อบกพร่องใน Android เวอร์ชันต่างๆ

รูปภาพการแก้ไขข้อบกพร่อง Android 10 Android 11 Android 12
GKI บูตพร้อมแก้ไขข้อบกพร่อง-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
provider_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 after เรียกใช้คำสั่ง repack_bootimg การใช้คีย์ทดสอบเพื่อลงชื่อ vendor_boot-debug.img ทำงานได้เนื่องจาก RAM การแก้ไขข้อบกพร่องจะใช้ได้เฉพาะเมื่อ ปลดล็อกอุปกรณ์แล้ว ซึ่งทำให้มีรูปภาพที่มีคีย์ซึ่งยังไม่ได้เผยแพร่ใน 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