การย้าย Fastboot ไปยัง Userspace

Android 10 และสูงกว่ารองรับพาร์ติชั่นที่ปรับขนาดได้โดยย้ายการติดตั้ง fastboot จาก bootloader ไปยัง userspace การย้ายตำแหน่งนี้ทำให้สามารถย้ายโค้ดที่กะพริบไปยังตำแหน่งทั่วไปที่บำรุงรักษาและทดสอบได้ โดยมีเพียงส่วนเฉพาะของผู้จำหน่ายของ fastboot ที่ปรับใช้โดย hardware abstraction layer (HAL) นอกจากนี้ Android 12 และสูงกว่ายังรองรับ ramdisks แบบแฟลชผ่านคำสั่ง fastboot ที่เพิ่มเข้ามา

Unifying fastboot และการกู้คืน

เนื่องจาก fastboot ของ userspace และการกู้คืนมีความคล้ายคลึงกัน คุณสามารถรวมไว้ในพาร์ติชันเดียวหรือไบนารี สิ่งนี้ให้ข้อดี เช่น การใช้พื้นที่น้อยลง มีพาร์ติชั่นโดยรวมน้อยลง และให้ fastboot และการกู้คืนแชร์เคอร์เนลและไลบรารี

ที่ให้การสนับสนุน fastbootd , bootloader จะต้องใช้คำสั่งบล็อกการควบคุมบูตใหม่ (BCB) ของ boot-fastboot ในการป้อน fastbootd โหมด bootloader เขียน boot-fastboot ลงในช่องคำสั่งของข้อความ BCB และใบ recovery ข้อมูลของ BCB ไม่เปลี่ยนแปลง (เพื่อเปิดใช้งานการกู้คืนเริ่มต้นใหม่ขัดจังหวะใด ๆ ) status , stage และ reserved สาขาที่ยังคงไม่เปลี่ยนแปลงเช่นกัน โหลด bootloader และรองเท้าเป็นภาพการกู้คืนเมื่อเห็น boot-fastboot ในด้านคำสั่ง BCB การกู้คืนจากนั้นจะแยกวิเคราะห์ข้อความ BCB และสลับไป fastbootd โหมด

คำสั่ง ADB

ในส่วนนี้จะอธิบายถึง adb คำสั่งสำหรับการบูรณาการ fastbootd คำสั่งมีผลลัพธ์ที่แตกต่างกัน ขึ้นอยู่กับว่าดำเนินการโดยระบบหรือโดยการกู้คืน

สั่งการ คำอธิบาย
reboot fastboot
  • เรียบเข้า fastbootd (ระบบ)
  • เข้าสู่ fastbootd โดยตรงโดยไม่ต้องรีบูต (กู้คืน)

คำสั่ง Fastboot

ส่วนนี้จะอธิบายคำสั่ง fastboot สำหรับการบูรณาการ fastbootd รวมทั้งคำสั่งใหม่สำหรับกระพริบและการจัดการพาร์ทิชันตรรกะ คำสั่งบางคนมีผลลัพธ์ที่แตกต่างขึ้นอยู่กับว่าพวกเขาได้รับการดำเนินการโดย bootloader หรือ fastbootd

สั่งการ คำอธิบาย
reboot recovery
  • รีบูตเข้าสู่การกู้คืน (bootloader)
  • เข้าสู่การกู้คืนโดยตรงโดยไม่ต้องรีบูต ( fastbootd )
reboot fastboot เรียบเข้า fastbootd
getvar is-userspace
  • ผลตอบแทนที่ yes ( fastbootd )
  • ผลตอบแทนที่ no (bootloader)
getvar is-logical: <partition> ผลตอบแทนที่ yes ถ้าพาร์ทิชันที่กำหนดเป็นพาร์ทิชันตรรกะ no อย่างอื่น โลจิคัลพาร์ติชันรองรับคำสั่งทั้งหมดที่แสดงด้านล่าง
getvar super-partition-name ส่งกลับชื่อของพาร์ติชันพิเศษ ชื่อจะรวมส่วนต่อท้ายสล็อตปัจจุบันหากซูเปอร์พาร์ติชั่นเป็นพาร์ติชั่น A/B (โดยปกติไม่ใช่)
create-logical-partition <partition> <size> สร้างโลจิคัลพาร์ติชันด้วยชื่อและขนาดที่กำหนด ชื่อต้องไม่มีอยู่แล้วเป็นโลจิคัลพาร์ติชัน
delete-logical-partition <partition> ลบโลจิคัลพาร์ติชันที่กำหนด (ล้างพาร์ติชันอย่างมีประสิทธิภาพ)
resize-logical-partition <partition> <size> ปรับขนาดโลจิคัลพาร์ติชันเป็นขนาดใหม่โดยไม่ต้องเปลี่ยนเนื้อหา ล้มเหลวหากไม่มีพื้นที่ว่างเพียงพอสำหรับการปรับขนาด
update-super <partition> การผสานการเปลี่ยนแปลงข้อมูลเมตาของพาร์ติชันพิเศษ หากไม่สามารถผสานได้ (เช่น รูปแบบบนอุปกรณ์เป็นเวอร์ชันที่ไม่รองรับ) คำสั่งนี้จะล้มเหลว ตัวเลือก wipe พารามิเตอร์เขียนทับข้อมูลเมตาของอุปกรณ์ที่มีประสิทธิภาพมากกว่าการผสาน
flash <partition> [ <filename> ] เขียนไฟล์ไปยังพาร์ติชั่นแฟลช อุปกรณ์ต้องอยู่ในสถานะปลดล็อก
erase <partition> ลบพาร์ติชัน (ไม่จำเป็นต้องลบอย่างปลอดภัย) อุปกรณ์ต้องอยู่ในสถานะปลดล็อก
getvar <variable> | all แสดงตัวแปร bootloader หรือตัวแปรทั้งหมด หากไม่มีตัวแปร ให้ส่งคืนข้อผิดพลาด
set_active <slot>

ชุดที่ได้รับ A / B สล็อตบูตตาม active ในการพยายามบู๊ตครั้งถัดไป ระบบจะบู๊ตจากสล็อตที่ระบุ

สำหรับการสนับสนุน A/B สล็อตคือชุดของพาร์ติชั่นที่ซ้ำกันซึ่งสามารถบูตจากอิสระได้ สล็อตมีชื่อ , a b และอื่น ๆ และแตกต่างโดยการเพิ่มคำต่อท้าย _a , _b , และอื่น ๆ เพื่อชื่อพาร์ทิชัน

reboot รีบูตอุปกรณ์ตามปกติ
reboot-bootloader (หรือ reboot bootloader ) รีบูตอุปกรณ์ใน bootloader
fastboot fetch vendor_boot <out.img>

ใช้ใน Android 12 และสูงกว่าที่จะสนับสนุน ramdisks ผู้ขายกระพริบ

รับขนาดพาร์ติชั่นทั้งหมดและขนาดก้อน ได้รับข้อมูลสำหรับแต่ละก้อนแล้วเย็บข้อมูลร่วมกันเพื่อ <out.img>

โปรดดูรายละเอียด fastboot fetch vendor_boot <out.img>

fastboot flash vendor_boot:default <vendor-ramdisk.img>

ใช้ใน Android 12 และสูงกว่าที่จะสนับสนุนผู้ขาย ramdisks กระพริบ

นี่เป็นรูปแบบพิเศษของคำสั่งแฟลช มันดำเนินการ fetch vendor_boot ฟังก์ชั่นภาพเช่นถ้า fastboot fetch ที่ถูกเรียกว่า ใหม่ vendor_boot ภาพกะพริบขึ้นอยู่กับว่ารุ่นหัวบูตเป็นรุ่นที่ 3 หรือ 4 รุ่น

ดูรายละเอียด fastboot flash vendor_boot:default <vendor-ramdisk.img>

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> ใช้ใน Android 12 และสูงกว่าที่จะสนับสนุนผู้ขาย ramdisks กระพริบ

จะดึง vendor_boot ภาพ ส่งกลับข้อผิดพลาดหากส่วนหัวการบูตของผู้จัดจำหน่ายเป็นเวอร์ชัน 3 ถ้าเป็นเวอร์ชัน 4 จะพบส่วน ramdisk ของผู้ขายที่ถูกต้อง (ถ้ามี) มันแทนที่ที่มีภาพที่กำหนดให้คำนวณขนาดและการชดเชยและกะพริบใหม่ vendor_boot image

ดูรายละเอียด fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

Fastboot และ bootloader

bootloader กะพริบ bootloader , radio และ boot/recovery พาร์ทิชันหลังจากที่รองเท้าอุปกรณ์เข้า fastboot (userspace) และกะพริบพาร์ทิชันอื่น ๆ ทั้งหมด bootloader ควรสนับสนุนคำสั่งต่อไปนี้

สั่งการ คำอธิบาย
download ดาวน์โหลดรูปภาพเพื่อแฟลช
flash recovery <image> / flash boot <image> / flash bootloader <image> / กะพริบ recovery/boot พาร์ทิชันและ bootloader
reboot รีบูตอุปกรณ์
reboot fastboot รีบูตเป็น fastboot
reboot recovery รีบูตเพื่อกู้คืน
getvar ได้รับตัวแปร bootloader ที่จำเป็นสำหรับการกระพริบของภาพการกู้คืน / boot (ตัวอย่างเช่น current-slot และ max-download-size )
oem <command> คำสั่งที่กำหนดโดย OEM

พาร์ติชันแบบไดนามิก

bootloader ต้องไม่อนุญาตให้มีการกระพริบหรือลบพาร์ติชันแบบไดนามิกและต้องกลับข้อผิดพลาดหากการดำเนินการเหล่านี้จะพยายาม สำหรับอุปกรณ์พาร์ติชั่นไดนามิกที่ได้รับการปรับปรุงใหม่ เครื่องมือ fastboot (และ bootloader) รองรับโหมดบังคับเพื่อแฟลชพาร์ติชั่นไดนามิกโดยตรงในขณะที่อยู่ในโหมด bootloader ตัวอย่างเช่นถ้า system เป็นพาร์ทิชันแบบไดนามิกบนอุปกรณ์ดัดแปลงโดยใช้ fastboot --force flash system คำสั่งช่วยให้ bootloader (แทน fastbootd ) เพื่อแฟลชพาร์ทิชัน

การชาร์จนอกโหมด

ถ้าอุปกรณ์สนับสนุนปิดโหมดการชาร์จหรือมิฉะนั้น autoboots เข้าสู่โหมดพิเศษเมื่อไฟถูกนำไปใช้การดำเนินการของ fastboot oem off-mode-charge 0 คำสั่งต้องบายพาสโหมดพิเศษเหล่านี้เพื่อให้รองเท้าอุปกรณ์เช่นถ้าผู้ใช้มีการกด ปุ่มเปิดปิด

Fastboot OEM HAL

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

คำจำกัดความของ fastboot HAL มีดังนี้:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

เปิดใช้งาน fastbootd

ต้องการเปิดใช้งาน fastbootd บนอุปกรณ์:

  1. เพิ่ม fastbootd เพื่อ PRODUCT_PACKAGES ใน device.mk : PRODUCT_PACKAGES += fastbootd

  2. ตรวจสอบให้แน่ใจว่า fastboot HAL, การควบคุมการบูต HAL และ HAL สถานภาพได้รับการบรรจุเป็นส่วนหนึ่งของอิมเมจการกู้คืน

  3. เพิ่มสิทธิ์ SEPolicy เฉพาะอุปกรณ์ใด ๆ ที่จำเป็นโดย fastbootd ยกตัวอย่างเช่น fastbootd ต้องมีการเข้าถึงการเขียนไปยังพาร์ทิชันเฉพาะอุปกรณ์ที่จะแฟลชพาร์ติชันที่ นอกจากนี้ การใช้งาน fastboot HAL อาจต้องใช้สิทธิ์เฉพาะอุปกรณ์

ในการตรวจสอบ userspace fastboot รัน ผู้ขาย Test Suite (VTS)

ramdisks ผู้ขายที่กระพริบ

Android 12 และสูงกว่าให้การสนับสนุนสำหรับกระพริบ ramdisks กับคำสั่ง fastboot เสริมว่าดึงเต็ม vendor_boot ภาพจากอุปกรณ์ คำสั่งจะแจ้งให้เครื่องมือ fastboot ฝั่งโฮสต์อ่านส่วนหัวการบูตของผู้จำหน่าย รีอิมเมจ และแฟลชอิมเมจใหม่

ที่จะดึงเต็ม vendor_boot ภาพคำสั่ง fetch:vendor_boot ถูกบันทึกอยู่ในทั้งโปรโตคอล fastboot และการดำเนินงานของโปรโตคอล fastbootd ใน Android 12. โปรดทราบว่า fastbootd ไม่ดำเนินการนี้ แต่ bootloader ตัวเองอาจจะไม่ OEMs สามารถเพิ่ม fetch:vendor_boot คำสั่งในการดำเนินการของพวกเขา bootloader ของโปรโตคอล อย่างไรก็ตาม หากระบบไม่รู้จักคำสั่งในโหมด bootloader การกะพริบ ramdisks ของผู้จำหน่ายแต่ละรายในโหมด bootloader จะไม่ใช่ตัวเลือกที่ผู้ขายสนับสนุน

การเปลี่ยนแปลง Bootloader

คำสั่ง getvar:max-fetch-size และ fetch:name จะดำเนินการใน fastbootd เพื่อรองรับ ramdisks ของผู้จำหน่ายที่กระพริบใน bootloader คุณต้องใช้สองคำสั่งนี้

Fastbootd การเปลี่ยนแปลง

getvar:max-fetch-size คล้ายกับ max-download-size ระบุขนาดสูงสุดที่อุปกรณ์สามารถส่งในการตอบสนอง DATA เดียว ไดรเวอร์ต้องไม่ดึงข้อมูลขนาดใหญ่กว่าค่านี้

fetch:name[:offset[:size]] ดำเนินการชุดของการตรวจสอบบนอุปกรณ์ หากทุกอย่างต่อไปนี้เป็นความจริงที่ fetch:name[:offset[:size]] ข้อมูลคำสั่งส่งกลับ:

  • อุปกรณ์กำลังใช้งานบิลด์ที่แก้ไขจุดบกพร่องได้
  • ปลดล็อกอุปกรณ์แล้ว (สถานะบูตเป็นสีส้ม)
  • ชื่อพาร์ทิชันที่ดึงมาเป็น vendor_boot
  • size คุ้มค่าอยู่ภายใน 0 < size <= max-fetch-size

เมื่อเหล่านี้จะมีการตรวจสอบ fetch:name[:offset[:size]] ผลตอบแทนขนาดพาร์ทิชันและชดเชย สังเกตสิ่งต่อไปนี้:

  • fetch:name เทียบเท่ากับการ fetch:name:0 ซึ่งเทียบเท่ากับการ fetch:name:0:partition_size
  • fetch:name:offset จะเทียบเท่ากับการ fetch:name:offset:(partition_size - offset)

ดังนั้นจึง fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

เมื่อ offset หรือ partition_size (หรือทั้งสอง) จะไม่ได้ระบุค่าเริ่มต้นที่มีการใช้ซึ่งสำหรับ offset เป็น 0 และ size เป็นค่าที่คำนวณได้จาก partition_size - offset

  • Offset ระบุขนาดที่ไม่ระบุ: size = partition_size - offset
  • ไม่ระบุค่าเริ่มต้นที่ใช้สำหรับทั้งสอง size = partition_size - 0

ยกตัวอย่างเช่นการ fetch:foo เรียกทั้ง foo พาร์ทิชันที่ออฟเซต 0

การเปลี่ยนแปลงไดรเวอร์

มีการเพิ่มคำสั่งในเครื่องมือ fastboot เพื่อใช้การเปลี่ยนแปลงไดรเวอร์ แต่ละครั้งจะถูกเชื่อมโยงกับความคมชัดอย่างเต็มรูปแบบในตารางของ คำสั่ง Fastboot

  • fastboot fetch vendor_boot out.img

    • โทร getvar max-fetch-size เพื่อกำหนดขนาดก้อน
    • โทร getvar partition-size:vendor_boot[_a] เพื่อกำหนดขนาดของพาร์ทิชันทั้งหมด
    • โทร fastboot fetch vendor_boot[_a]:offset:size สำหรับแต่ละก้อน (ขนาดก้อนมากกว่า vendor_boot ขนาดเพื่อให้มีได้ตามปกติเพียงหนึ่งก้อน.)
    • เย็บแผลข้อมูลร่วมกันเพื่อ out.img
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    นี่เป็นรูปแบบพิเศษของคำสั่งแฟลช มันจะดึง vendor_boot ภาพเช่นถ้า fastboot fetch ที่ถูกเรียกว่า

    • ถ้าบูตผู้ขายเป็นส่วนหัว 3 รุ่น ก็จะต่อไปนี้:
      • แทนที่ ramdisk ของผู้จำหน่ายด้วยอิมเมจที่กำหนด
      • กะพริบใหม่ vendor_boot ภาพ
    • ถ้าส่วนหัวบูตผู้ขายเป็น รุ่นที่ 4 ก็จะต่อไปนี้:
      • แทนที่ ramdisk ผู้ขายทั้งที่มีภาพที่กำหนดเพื่อให้ภาพที่ได้รับจะกลายเป็นส่วนของผู้ขาย ramdisk เฉพาะใน vendor_boot ภาพ
      • คำนวณขนาดและออฟเซ็ตใหม่ในตาราง ramdisk ของผู้จัดจำหน่าย
      • กะพริบใหม่ vendor_boot ภาพ
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    เรียก vendor_boot image เช่นถ้า fastboot fetch ที่ถูกเรียกว่า

    • หากส่วนหัวการบูตของผู้จัดจำหน่ายเป็นเวอร์ชัน 3 จะแสดงข้อผิดพลาด
    • หากส่วนหัวการบูตของผู้จัดจำหน่ายเป็นเวอร์ชัน 4 ให้ทำดังต่อไปนี้:

      • พบชิ้นส่วนของผู้ขาย ramdisk ที่มีชื่อ foo หากไม่พบ หรือหากมีรายการที่ตรงกันหลายรายการ ให้แสดงข้อผิดพลาด
      • แทนที่แฟรกเมนต์ ramdisk ของผู้จำหน่ายด้วยอิมเมจที่กำหนด
      • คำนวณใหม่แต่ละขนาดและออฟเซ็ตในตาราง ramdisk ของผู้จัดจำหน่าย
      • กะพริบใหม่ vendor_boot ภาพ

mkbootimg

ชื่อ default ถูกสงวนไว้สำหรับการตั้งชื่อของผู้ขายเศษ ramdisk ใน Android 12 และสูงกว่า ในขณะที่ fastboot flash vendor_boot:default ความหมายยังคงเหมือนเดิมคุณจะต้องไม่ตั้งชื่อเศษ ramdisk ของคุณเป็น default

การเปลี่ยนแปลงของ SELinux

การเปลี่ยนแปลงที่ได้ทำใน fastbootd.te ที่ให้การสนับสนุนการกระพริบ ramdisks ผู้ขาย