ใน Android 12 boot อิมเมจทั่วไปที่เรียกว่า
Generic Kernel Image (GKI)
มี ramdisk ทั่วไปและเคอร์เนล GKI
สำหรับอุปกรณ์ที่เปิดตัวพร้อม Android 13 ระบบจะนำ
ramdisk ทั่วไปออกจากอิมเมจ boot และวางไว้ในอิมเมจ init_boot
แยกต่างหาก การเปลี่ยนแปลงนี้จะทำให้bootเหลือเพียงเคอร์เนล GKI เท่านั้น
สำหรับการอัปเกรดอุปกรณ์ที่ยังคงใช้ Android 12
หรือเคอร์เนลเวอร์ชันเก่ากว่านั้น ramdisk ทั่วไปจะยังคงอยู่ที่เดิมโดย
ไม่ต้องใช้init_bootอิมเมจใหม่
หากต้องการสร้าง ramdisk ทั่วไป ให้นำทรัพยากรเฉพาะของผู้ให้บริการออกจาก ramdisk
เพื่อให้ ramdisk ทั่วไปมีเฉพาะinitในระยะแรกและไฟล์พร็อพเพอร์ตี้
ที่มีข้อมูลการประทับเวลา
ในอุปกรณ์ที่มีลักษณะดังนี้
อย่าใช้พาร์ติชัน
recoveryเฉพาะ เนื่องจากบิตการกู้คืนทั้งหมดจะย้ายจาก ramdisk ทั่วไปไปยัง ramdiskvendor_bootใช้พาร์ติชัน
recoveryโดยเฉพาะ ไม่จำเป็นต้องเปลี่ยนแปลงrecoveryramdisk เนื่องจากrecoveryramdisk มีการควบคุมในตัว
สถาปัตยกรรม
แผนภาพต่อไปนี้แสดงสถาปัตยกรรมสำหรับอุปกรณ์ที่ใช้ Android
12 ขึ้นไป
อุปกรณ์ที่เปิดตัวพร้อม Android 13 จะมี
init_bootรูปภาพใหม่ที่มี ramdisk ทั่วไป
อุปกรณ์ที่อัปเกรดจาก Android 12 เป็น Android
13 จะใช้สถาปัตยกรรมเดียวกับที่ใช้ใน
Android 12
เปิดตัวพร้อม Android 13 ไม่มีการกู้คืนเฉพาะ
รูปที่ 1 อุปกรณ์ที่เปิดตัวหรืออัปเกรดเป็น Android 13 ที่มี GKI จะไม่มีการกู้คืนเฉพาะ
เปิดตัวพร้อม Android 13, การกู้คืนเฉพาะและการกู้คืน A/B (ramdisk เฉพาะ)
รูปที่ 2 อุปกรณ์ที่เปิดตัวหรืออัปเกรดเป็น Android 13 ที่มี GKI, การกู้คืนเฉพาะ และการกู้คืน A/B
ดูรูปนี้หากอุปกรณ์มีพาร์ติชัน recovery_a และ recovery_b
เปิดตัวพร้อม Android 13, การกู้คืนเฉพาะและแบบไม่ใช่ A/B (ramdisk เฉพาะ)
รูปที่ 3 อุปกรณ์ที่เปิดตัวหรืออัปเกรดเป็น Android 13 ที่มี GKI, การกู้คืนเฉพาะ และการกู้คืนที่ไม่ใช่ A/B
ดูรูปนี้หากอุปกรณ์มีพาร์ติชันชื่อ recovery ที่ไม่มีคำต่อท้าย
สล็อต
เปิดตัวหรืออัปเกรดเป็น Android 12 โดยไม่มีการกู้คืนเฉพาะ
รูปที่ 4 อุปกรณ์ที่เปิดตัวหรืออัปเกรดเป็น Android 12 ที่มี GKI จะไม่มีการกู้คืนเฉพาะ
เปิดตัวหรืออัปเกรดเป็น Android 12, การกู้คืนเฉพาะและ A/B (ramdisk เฉพาะ)
รูปที่ 5 อุปกรณ์ที่เปิดตัวหรืออัปเกรดเป็น Android 12 ที่มี GKI, การกู้คืนเฉพาะ และการกู้คืน A/B
ดูรูปนี้หากอุปกรณ์มีพาร์ติชัน recovery_a และ recovery_b
เปิดตัวหรืออัปเกรดเป็น Android 12, การกู้คืนเฉพาะและแบบไม่ใช่ A/B (ramdisk เฉพาะ)
รูปที่ 6 อุปกรณ์ที่เปิดตัวหรืออัปเกรดเป็น Android 12 ที่มี GKI, การกู้คืนเฉพาะ และการกู้คืนที่ไม่ใช่ A/B
ดูรูปนี้หากอุปกรณ์มีพาร์ติชันชื่อ recovery ที่ไม่มีคำต่อท้าย
สล็อต
อัปเกรดเป็น Android 12, recovery-as-boot (recovery-as-ramdisk)
รูปที่ 7 อุปกรณ์ที่อัปเกรดเป็น Android 12, ไม่มี GKI, กู้คืนเป็นบูต
อัปเกรดเป็น Android 12, การกู้คืนเฉพาะ (ramdisk เฉพาะ)
รูปที่ 8 อุปกรณ์ที่อัปเกรดเป็น Android 12, ไม่มี GKI, การกู้คืนเฉพาะ
เนื้อหาของอิมเมจบูต
รูปภาพการบูตของ Android มีข้อมูลต่อไปนี้
init_bootเพิ่มรูปภาพสำหรับอุปกรณ์ที่เปิดตัวพร้อม Android 13- เวอร์ชันส่วนหัว V4
- อิมเมจ ramdisk ทั่วไป
รูปภาพ
bootทั่วไป- เวอร์ชันส่วนหัว V3 หรือ
V4
boot_signatureสำหรับการรับรอง boot.img ของ GKI (v4 เท่านั้น) GKIboot.imgที่ ได้รับการรับรองไม่ได้ลงนามสำหรับการเปิดเครื่องที่ได้รับการยืนยัน OEM ยังคงต้องลงนามในboot.imgที่สร้างไว้ล่วงหน้าด้วยคีย์ AVB เฉพาะอุปกรณ์cmdlineทั่วไป (GENERIC_KERNEL_CMDLINE)- เคอร์เนล GKI
- อิมเมจแรมดิสก์ทั่วไป
- รวมเฉพาะใน
bootรูปภาพจาก Android 12 และเวอร์ชันก่อนหน้า
- รวมเฉพาะใน
- เวอร์ชันส่วนหัว V3 หรือ
V4
vendor_bootimage (ดูรายละเอียดได้ที่พาร์ติชันการบูตของผู้ให้บริการ)vendor_bootheadercmdlineเฉพาะอุปกรณ์ (BOARD_KERNEL_CMDLINE)
vendor_bootอิมเมจ ramdisklib/modules- แหล่งข้อมูลการกู้คืน (หากไม่มีการกู้คืนเฉพาะ)
dtbภาพ
recoveryภาพ- ส่วนหัวเวอร์ชัน V2
cmdlineเฉพาะอุปกรณ์สำหรับการกู้คืน หากจำเป็น- สำหรับพาร์ติชันการกู้คืนที่ไม่ใช่ A/B เนื้อหาของส่วนหัวต้องเป็น แบบสแตนด์อโลน ดูอิมเมจการกู้คืน เช่น
cmdlineไม่ได้ต่อท้ายbootและvendor_bootcmdline- ส่วนหัวระบุ DTBO การกู้คืน หากจำเป็น
- สำหรับพาร์ติชันการกู้คืน A/B คุณสามารถต่อเนื้อหาหรืออนุมานเนื้อหาจาก
bootและvendor_bootได้ เช่น cmdlineจะต่อท้ายbootและvendor_bootcmdline- DTBO สามารถอนุมานได้จากส่วนหัว
vendor_boot
recoveryอิมเมจ ramdisk- แหล่งข้อมูลการกู้คืน
- สำหรับพาร์ติชันการกู้คืนที่ไม่ใช่ A/B เนื้อหาของ Ramdisk ต้องเป็น แบบสแตนด์อโลน ดูอิมเมจการกู้คืน เช่น
lib/modulesต้องมีโมดูลเคอร์เนลทั้งหมดที่จำเป็นต่อการบูต โหมดการกู้คืน- Ramdisk การกู้คืนต้องมี
init - สำหรับพาร์ติชันการกู้คืน A/B ระบบจะเพิ่ม ramdisk การกู้คืนไว้ที่ด้านหน้าของ ramdisk ทั่วไปและ
vendor_bootจึงไม่จำเป็นต้องเป็นแบบสแตนด์อโลน เช่น lib/modulesอาจมีเฉพาะโมดูลเคอร์เนลเพิ่มเติมที่จำเป็นต่อการ บูตโหมดการกู้คืนนอกเหนือจากโมดูลเคอร์เนลในvendor_bootramdisk- Symlink ที่
/initอาจมีอยู่ แต่จะถูกบดบังโดยไบนารี/initในระยะแรกในอิมเมจการบูต
- ส่วนหัวเวอร์ชัน V2
เนื้อหาของอิมเมจแรมดิสก์ทั่วไป
ramdisk ทั่วไปประกอบด้วยคอมโพเนนต์ต่อไปนี้
initsystem/etc/ramdisk/build.propro.PRODUCT.bootimg.* buildพร็อพ- ไดเรกทอรีว่างสำหรับจุดติดตั้ง:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/ first_stage_ramdisk/- ไดเรกทอรีว่างที่ซ้ำกันสำหรับจุดติดตั้ง:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- ไดเรกทอรีว่างที่ซ้ำกันสำหรับจุดติดตั้ง:
การผสานรวมอิมเมจบูต
Build flags ควบคุมวิธีสร้างอิมเมจ init_boot, boot, recovery และ vendor_boot
ค่าของตัวแปรบอร์ดบูลีนต้องเป็นสตริง
true หรือว่างเปล่า (ซึ่งเป็นค่าเริ่มต้น)
TARGET_NO_KERNELตัวแปรนี้จะระบุว่าบิลด์ใช้รูปภาพการบูตที่สร้างไว้ล่วงหน้าหรือไม่ หากตั้งค่าตัวแปรนี้เป็นtrueให้ตั้งค่าBOARD_PREBUILT_BOOTIMAGEเป็นตำแหน่งของอิมเมจการบูตที่สร้างไว้ล่วงหน้า (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img)BOARD_USES_RECOVERY_AS_BOOTตัวแปรนี้จะระบุว่าอุปกรณ์ใช้รูปภาพrecoveryเป็นรูปภาพbootหรือไม่ เมื่อใช้ GKI ตัวแปรนี้จะว่างเปล่า และควรย้ายทรัพยากรการกู้คืนไปยังvendor_bootBOARD_USES_GENERIC_KERNEL_IMAGEตัวแปรนี้ระบุว่าบอร์ดใช้ GKI ตัวแปรนี้ไม่ส่งผลต่อ sysprops หรือPRODUCT_PACKAGESนี่คือการสลับ GKI ระดับบอร์ด ตัวแปรต่อไปนี้ทั้งหมด ถูกจำกัดโดยตัวแปรนี้
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOTตัวแปรนี้ควบคุมว่าควรสร้างทรัพยากรการกู้คืน ramdisk ไปยังvendor_bootหรือไม่เมื่อตั้งค่าเป็น
trueระบบจะสร้างทรัพยากรการกู้คืนสำหรับvendor-ramdisk/เท่านั้น และจะไม่สร้างสำหรับrecovery/root/เมื่อว่างเปล่า ระบบจะสร้างแหล่งข้อมูลการกู้คืนไปยัง
recovery/root/เท่านั้น และจะไม่สร้างไปยังvendor-ramdisk/
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOTตัวแปรนี้ควบคุมว่าจะสร้างคีย์ GSI AVB ไปยังvendor_bootหรือไม่เมื่อตั้งค่าเป็น
trueหากBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOTหากตั้งค่าไว้ ระบบจะสร้างคีย์ AVB ของ GSI เป็น
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avbหากไม่ได้ตั้งค่า ระบบจะสร้างคีย์ AVB ของ GSI เพื่อ
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
เมื่อว่างเปล่า หาก
BOARD_RECOVERY_AS_ROOT:หากตั้งค่าไว้ ระบบจะสร้างคีย์ AVB ของ GSI เป็น
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avbหากไม่ได้ตั้งค่า ระบบจะสร้างคีย์ AVB ของ GSI เพื่อ
$ANDROID_PRODUCT_OUT/ramdisk/avb
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGEตัวแปรนี้ควบคุมว่ารูปภาพrecoveryมีเคอร์เนลหรือไม่ อุปกรณ์ที่เปิดตัวด้วย Android 12 และใช้พาร์ติชัน A/Brecoveryต้องตั้งค่าตัวแปรนี้เป็นtrueอุปกรณ์ที่เปิดตัวด้วย Android 12 และใช้ A/B ที่ไม่ใช่ต้องตั้งค่าตัวแปรนี้เป็นfalseเพื่อให้อิมเมจการกู้คืน มีข้อมูลครบถ้วนBOARD_COPY_BOOT_IMAGE_TO_TARGET_FILESตัวแปรนี้ควบคุมว่าจะคัดลอก$OUT/boot*.imgไปยังIMAGES/ในไฟล์เป้าหมายหรือไม่aosp_arm64ต้องตั้งค่าตัวแปรนี้เป็นtrueอุปกรณ์อื่นๆ ต้องเว้นตัวแปรนี้ว่างไว้
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZEตัวแปรนี้จะควบคุมว่าระบบจะสร้างinit_boot.imgหรือไม่ และกำหนดขนาด เมื่อตั้งค่าแล้ว ระบบจะเพิ่ม ramdisk ทั่วไป ลงในinit_boot.imgแทนboot.imgและต้องตั้งค่าตัวแปรBOARD_AVB_INIT_BOOT*สำหรับ vbmeta ที่เชื่อมโยง
ชุดค่าผสมที่อนุญาต
| คอมโพเนนต์หรือตัวแปร | อัปเกรดอุปกรณ์โดยไม่มีพาร์ติชันการกู้คืน | อัปเกรดอุปกรณ์ด้วยพาร์ติชันการกู้คืน | เปิดใช้อุปกรณ์โดยไม่มีพาร์ติชันการกู้คืน | เปิดตัวอุปกรณ์ที่มีพาร์ติชันการกู้คืน A/B | เปิดตัวอุปกรณ์ที่มีพาร์ติชันการกู้คืนที่ไม่ใช่ A/B | aosp_arm64 |
|---|---|---|---|---|---|---|
มี boot |
ใช่ | ใช่ | ใช่ | ใช่ | ใช่ | ใช่ |
มี init_boot (Android 13) |
ไม่ | ไม่ | ใช่ | ใช่ | ใช่ | ใช่ |
มี vendor_boot |
ไม่บังคับ | ไม่บังคับ | ใช่ | ใช่ | ใช่ | ไม่ |
มี recovery |
ไม่ | ใช่ | ไม่ | ใช่ | ใช่ | ไม่ |
BOARD_USES_RECOVERY_AS_BOOT |
true |
ว่าง | ว่าง | ว่าง | ว่าง | ว่าง |
BOARD_USES_GENERIC_KERNEL_IMAGE |
ว่าง | ว่าง | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
ว่าง | true หรือว่างเปล่า |
ว่าง | true หรือว่างเปล่า |
true หรือว่างเปล่า |
ว่าง |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
ว่าง | > 0 | ว่าง | > 0 | > 0 | ว่าง |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
ว่าง | ว่าง | true |
ว่าง | ว่าง | ว่าง |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
ว่าง | ว่าง | true |
true |
true |
ว่าง |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
ว่าง | ว่าง | ว่าง | true |
ว่าง | ว่าง |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
ว่าง | ว่าง | ว่าง | ว่าง | ว่าง | true |
อุปกรณ์ที่มีพาร์ติชัน recovery โดยเฉพาะจะตั้งค่า
PRODUCT_BUILD_RECOVERY_IMAGE เป็น true หรือว่างเปล่าได้ สำหรับอุปกรณ์เหล่านี้ หากตั้งค่า BOARD_RECOVERYIMAGE_PARTITION_SIZE ไว้ ระบบจะสร้างรูปภาพ recovery
เปิดใช้ vbmeta ที่เชื่อมโยงสำหรับการบูต
ต้องเปิดใช้ vbmeta ที่เชื่อมโยงสำหรับรูปภาพ boot และ init_boot ระบุ
ข้อมูลต่อไปนี้
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
โปรดดูตัวอย่างในการเปลี่ยนแปลง นี้
System-as-root
ไม่รองรับ System-as-root สำหรับอุปกรณ์ที่ใช้ GKI ในอุปกรณ์ดังกล่าว BOARD_BUILD_SYSTEM_ROOT_IMAGE ต้องว่างเปล่า นอกจากนี้ อุปกรณ์ที่ใช้พาร์ติชันแบบไดนามิกยังไม่รองรับ System-as-root
ด้วย
การกำหนดค่าผลิตภัณฑ์
อุปกรณ์ที่ใช้ ramdisk ทั่วไปต้องติดตั้งรายการไฟล์ที่
ได้รับอนุญาตให้ติดตั้งใน ramdisk โดยระบุข้อมูลต่อไปนี้ใน
device.mk
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
ไฟล์ generic_ramdisk.mk ยังป้องกันไม่ให้ไฟล์ Make อื่นๆ ติดตั้งไฟล์อื่นๆ ลงใน Ramdisk โดยไม่ตั้งใจ (ย้ายไฟล์ดังกล่าวไปที่ vendor_ramdisk แทน)
ตั้งค่าอุปกรณ์
วิธีการตั้งค่าจะแตกต่างกันระหว่างอุปกรณ์ที่เปิดตัวด้วย Android 13, อัปเกรดเป็น Android 12 และเปิดตัวด้วย Android 12 Android 13 มีการตั้งค่าคล้ายกับ Android 12
อุปกรณ์ที่อัปเกรดเป็น Android 12
สามารถรักษาค่าของ
BOARD_USES_RECOVERY_AS_BOOTได้ หากทำเช่นนั้น แสดงว่ากำลังใช้การกำหนดค่าเดิมและตัวแปรการสร้างใหม่ต้องว่างเปล่า หากอุปกรณ์ดังกล่าวตั้งค่า
BOARD_USES_RECOVERY_AS_BOOTเป็นค่าว่างได้ หากดำเนินการดังกล่าว ผู้ใช้จะใช้ การกำหนดค่าใหม่ หากอุปกรณ์ดังกล่าวอย่าใช้
recoveryพาร์ติชันเฉพาะ สถาปัตยกรรมเป็นดังที่แสดง ในรูปที่ 1 และตัวเลือกการตั้งค่าอุปกรณ์คือตัวเลือก ที่ 1ใช้
recoveryพาร์ติชันเฉพาะ สถาปัตยกรรมเป็นดังที่แสดงในรูปที่ 2กหรือรูปที่ 2ข และตัวเลือกการตั้งค่าอุปกรณ์ คือตัวเลือกที่ 2กหรือตัวเลือกที่ 2ข
อุปกรณ์ที่เปิดตัวพร้อม Android 12 ต้องตั้งค่า
BOARD_USES_RECOVERY_AS_BOOTเป็นค่าว่างและใช้การกำหนดค่าใหม่ หากอุปกรณ์ดังกล่าวอย่าใช้
recoveryพาร์ติชันเฉพาะ สถาปัตยกรรมเป็นดังที่แสดงในรูปที่ 1 และตัวเลือกการตั้งค่าอุปกรณ์คือตัวเลือกที่ 1ใช้
recoveryพาร์ติชันเฉพาะ สถาปัตยกรรมจะเป็นดังที่แสดงในรูปที่ 2ก หรือรูปที่ 2ข และตัวเลือกการตั้งค่าอุปกรณ์ คือตัวเลือกที่ 2ก หรือตัวเลือกที่ 2ข
เนื่องจาก aosp_arm64 สร้างเฉพาะ GKI (ไม่ใช่ vendor_boot หรือการกู้คืน) จึงไม่ใช่เป้าหมายที่สมบูรณ์
สำหรับaosp_arm64การกำหนดค่าบิลด์ โปรดดู
generic_arm64
ตัวเลือกที่ 1: ไม่มีพาร์ติชันการกู้คืนเฉพาะ
อุปกรณ์ที่ไม่มีพาร์ติชัน recovery จะมีรูปภาพ boot ทั่วไปในพาร์ติชัน
boot vendor_boot ramdisk มีทรัพยากรการกู้คืนทั้งหมด
รวมถึง lib/modules (พร้อมโมดูลเคอร์เนลของผู้ให้บริการ) ในอุปกรณ์ดังกล่าว การกำหนดค่าผลิตภัณฑ์จะรับช่วงจาก
generic_ramdisk.mk
ตั้งค่าบอร์ด
กำหนดค่าดังต่อไปนี้
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
ไบนารีและลิงก์สัญลักษณ์ของ Init
vendor_boot ramdisk อาจมี /init ไปยัง /system/bin/init symlink
และ init_second_stage.recovery ที่ /system/bin/init อย่างไรก็ตาม เนื่องจากมีการต่อ ramdisk ทั่วไปหลัง ramdisk vendor_boot
จึงมีการเขียนทับ symlink /init เมื่ออุปกรณ์บูตเข้าสู่การกู้คืน คุณจะต้องมีไบนารี
/system/bin/initเพื่อรองรับการเริ่มต้นระยะที่ 2 เนื้อหา
ของ vendor_boot + ramdisk ทั่วไปมีดังนี้
/init(จาก ramdisk ทั่วไปที่สร้างจากinit_first_stage)/system/bin/init(จากvendor_ramdiskสร้างจากinit_second_stage.recovery)
ย้ายไฟล์ fstab
ย้ายไฟล์ fstab ที่ติดตั้งไปยัง ramdisk ทั่วไปไปที่
vendor_ramdisk โปรดดูตัวอย่างในการเปลี่ยนแปลง
นี้
ติดตั้งโมดูล
คุณสามารถติดตั้งโมดูลเฉพาะอุปกรณ์เพื่อ vendor_ramdisk (ข้ามขั้นตอนนี้หากไม่มีโมดูลเฉพาะอุปกรณ์ที่จะติดตั้ง)
ใช้ตัวแปร
vendor_ramdiskของโมดูลเมื่อติดตั้งโมดูลใน/first_stage_ramdiskโมดูลนี้ควรพร้อมใช้งานหลังจากinitสลับรูทเป็น/first_stage_ramdiskแต่ก่อนที่initจะสลับรูทเป็น/systemดูตัวอย่างได้ที่ผลรวมตรวจสอบของข้อมูลเมตาและ การบีบอัด A/B แบบเสมือนใช้ตัวแปร
recoveryของโมดูลเมื่อติดตั้งโมดูลไปยัง/โมดูลนี้ควรพร้อมใช้งานก่อนที่initจะเปลี่ยนรูทเป็น/first_stage_ramdiskโปรดดูรายละเอียดเกี่ยวกับการติดตั้งโมดูลใน/ที่หัวข้อคอนโซล ระยะแรก
คอนโซลระยะแรก
เนื่องจากคอนโซลในระยะแรกจะเริ่มทำงานก่อนที่ init จะเปลี่ยนรูทเป็น
/first_stage_ramdisk คุณจึงต้องติดตั้งโมดูลเวอร์ชัน recovery
โดยค่าเริ่มต้น ระบบจะติดตั้งทั้ง 2 รูปแบบของโมดูลไว้ที่
build/make/target/product/base_vendor.mk ดังนั้นหากไฟล์ Makefile ของอุปกรณ์รับค่า
จากไฟล์ดังกล่าว คุณก็ไม่ต้องติดตั้งรูปแบบ recovery อย่างชัดเจน
หากต้องการติดตั้งโมดูลการกู้คืนอย่างชัดเจน ให้ใช้คำสั่งต่อไปนี้
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
ซึ่งจะช่วยให้มั่นใจได้ว่า linker, sh และ toybox จะติดตั้งใน
$ANDROID_PRODUCT_OUT/recovery/root/system/bin ซึ่งจะติดตั้งใน
/system/bin ภายใต้ vendor_ramdisk
หากต้องการเพิ่มโมดูลที่จำเป็นสำหรับคอนโซลระยะแรก (เช่น adbd) ให้ใช้คำสั่งต่อไปนี้
PRODUCT_PACKAGES += adbd.recovery
ซึ่งจะช่วยให้มั่นใจได้ว่าโมดูลที่ระบุจะติดตั้งใน
$ANDROID_PRODUCT_OUT/recovery/root/system/bin จากนั้นจะติดตั้งใน
/system/bin ภายใต้ vendor_ramdisk
ผลรวมตรวจสอบของข้อมูลเมตา
หากต้องการรองรับผลรวมตรวจสอบของข้อมูลเมตา
ในระหว่างการติดตั้งในระยะแรก อุปกรณ์ที่ไม่รองรับ GKI จะติดตั้งตัวแปร ramdisk
ของโมดูลต่อไปนี้ หากต้องการเพิ่มการรองรับ GKI ให้ย้ายโมดูลไปยัง
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
โปรดดูตัวอย่างในบันทึกการเปลี่ยนแปลงนี้
การบีบอัด A/B แบบเสมือน
หากต้องการรองรับการบีบอัด A/B แบบเสมือน คุณต้องติดตั้ง snapuserd ใน
vendor_ramdisk อุปกรณ์ควรรับค่าจาก
virtual_ab_ota/compression.mk
ซึ่งจะติดตั้งvendor_ramdiskรุ่นย่อยของ snapuserd
การเปลี่ยนแปลงกระบวนการบูต
กระบวนการบูตเข้าสู่การกู้คืนหรือเข้าสู่ Android จะไม่เปลี่ยนแปลง โดยมีข้อยกเว้นดังนี้
- Ramdisk
build.propย้ายไปที่/second_stage_resourcesเพื่อให้สเตจที่ 2initอ่านการประทับเวลาบิลด์ของการบูตได้
เนื่องจากทรัพยากรจะย้ายจาก ramdisk ทั่วไปไปยัง ramdisk ของ vendor_boot ผลลัพธ์
ของการต่อ ramdisk ทั่วไปกับ ramdisk ของ vendor_boot จึงไม่เปลี่ยนแปลง
ทำให้ e2fsck พร้อมใช้งาน
ไฟล์ Makefile ของอุปกรณ์สามารถรับค่าจากไฟล์ต่อไปนี้
virtual_ab_ota/launch_with_vendor_ramdisk.mkหากอุปกรณ์รองรับ A/B เสมือน แต่ไม่รองรับการบีบอัดvirtual_ab_ota/compression.mkหากอุปกรณ์รองรับการบีบอัด A/B เสมือน
ไฟล์ Make ของผลิตภัณฑ์จะติดตั้ง
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck ในเวลา
รันไทม์ สเตจแรก init จะสลับรูทเป็น /first_stage_ramdisk จากนั้น
จะเรียกใช้ /system/bin/e2fsck
ตัวเลือกที่ 2ก: พาร์ติชันการกู้คืนเฉพาะและพาร์ติชันการกู้คืน A/B
ใช้ตัวเลือกนี้สำหรับอุปกรณ์ที่มีพาร์ติชัน A/B recovery นั่นคือ
อุปกรณ์มี recovery_a และ recovery_b partition อุปกรณ์ดังกล่าวรวมถึงอุปกรณ์ A/B และอุปกรณ์ A/B เสมือนซึ่งสามารถอัปเดตพาร์ติชันการกู้คืนได้ โดยมีการกำหนดค่าต่อไปนี้
AB_OTA_PARTITIONS += recovery
vendor_boot ramdisk มีบิตของผู้ให้บริการของ ramdisk และโมดูลเคอร์เนลของผู้ให้บริการ
ซึ่งรวมถึงรายการต่อไปนี้
ไฟล์
fstabเฉพาะอุปกรณ์lib/modules(รวมถึงโมดูลเคอร์เนลของผู้ให้บริการ)
recovery ramdisk มีทรัพยากรการกู้คืนทั้งหมด ในอุปกรณ์ดังกล่าว การกำหนดค่าผลิตภัณฑ์จะรับช่วงจาก
generic_ramdisk.mk
ตั้งค่าบอร์ด
ตั้งค่าต่อไปนี้สำหรับอุปกรณ์ที่มีพาร์ติชัน A/B recovery
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
ไบนารีและลิงก์สัญลักษณ์ของ Init
recovery ramdisk สามารถมี /init -> /system/bin/init symlink และ
init_second_stage.recovery ที่ /system/bin/init อย่างไรก็ตาม เนื่องจากมีการต่อrecovery ramdisk หลัง boot
ramdisk จึงมีการเขียนทับ/init symlink เมื่ออุปกรณ์บูตเข้าสู่โหมดการกู้คืน คุณจะต้องมี/system/bin/init
ไบนารีเพื่อรองรับการเริ่มต้นระยะที่ 2
เมื่ออุปกรณ์บูตเข้าสู่ recovery เนื้อหาของ recovery +
vendor_boot + ramdisk ทั่วไปจะเป็นดังนี้
/init(จาก ramdisk ที่สร้างจากinit_first_stage)/system/bin/init(จาก Ramdiskrecoveryที่สร้างจากinit_second_stage.recoveryและเรียกใช้จาก/init)
เมื่ออุปกรณ์บูตเข้าสู่ Android เนื้อหาของ vendor_boot + generic
ramdisks จะเป็นดังนี้
/init(จาก ramdisk ทั่วไปที่สร้างจากinit_first_stage)
ย้ายไฟล์ fstab
ย้ายไฟล์ fstab ที่ติดตั้งไปยัง ramdisk ทั่วไปไปยัง
vendor_ramdisk โปรดดูตัวอย่างในการเปลี่ยนแปลง
นี้
ติดตั้งโมดูล
คุณจะติดตั้งโมดูลเฉพาะอุปกรณ์เพื่อ vendor_ramdisk ก็ได้ (ข้ามขั้นตอนนี้หากไม่มีโมดูลเฉพาะอุปกรณ์ที่จะติดตั้ง) Init
ไม่เปลี่ยนรูท โมดูลvendor_ramdiskจะติดตั้งในรูทของ vendor_ramdisk ดูตัวอย่างการติดตั้งโมดูลใน
vendor_ramdiskได้ที่คอนโซลระยะแรก ผลรวมตรวจสอบ
ข้อมูลเมตา และการบีบอัด
A/B เสมือน
คอนโซลระยะแรก
หากต้องการติดตั้งโมดูลเวอร์ชัน vendor_ramdisk ให้ใช้คำสั่งต่อไปนี้
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
ซึ่งจะช่วยให้มั่นใจได้ว่า linker, sh และ toybox จะติดตั้งใน
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin ซึ่งจะติดตั้งใน
/system/bin ภายใต้ vendor_ramdisk
หากต้องการเพิ่มโมดูลที่จำเป็นสำหรับคอนโซลระยะแรก (เช่น adbd) ให้เปิดใช้
ตัวแปร vendor_ramdisk ของโมดูลเหล่านี้โดยอัปโหลดแพตช์ที่เกี่ยวข้องไปยัง
AOSP จากนั้นใช้คำสั่งต่อไปนี้
PRODUCT_PACKAGES += adbd.vendor_ramdisk
ซึ่งจะช่วยให้มั่นใจได้ว่าโมดูลที่ระบุจะติดตั้งใน $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin หากโหลด vendor_boot ramdisk
ในโหมดการกู้คืน โมดูลจะพร้อมใช้งานใน recovery ด้วย หาก
vendor_boot ramdisk ไม่ได้โหลดในโหมดการกู้คืน อุปกรณ์จะ
ติดตั้ง adbd.recovery ด้วยก็ได้
ผลรวมตรวจสอบของข้อมูลเมตา
หากต้องการรองรับผลรวมตรวจสอบของข้อมูลเมตา
ในระหว่างการติดตั้งในระยะแรก อุปกรณ์ที่ไม่รองรับ GKI จะติดตั้งตัวแปร ramdisk
ของโมดูลต่อไปนี้ หากต้องการเพิ่มการรองรับ GKI ให้ย้ายโมดูลไปยัง
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
โปรดดูตัวอย่างในบันทึกการเปลี่ยนแปลงนี้
การบีบอัด A/B แบบเสมือน
หากต้องการรองรับการบีบอัด Virtual A/B คุณต้องติดตั้ง snapuserd ใน
vendor_ramdisk อุปกรณ์ควรรับค่าจาก
virtual_ab_ota/compression.mk
ซึ่งจะติดตั้งvendor_ramdiskรุ่นย่อยของ snapuserd
การเปลี่ยนแปลงกระบวนการบูต
เมื่อบูตเข้าสู่ Android กระบวนการบูตจะไม่เปลี่ยนแปลง vendor_boot +
generic ramdisk จะคล้ายกับกระบวนการบูตที่มีอยู่ ยกเว้นว่า fstab
จะโหลดจาก vendor_boot เนื่องจากไม่มี system/bin/recovery
first_stage_init จึงจัดการเป็นปกติ
เมื่อบูตเข้าสู่โหมดการกู้คืน กระบวนการบูตจะเปลี่ยนไป การกู้คืน +
vendor_boot + ramdisk ทั่วไปจะคล้ายกับกระบวนการกู้คืนที่มีอยู่ แต่
เคอร์เนลจะโหลดจากอิมเมจ boot แทนที่จะโหลดจากอิมเมจ recovery
กระบวนการบูตสำหรับโหมดการกู้คืนมีดังนี้
Bootloader จะเริ่มทำงาน จากนั้นจะทำสิ่งต่อไปนี้
- ส่งการกู้คืน +
vendor_boot+ ramdisk ทั่วไปไปยัง/(ไม่บังคับ หาก OEM ทำซ้ำโมดูลเคอร์เนลใน recovery ramdisk โดยการเพิ่มโมดูลเหล่านั้นลงในBOARD_RECOVERY_KERNEL_MODULES)vendor_boot - เรียกใช้เคอร์เนลจากพาร์ติชัน
boot
- ส่งการกู้คืน +
เคอร์เนลจะติดตั้ง ramdisk ไปยัง
/จากนั้นจะเรียกใช้/initจาก ramdisk ทั่วไปการเริ่มต้นระยะแรกจะเริ่มขึ้น จากนั้นจะดำเนินการต่อไปนี้
- ตั้งค่า
IsRecoveryMode() == trueและForceNormalBoot() == false - โหลดโมดูลเคอร์เนลของผู้ให้บริการจาก
/lib/modules - เรียกใช้
DoFirstStageMount()แต่ข้ามการติดตั้งเนื่องจากIsRecoveryMode() == true(อุปกรณ์ไม่ปล่อย RAMDisk (เนื่องจาก/ยังคงเหมือนเดิม) แต่จะเรียกใช้SetInitAvbVersionInRecovery()) - เริ่มการเริ่มต้นระยะที่ 2 จาก
/system/bin/initจากrecoveryramdisk
- ตั้งค่า
ทำให้ e2fsck พร้อมใช้งาน
ไฟล์ Makefile ของอุปกรณ์สามารถรับค่าจากไฟล์ต่อไปนี้
virtual_ab_ota/launch_with_vendor_ramdisk.mkหากอุปกรณ์รองรับ A/B เสมือน แต่ไม่รองรับการบีบอัดvirtual_ab_ota/compression.mkหากอุปกรณ์รองรับการบีบอัด A/B เสมือน
ไฟล์ Make ของผลิตภัณฑ์จะติดตั้ง
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck ในเวลา
รันไทม์ ขั้นตอนแรกจะinitดำเนินการ/system/bin/e2fsck
ตัวเลือกที่ 2b: พาร์ติชันการกู้คืนเฉพาะและไม่ใช่ A/B
ใช้ตัวเลือกนี้สำหรับอุปกรณ์ที่มีพาร์ติชัน recovery ที่ไม่ใช่ A/B กล่าวคือ
อุปกรณ์มีพาร์ติชันชื่อ recovery ที่ไม่มีคำต่อท้ายของสล็อต อุปกรณ์ดังกล่าว
ได้แก่
- อุปกรณ์ที่ไม่ใช่ A/B
- อุปกรณ์ A/B และ Virtual A/B ซึ่งพาร์ติชันการกู้คืนอัปเดตไม่ได้ (ซึ่งเป็นเรื่องผิดปกติ)
vendor_boot ramdisk มีบิตของผู้ให้บริการของ ramdisk และโมดูลเคอร์เนลของผู้ให้บริการ
ซึ่งรวมถึงรายการต่อไปนี้
- ไฟล์
fstabเฉพาะอุปกรณ์ lib/modules(รวมถึงโมดูลเคอร์เนลของผู้ให้บริการ)
recovery รูปภาพต้องมีเนื้อหาครบถ้วน โดยต้องมีทรัพยากรที่จำเป็นทั้งหมดเพื่อบูตโหมดการกู้คืน ซึ่งรวมถึง
- รูปภาพเคอร์เนล
- อิมเมจ DTBO
- โมดูลเคอร์เนลใน
lib/modules - init ในระยะแรกเป็นลิงก์สัญลักษณ์
/init -> /system/bin/init - ไบนารี init ระยะที่ 2
/system/bin/init - ไฟล์
fstabเฉพาะอุปกรณ์ - แหล่งข้อมูลการกู้คืนอื่นๆ ทั้งหมด รวมถึง
recoveryไบนารี
ในอุปกรณ์ดังกล่าว การกำหนดค่าผลิตภัณฑ์จะรับช่วง
จาก generic_ramdisk.mk
ตั้งค่าบอร์ด
ตั้งค่าต่อไปนี้สำหรับอุปกรณ์ที่ไม่ใช่ A/B
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
ไบนารีและลิงก์สัญลักษณ์ของ Init
recovery ramdisk ต้องมี /init -> /system/bin/init symlink และ
init_second_stage.recovery ที่ /system/bin/init เมื่ออุปกรณ์บูตเข้าสู่
โหมดการกู้คืน คุณจะต้องใช้ไบนารี /system/bin/init เพื่อรองรับทั้ง init ระยะแรกและระยะที่ 2
เมื่ออุปกรณ์บูตเข้าสู่ recovery เนื้อหาของแรมดิสก์ recovery จะเป็นดังนี้
/init -> /system/bin/init(จาก Ramdiskrecovery)/system/bin/init(จาก Ramdiskrecoveryที่สร้างจากinit_second_stage.recoveryและเรียกใช้จาก/init)
เมื่ออุปกรณ์บูตเข้าสู่ Android เนื้อหาของ vendor_boot + generic
ramdisks จะเป็นดังนี้
/init(จาก ramdisk ที่สร้างจากinit_first_stage)
ย้ายไฟล์ fstab
ย้ายไฟล์ fstab ที่ติดตั้งไปยัง ramdisk ทั่วไปไปยัง ramdisk vendor_ramdisk และ recovery โปรดดูตัวอย่างในการเปลี่ยนแปลง
นี้
ติดตั้งโมดูล
คุณสามารถติดตั้งโมดูลเฉพาะอุปกรณ์ไปยัง vendor_ramdisk และ
recovery ramdisk (ข้าม
ขั้นตอนนี้หากไม่มีโมดูลเฉพาะอุปกรณ์ที่จะติดตั้ง) init
ไม่เปลี่ยนรูท โมดูลvendor_ramdiskจะติดตั้งในรูทของ vendor_ramdisk โมดูลเวอร์ชัน recovery จะติดตั้งใน
รูทของ recovery ramdisk ดูตัวอย่างการติดตั้งโมดูลไปยัง
vendor_ramdiskและ recovery ramdisk ได้ที่
คอนโซลระยะแรกและผลรวมตรวจสอบ
ข้อมูลเมตา
คอนโซลระยะแรก
หากต้องการติดตั้งโมดูลเวอร์ชัน vendor_ramdisk ให้ใช้คำสั่งต่อไปนี้
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
ซึ่งจะช่วยให้มั่นใจได้ว่า linker, sh และ toybox จะติดตั้งใน
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin ซึ่งจะติดตั้งใน
/system/bin ภายใต้ vendor_ramdisk
หากต้องการเพิ่มโมดูลที่จำเป็นสำหรับคอนโซลระยะแรก (เช่น adbd) ให้เปิดใช้
ตัวแปร vendor_ramdisk ของโมดูลเหล่านี้โดยอัปโหลดแพตช์ที่เกี่ยวข้องไปยัง
AOSP จากนั้นใช้คำสั่งต่อไปนี้
PRODUCT_PACKAGES += adbd.vendor_ramdisk
ซึ่งจะช่วยให้มั่นใจได้ว่าโมดูลที่ระบุจะติดตั้งใน $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
หากต้องการติดตั้งโมดูลเวอร์ชัน recovery ให้แทนที่ vendor_ramdisk ด้วย
recovery
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
ผลรวมตรวจสอบของข้อมูลเมตา
หากต้องการรองรับผลรวมตรวจสอบของข้อมูลเมตา
ในระหว่างการติดตั้งในระยะแรก อุปกรณ์ที่ไม่รองรับ GKI จะติดตั้งตัวแปร ramdisk
ของโมดูลต่อไปนี้ หากต้องการเพิ่มการรองรับ GKI ให้ย้ายโมดูลไปยัง
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
หากต้องการรองรับการตรวจสอบผลรวมของข้อมูลเมตาระหว่างการติดตั้งในระยะแรกในการกู้คืน ให้เปิดใช้ ตัวแปรการกู้คืนของโมดูลเหล่านี้และติดตั้งด้วย
การเปลี่ยนแปลงกระบวนการบูต
เมื่อบูตเข้าสู่ Android กระบวนการบูตจะไม่เปลี่ยนแปลง vendor_boot +
generic ramdisk จะคล้ายกับกระบวนการบูตที่มีอยู่ ยกเว้นว่า fstab
จะโหลดจาก vendor_boot เนื่องจากไม่มี system/bin/recovery
first_stage_init จึงจัดการเป็นปกติ
เมื่อบูตเข้าสู่โหมดการกู้คืน กระบวนการบูตจะไม่เปลี่ยนแปลง ระบบจะโหลด ramdisk การกู้คืนในลักษณะเดียวกับกระบวนการกู้คืนที่มีอยู่
ระบบจะโหลดเคอร์เนลจากอิมเมจ recovery
กระบวนการบูตสำหรับโหมดการกู้คืนมีดังนี้
Bootloader จะเริ่มทำงาน จากนั้นจะทำสิ่งต่อไปนี้
- ส่ง ramdisk การกู้คืนไปยัง
/ - เรียกใช้เคอร์เนลจากพาร์ติชัน
recovery
- ส่ง ramdisk การกู้คืนไปยัง
เคอร์เนลจะติดตั้ง ramdisk ไปยัง
/จากนั้นจะเรียกใช้/initซึ่งเป็น Symlink ไปยัง/system/bin/initจาก ramdisk ของrecoveryการเริ่มต้นระยะแรกจะเริ่มขึ้น จากนั้นจะดำเนินการต่อไปนี้
- ตั้งค่า
IsRecoveryMode() == trueและForceNormalBoot() == false - โหลดโมดูลเคอร์เนลของผู้ให้บริการจาก
/lib/modules - เรียกใช้
DoFirstStageMount()แต่ข้ามการติดตั้งเนื่องจากIsRecoveryMode() == true(อุปกรณ์ไม่ปล่อย RAMDisk (เนื่องจาก/ยังคงเหมือนเดิม) แต่จะเรียกใช้SetInitAvbVersionInRecovery()) - เริ่มการเริ่มต้นระยะที่ 2 จาก
/system/bin/initจากrecoveryramdisk
- ตั้งค่า
การประทับเวลาของอิมเมจบูต
โค้ดต่อไปนี้เป็นตัวอย่างbootไฟล์การประทับเวลาของรูปภาพ
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file