Schnellstart zum Userspace

Android 10 und höher unterstützt Partitionen mit anpassbarer Größe nach dass die Fastboot-Implementierung vom Bootloader in den Userspace verschoben wurde. Dieses ermöglicht das Verschieben des Flash-Codes in einen wartbaren und testbaren Code, Standort, wobei nur die anbieterspezifischen Teile von Fastboot durch einen Hardware-Abstraktionsschicht (HAL) Außerdem wird Android 12 und höher unterstützt das Flashen von Ramdisks über einen zusätzlichen Fastboot-Befehl.

Schnellstart und Wiederherstellung vereinheitlichen

Da der Userspace-Schnellstart und die Wiederherstellung sehr ähnlich sind, könnt ihr sie zusammenführen. oder Binärprogramm. Dies bietet Vorteile wie die Verwendung von weniger Platz, weniger Partitionen insgesamt und die Nutzung von Fastboot und Wiederherstellung Kernel und Bibliotheken.

Zur Unterstützung von fastbootd muss der Bootloader einen neuen Boot-Steuerblock implementieren (BCB-)Befehl von boot-fastboot. Um in den fastbootd-Modus zu wechseln, musst du den Bootloader-Modus aufrufen. schreibt boot-fastboot in das Befehlsfeld der BCB-Nachricht und lässt das Feld Feld recovery im BCB unverändert (um den Neustart einer unterbrochenen Wiederherstellung zu ermöglichen Aufgaben). Die Felder status, stage und reserved bleiben ebenfalls unverändert. Der Bootloader wird in das Wiederherstellungsabbild geladen und gestartet, sobald boot-fastboot im BCB-Befehlsfeld. Die Wiederherstellung analysiert dann die BCB-Nachricht und wechselt in den fastbootd-Modus.

ADB-Befehle

In diesem Abschnitt wird der Befehl adb zum Einbinden von fastbootd beschrieben. Die hat unterschiedliche Ergebnisse, je nachdem, ob er vom System oder durch Genesung.

Befehl Beschreibung
reboot fastboot
  • Neustart in fastbootd (System).
  • Öffnet fastbootd direkt ohne Neustart (Wiederherstellung).

Fastboot-Befehle

In diesem Abschnitt werden die Fastboot-Befehle zur Integration von fastbootd beschrieben. einschließlich neuer Befehle für das Flashen und Verwalten logischer Partitionen. Einige haben Befehle unterschiedliche Ergebnisse, je nachdem, ob sie von Bootloader- oder fastbootd-Datei.

Befehl Beschreibung
reboot recovery
  • Neustart zur Wiederherstellung (Bootloader).
  • Startet die Wiederherstellung direkt und ohne Neustart (fastbootd).
reboot fastboot Startet im fastbootd neu.
getvar is-userspace
  • Gibt yes (fastbootd) zurück.
  • Gibt no (Bootloader) zurück.
getvar is-logical:<partition> Gibt yes zurück, wenn die angegebene Partition eine logische Partition ist Andernfalls no. Logische Partitionen unterstützen alle unten aufgeführten Befehle.
getvar super-partition-name Gibt den Namen der Superpartition zurück. Der Name enthält den aktuellen Slot. -Suffix, wenn es sich bei der Superpartition um eine A/B-Partition handelt. Dies ist normalerweise nicht der Fall.
create-logical-partition <partition> <size> Erstellt eine logische Partition mit dem angegebenen Namen und der angegebenen Größe. Der Name darf nicht sind bereits als logische Partition vorhanden.
delete-logical-partition <partition> Löscht die angegebene logische Partition, d. h. die Partition wird gelöscht.
resize-logical-partition <partition> <size> Ändert die Größe der logischen Partition auf die neue Größe, ohne ihren Inhalt zu ändern. Schlägt fehl, wenn nicht genügend Speicherplatz für die Größenänderung verfügbar ist.
update-super <partition> Führt Änderungen an den Superpartitions-Metadaten zusammen. Wenn eine Zusammenführung nicht möglich ist z. B. weil die Version auf dem Gerät nicht unterstützt wird, schlägt fehl. Ein optionaler wipe-Parameter überschreibt den statt einer Zusammenführung.
flash <partition><filename> ] Schreibt eine Datei in eine Flash-Partition. Das Gerät muss entsperrt sein.
erase <partition> Löscht eine Partition (für sicheres Löschen nicht erforderlich). Gerät muss sich im entsperrt sein.
getvar <variable> | all Zeigt eine Bootloader-Variable oder alle Variablen an. Wenn die Variable nicht vorhanden ist, wird ein Fehler zurückgegeben.
set_active <slot>

Legt den angegebenen A/B-Boot-Slot als active fest. In der nächsten startet das System vom angegebenen Slot aus.

Für A/B-Unterstützung sind Slots duplizierte Partitionen, die gestartet werden können unabhängig voneinander unterscheiden. Anzeigenflächen heißen a, b usw. und durch die Suffixe _a, _b und also weiter zum Partitionsnamen.

reboot Startet das Gerät normal neu.
reboot-bootloader (oder reboot bootloader) Startet das Gerät im Bootloader neu.
fastboot fetch vendor_boot <out.img>

Verwenden Sie diese Funktion ab Android 12, um unterstützen Flash-Anbieter-RAMdisks.

Ruft die gesamte Partitionsgröße und die Blockgröße ab. Ruft Daten für jeden Block ab, führt die Daten dann zu <out.img> zusammen.

Weitere Informationen finden Sie unter fastboot fetch vendor_boot <out.img>.

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

Verwende diese Einstellung unter Android 12 und höher, um die RAM-Disks von Anbietern zu unterstützen.

Dies ist eine spezielle Variante des Flash-Befehls. Er führt eine fetch vendor_boot-Bildfunktion aus, als ob fastboot fetch aufgerufen. Welches neue vendor_boot-Image blinkt, hängt davon ab, ist die Boot-Header-Version Version 3 oder Version 4.

Weitere Informationen finden Sie unter fastboot flash vendor_boot:default <vendor-ramdisk.img>

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Verwenden Sie diese Funktion ab Android 12, um unterstützen Flash-Anbieter-RAMdisks.

Ruft das Image vendor_boot ab. Gibt einen Fehler zurück, wenn der Anbieter Boot-Header ist Version 3. Bei Version 4 findet die Funktion den richtigen Ramdisk-Fragment des Anbieters (falls verfügbar) Es ersetzt das durch das gegebene Bild, berechnet Größen und Offsets neu und überträgt die neue vendor_boot image.

Weitere Informationen finden Sie unter fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>

Fastboot und Bootloader

Der Bootloader lädt die bootloader, radio und boot/recovery danach startet das Gerät in Fastboot (Userspace) und blinkt allen anderen Partitionen. Der Bootloader sollte die folgenden Befehle unterstützen.

Befehl Beschreibung
download Lädt das Image in Flash herunter
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ Flash-Partition und Bootloader für recovery/boot.
reboot Startet das Gerät neu.
reboot fastboot Startet im Fastboot-Modus neu.
reboot recovery Neustarts zur Wiederherstellung.
getvar Ruft eine Bootloader-Variable ab, die für das Flashen des Wiederherstellungs-/Bootvorgangs erforderlich ist Bild (z. B. current-slot und max-download-size).
oem <command> Vom OEM definierter Befehl.

Dynamische Partitionen

Der Bootloader darf das Flashen oder Löschen dynamischer Partitionen nicht zulassen und muss einen Fehler zurückgeben, wenn versucht wird, diese Vorgänge auszuführen. Für nachgerüstete Dynamic Partition-Geräten unterstützt das Fastboot-Tool (und Bootloader) eine Kraft um eine dynamische Partition direkt im Bootloader-Modus zu flashen. Für Wenn z. B. system eine dynamische Partition auf dem nachgerüsteten Gerät ist, Mit dem Befehl fastboot --force flash system wird der Bootloader aktiviert. (anstelle von fastbootd), um die Partition zu flashen.

Laden im deaktivierten Modus

Unterstützt das Gerät das Laden im inaktiven Modus oder startet es automatisch in einer speziellen an die Stromversorgung angeschlossen ist, ist eine Implementierung des Der Befehl fastboot oem off-mode-charge 0 muss um diese speziellen Modi zu umgehen, sodass das Gerät so startet, als hätte der Nutzer die Ein/Aus-Taste drücken.

Fastboot OEM HAL

Um den Bootloader-Schnellstart vollständig zu ersetzen, muss Fastboot alle vorhandenen Fastboot-Befehlen. Viele dieser Befehle stammen von OEMs und sind dokumentiert, eine benutzerdefinierte Implementierung. Viele OEM-spezifische Befehle sind nicht dokumentiert ist. Zur Verarbeitung solcher Befehle gibt der Fastboot-HAL die erforderlichen OEM-Befehle. OEMs können auch ihre eigenen Befehle implementieren.

Die Definition von Fastboot HAL lautet wie folgt:

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 aktivieren

So aktivieren Sie fastbootd auf einem Gerät:

  1. fastbootd zu PRODUCT_PACKAGES in device.mk hinzufügen: PRODUCT_PACKAGES += fastbootd.

  2. Achten Sie darauf, dass der Fastboot-HAL, der Bootsteuerungs-HAL und der Zustands-HAL gepackt sind als Teil des Wiederherstellungsabbilds.

  3. Fügen Sie alle für fastbootd erforderlichen gerätespezifischen SEPolicy-Berechtigungen hinzu. Für Beispiel: fastbootd benötigt Schreibzugriff auf eine gerätespezifische Partition, um wenn Sie diese Partition flashen. Darüber hinaus kann die Fastboot-HAL-Implementierung erfordern gerätespezifische Berechtigungen.

Führen Sie die Vendor Test Suite aus, um den Userspace-Schnellstart zu validieren (VTS)

Ramdisks von Flash-Anbietern

Android 12 und höher unterstützen von Ramdisks mit einem hinzugefügten Fastboot-Befehl, mit dem die vollständige vendor_boot Bild von einem Gerät. Der Befehl fordert den hostseitigen Schnellstart auf um den Boot-Header des Anbieters zu lesen, ein neues Image zu erstellen und das neue Image zu flashen.

Der Befehl fetch:vendor_boot wurde hinzugefügt, um das vollständige vendor_boot-Image abzurufen. das Fastboot-Protokoll und die Fastbootd-Implementierung dieses Protokolls, für Android 12. Beachten Sie, dass Fastbootd die gewünschte Option implementiert, aber der Bootloader selbst möglicherweise nicht. OEMs können den Befehl fetch:vendor_boot an die Bootloader-Implementierung des Protokoll. Wenn der Befehl jedoch im Bootloader-Modus nicht erkannt wird, Das Flashen von Ramdisks einzelner Anbieter im Bootloader-Modus wird nicht unterstützt Option.

Bootloader-Änderungen

Die Befehle getvar:max-fetch-size und fetch:name sind implementiert in fastbootd Um das Flashen von Ramdisks von Anbietern im Bootloader zu unterstützen, müssen Sie diese beiden Befehle implementieren.

Fastbootd-Änderungen

getvar:max-fetch-size ähnelt max-download-size. Sie gibt an, Maximale Größe, die das Gerät in einer DATA-Antwort senden kann. Der Fahrer darf ruft eine Größe ab, die größer als dieser Wert ist.

fetch:name[:offset[:size]] führt eine Reihe von Prüfungen auf dem Gerät durch. Wenn alle der folgenden Bedingungen erfüllt sind, gibt der Befehl fetch:name[:offset[:size]] Daten zurück:

  • Auf dem Gerät wird ein Debug-fähiger Build ausgeführt.
  • Das Gerät ist entsperrt (Startstatus orange).
  • Der abgerufene Partitionsname lautet vendor_boot.
  • Der Wert für size liegt zwischen 0 < size <= max-fetch-size.

Wenn diese überprüft wurden, gibt fetch:name[:offset[:size]] die Partitionsgröße zurück und Versatz. Beachten Sie Folgendes:

  • fetch:name entspricht fetch:name:0, was entspricht fetch:name:0:partition_size
  • fetch:name:offset entspricht fetch:name:offset:(partition_size - offset)

Dementsprechend ist fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset).

Wenn offset oder partition_size (oder beide) nicht angegeben sind, gibt der Parameter Es werden Standardwerte verwendet, wobei für offset der Wert 0 und für size der Wert berechneter Wert von partition_size - offset.

  • Offset angegeben, Größe nicht angegeben: size = partition_size - offset
  • Keine Angabe: Standardwerte werden für beide verwendet, size = partition_size: 0.

fetch:foo ruft beispielsweise die gesamte Partition foo bei Versatz 0 ab.

Treiberänderungen

Dem Fastboot-Tool wurden Befehle hinzugefügt, um Treiberänderungen zu implementieren. Jede ist finden Sie in der Tabelle Fastboot

  • fastboot fetch vendor_boot out.img

    • Ruft getvar max-fetch-size auf, um die Chunk-Größe zu ermitteln.
    • getvar partition-size:vendor_boot[_a] wird aufgerufen, um zu ermitteln, die Größe der gesamten Partition.
    • fastboot fetch vendor_boot[_a]:offset:size aufrufen für jede Chunk. (Die Chunk-Größe ist größer als vendor_boot, sodass es normalerweise nur einen Block gibt.)
    • Führt die Daten zu out.img zusammen.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Dies ist eine spezielle Variante des Flash-Befehls. Es ruft die vendor_boot-Image, so als würde fastboot fetch aufgerufen werden.

    • Beim Booten des Anbieters wird der Header version 3 geschieht Folgendes: <ph type="x-smartling-placeholder">
        </ph>
      • Ersetzt die Anbieter-RAMdisk durch das angegebene Image.
      • Zeigt das neue vendor_boot-Image an.
    • Wenn der Boot-Header des Anbieters version 4, geschieht Folgendes: <ph type="x-smartling-placeholder">
        </ph>
      • Ersetzt die gesamte anbieterseitige Ramdisk durch das angegebene Image, sodass das ist das einzige Ramdisk-Fragment des Anbieters im vendor_boot Bild.
      • Berechnet die Größe und den Offset in der Ramdisk-Tabelle des Anbieters neu.
      • Zeigt das neue vendor_boot-Image an.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Ruft vendor_boot image ab, so als ob fastboot fetch aufgerufen wurde.

    • Wenn der Boot-Header des Anbieters Version 3 ist, wird ein Fehler zurückgegeben.
    • Wenn der Boot-Header des Anbieters Version 4 ist, geschieht Folgendes:

      • Ermittelt das Ramdisk-Fragment des Anbieters foo. Wenn nicht gefunden, oder Bei mehreren Übereinstimmungen wird ein Fehler zurückgegeben.
      • Ersetzt das Ramdisk-Fragment des Anbieters durch das angegebene Image.
      • Berechnet jede Größe und jeden Offset in der Ramdisk-Tabelle des Anbieters neu.
      • Zeigt das neue vendor_boot-Image an.

MKbootimg

Der Name „default“ ist für die Benennung von Ramdisk-Fragmenten des Anbieters reserviert in Android 12 und höher. Während der Fastboot flash vendor_boot:default Die Semantik bleibt gleich, dürfen Sie Ihre Ramdisk-Fragmente nicht wie folgt benennen: default.

SELinux-Änderungen

Eine Änderung wurde vorgenommen in fastbootd.te um Flash-Anbieter-RAMdisks zu unterstützen.