ย้าย Fastboot ไปที่ userspace

Android 10 ขึ้นไปรองรับพาร์ติชันที่ปรับขนาดได้โดยทำดังนี้ กำลังย้ายการใช้งาน Fastboot จาก Bootloader ไปยัง userspace ช่วงเวลานี้ การย้ายตำแหน่งทำให้สามารถย้ายโค้ด Flash ไปไว้ในที่ที่บำรุงรักษาและทดสอบได้ ตำแหน่งทั่วไปที่มีเฉพาะส่วนของผู้ให้บริการเฉพาะของ Fastboot ที่ใช้งานโดย ชั้นแอบสแตรกชันของฮาร์ดแวร์ (HAL) นอกจากนี้ Android 12 และที่สูงกว่ารองรับ RAM ดิสก์ที่กะพริบผ่านคำสั่ง Fastboot ที่เพิ่มขึ้น

รวม Fastboot และการกู้คืนเข้าด้วยกัน

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

Bootloader ต้องใช้บล็อกการควบคุมการเปิดเครื่องใหม่เพื่อรองรับ fastbootd (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> ] เขียนไฟล์ลงในพาร์ติชัน Flash อุปกรณ์ต้องอยู่ในสถานะปลดล็อกแล้ว
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 ขึ้นไปเพื่อ รองรับ Ramdisk ของผู้ให้บริการที่มี Flash

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

โปรดดูรายละเอียดที่หัวข้อ fastboot fetch vendor_boot <out.img>

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

ใช้ใน Android 12 ขึ้นไปเพื่อรองรับ RAM ของผู้ให้บริการแบบแฟลช

นี่เป็นรูปแบบพิเศษของคำสั่ง Flash โดยจะใช้ฟังก์ชันรูปภาพ 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 ขึ้นไปเพื่อ รองรับ RAMD ของผู้ให้บริการแฟลช

ดึงรูปภาพ vendor_boot ส่งคืนข้อผิดพลาดหากผู้ให้บริการ ส่วนหัวเปิดเครื่องคือเวอร์ชัน 3 ถ้าเป็นเวอร์ชัน 4 ระบบจะค้นหา Fragment 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 ที่จำเป็นสำหรับการแฟลชการกู้คืน/การเปิดเครื่อง รูปภาพ (เช่น current-slot และ max-download-size)
oem <command> คำสั่งที่กำหนดโดย OEM

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

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

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

หากอุปกรณ์รองรับการชาร์จนอกโหมดหรือการรีบูตอัตโนมัติเป็นกรณีพิเศษ เมื่อมีการใช้พลังงาน คำสั่ง fastboot oem off-mode-charge 0 ต้อง ข้ามโหมดพิเศษเหล่านี้เพื่อให้อุปกรณ์เปิดเครื่องเสมือนว่าผู้ใช้กด ปุ่มเปิด/ปิด

HAL ของ Fastboot OEM

ในการเปลี่ยน 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 ยังอาจ ต้องใช้สิทธิ์เฉพาะอุปกรณ์

หากต้องการตรวจสอบ Fastboot ของพื้นที่ผู้ใช้ ให้เรียกใช้ Vendor Test Suite (VTS)

RAM ของผู้ให้บริการ Flash

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

หากต้องการดึงอิมเมจ vendor_boot แบบเต็ม มีการเพิ่มคำสั่ง fetch:vendor_boot ทั้งโปรโตคอล Fastboot และการใช้งาน Fastbootd ของโปรโตคอล ใน Android 12 โปรดทราบว่า Fastbootd ใช้โค้ดนี้ แต่ตัว Bootloader เองอาจไม่สามารถใช้งานได้ OEM สามารถเพิ่มได้ คำสั่ง fetch:vendor_boot สำหรับการใช้งาน Bootloader แต่หากระบบไม่รู้จักคำสั่งนี้ในโหมด Bootloader การแฟลช RAM ของผู้ให้บริการแต่ละรายในโหมด Bootloader ไม่ได้รับการรองรับจากผู้ให้บริการ ตัวเลือก

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

ใช้คำสั่ง getvar:max-fetch-size และ fetch:name ใน fastbootd หากต้องการรองรับการแฟลช RAM ของผู้ให้บริการใน Bootloader คุณต้อง ให้ใช้คำสั่ง 2 ข้อนี้

การเปลี่ยนแปลง 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 (หรือทั้ง 2 อย่าง) ฟังก์ชัน ระบบจะใช้ค่าเริ่มต้น ซึ่งสำหรับ offset จะเป็น 0 และสำหรับ size คือ ที่คำนวณได้เป็น partition_size - offset

  • ออฟเซ็ตที่ระบุ ไม่ได้ระบุขนาด: size = partition_size - offset
  • ไม่ได้ระบุ: ค่าเริ่มต้นที่ใช้สำหรับทั้ง 2 อย่าง ได้แก่ 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

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

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

    ดึงข้อมูล vendor_boot image เหมือนกับมีการเรียก fastboot fetch

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

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

Mkbootimg

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

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

มีการเปลี่ยนแปลงใน fastbootd.te เพื่อรองรับ RAM ดิสก์ของผู้ให้บริการแฟลช