การทดสอบ VTS พร้อมการดีบัก ramdisk

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

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

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

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

userdebug -> ผู้ใช้ GSI

ลงนามปล่อย

เอสทีเอส ระบบ OEM การแก้ไขข้อบกพร่องของผู้ใช้ เอ็น ใหม่ใน Q
วีทีเอส จีเอสไอ ผู้ใช้

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 หรือ OEM)

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

ข้อกำหนดเบื้องต้นสำหรับการใช้ debug ramdisk

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

ramdisk ดีบักจะไม่ถูกสร้างขึ้นหรือใช้สำหรับการอัพเกรดอุปกรณ์ด้วย:

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

ระบบปฏิบัติการ Android 12 GSI

ไม่จำเป็นต้องมีคำแนะนำเพิ่มเติมเพื่อใช้ debug ramdisk กับ Android 12 GSI

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

ระบบปฏิบัติการ Android 11 GSI

เมื่อใช้ 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 ใหม่ด้วย GSI sepolicy ที่อัปเดตแล้ว

บรรจุ ramdisk ดีบักใหม่

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

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

  1. ดาวน์โหลด otatools.zip จาก https://ci.android.com เราขอแนะนำให้ดาวน์โหลดจาก build artifact ของ 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 build ที่คุณใช้อยู่ ตัวอย่างเช่น หากคุณใช้ arm64 GSI จาก RJR1.211020.001 (7840830) ให้ดาวน์โหลดจาก https://ci.android.com/builds/submit/ 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 เส้นทางภายใน ramdisk ดีบักจะเป็น userdebug_plat_sepolicy.cil เสมอ โดยไม่คำนึงถึงการมีอยู่ของ androidboot.force_normal_boot=1 ในบรรทัดคำสั่งเคอร์เนล ตารางต่อไปนี้แสดงเส้นทางภายใน ramdisk ดีบักใน Android เวอร์ชันต่างๆ

แก้ไขข้อบกพร่องรูปภาพ แอนดรอยด์ 10 แอนดรอยด์ 11 แอนดรอยด์ 12
GKI บูตด้วย-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 ใช้งานได้เนื่องจาก 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