Verschieben von Fastboot in den Userspace

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Android 10 und höher unterstützt anpassbare Partitionen, indem die Fastboot-Implementierung vom Bootloader in den Userspace verschoben wird. Diese Verschiebung ermöglicht das Verschieben des Flashing-Codes an einen wartbaren und testbaren gemeinsamen Speicherort, wobei nur die herstellerspezifischen Teile von Fastboot durch eine Hardware-Abstraktionsschicht (HAL) implementiert werden. Darüber hinaus unterstützt Android 12 und höher das Flashen von Ramdisks durch einen zusätzlichen Fastboot-Befehl.

Vereinheitlichung von Fastboot und Wiederherstellung

Da Userspace Fastboot und Recovery ähnlich sind, können Sie sie in einer Partition oder Binärdatei zusammenführen. Dies bietet Vorteile wie weniger Platzverbrauch, insgesamt weniger Partitionen und Fastboot und Recovery, die ihren Kernel und ihre Bibliotheken gemeinsam nutzen.

Um fastbootd zu unterstützen, muss der Bootloader einen neuen Boot Control Block (BCB)-Befehl von boot-fastboot . Um in den fastbootd -Modus zu wechseln, schreibt der Bootloader boot-fastboot in das Befehlsfeld der BCB-Nachricht und lässt das recovery von BCB unverändert (um den Neustart unterbrochener Wiederherstellungsaufgaben zu ermöglichen). Die Felder status , stage und reserved bleiben ebenfalls unverändert. Der Bootloader lädt und bootet in das Wiederherstellungsabbild, wenn boot-fastboot im BCB-Befehlsfeld angezeigt wird. Die Wiederherstellung analysiert dann die BCB-Nachricht und wechselt in den fastbootd Modus.

ADB-Befehle

Dieser Abschnitt beschreibt den Befehl adb zum Einbinden fastbootd . Der Befehl hat unterschiedliche Ergebnisse, je nachdem, ob er vom System oder von der Wiederherstellung ausgeführt wird.

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

Fastboot-Befehle

Dieser Abschnitt beschreibt die Fastboot-Befehle zum Integrieren fastbootd , einschließlich neuer Befehle zum Flashen und Verwalten logischer Partitionen. Einige Befehle haben unterschiedliche Ergebnisse, je nachdem, ob sie vom Bootloader oder von fastbootd ausgeführt wurden.

Befehl Beschreibung
reboot recovery
  • Neustart in die Wiederherstellung (Bootloader).
  • Ruft die Wiederherstellung direkt ohne Neustart auf ( fastbootd ).
reboot fastboot Neustart in fastbootd .
getvar is-userspace
  • Gibt yes ( fastbootd ) zurück.
  • Gibt no zurück (Bootloader).
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 das aktuelle Steckplatz-Suffix, wenn die Super-Partition eine A/B-Partition ist (normalerweise nicht).
create-logical-partition <partition> <size> Erstellt eine logische Partition mit dem angegebenen Namen und der angegebenen Größe. Der Name darf nicht bereits als logische Partition existieren.
delete-logical-partition <partition> Löscht die angegebene logische Partition (löscht die Partition effektiv).
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 Metadaten der Superpartition zusammen. Wenn eine Zusammenführung nicht möglich ist (z. B. wenn das Format auf dem Gerät eine nicht unterstützte Version ist), schlägt dieser Befehl fehl. Ein optionaler wipe -Parameter überschreibt die Metadaten des Geräts, anstatt eine Zusammenführung durchzuführen.
flash <partition> [ <filename> ] Schreibt eine Datei auf eine Flash-Partition. Das Gerät muss sich im entsperrten Zustand befinden.
erase <partition> Löscht eine Partition (für sicheres Löschen nicht erforderlich). Das Gerät muss sich im entsperrten Zustand befinden.
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. Beim nächsten Startversuch bootet das System vom angegebenen Steckplatz.

Für die A/B-Unterstützung sind Slots duplizierte Sätze von Partitionen, von denen unabhängig gebootet werden kann. Steckplätze werden a , b usw. benannt und durch Hinzufügen der Suffixe _a , _b usw. zum Partitionsnamen unterschieden.

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 in Android 12 und höher , um das Flashen von Anbieter-Ramdisks zu unterstützen.

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

Einzelheiten finden Sie unter fastboot fetch vendor_boot <out.img> .

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

Verwenden Sie in Android 12 und höher, um das Flashen von Anbieter-Ramdisks zu unterstützen.

Dies ist eine spezielle Variante des Flash-Befehls. Es führt eine Funktion zum fetch vendor_boot -Images aus, als ob fastboot fetch aufgerufen worden wäre. Das neue vendor_boot -Image, das es flasht, hängt davon ab, ob die Boot-Header-Version Version 3 oder Version 4 ist.

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

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> Verwenden Sie in Android 12 und höher, um das Flashen von Anbieter-Ramdisks zu unterstützen.

Ruft das vendor_boot -Image ab. Gibt einen Fehler zurück, wenn der Boot-Header des Anbieters Version 3 ist. Wenn es sich um Version 4 handelt, findet es das richtige Ramdisk-Fragment des Anbieters (falls verfügbar). Es ersetzt das durch das angegebene Image, berechnet Größen und Offsets neu und flasht das neue vendor_boot image .

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

Fastboot und Bootloader

Der Bootloader flasht die bootloader , radio und boot/recovery , woraufhin das Gerät in Fastboot (Userspace) bootet und alle anderen Partitionen flasht. Der Bootloader sollte die folgenden Befehle unterstützen.

Befehl Beschreibung
download Lädt das Image auf Flash herunter.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Flasht recovery/boot Partition und Bootloader.
reboot Startet das Gerät neu.
reboot fastboot Neustart auf Fastboot.
reboot recovery Neustart zur Wiederherstellung.
getvar Ruft eine Bootloader-Variable ab, die zum Flashen des Wiederherstellungs-/Boot-Images erforderlich ist (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 diese Operationen versucht werden. Für nachgerüstete dynamische Partitionsgeräte unterstützt das Fastboot-Tool (und der Bootloader) einen Force-Modus, um eine dynamische Partition im Bootloader-Modus direkt zu flashen. Wenn system beispielsweise eine dynamische Partition auf dem nachgerüsteten Gerät ist, ermöglicht die Verwendung des fastboot --force flash system dem Bootloader (anstelle von fastbootd ), die Partition zu flashen.

Laden im Aus-Modus

Wenn ein Gerät das Laden im Aus-Modus unterstützt oder anderweitig automatisch in einen speziellen Modus bootet, wenn Strom angelegt wird, muss eine Implementierung des fastboot oem off-mode-charge 0 diese speziellen Modi umgehen, damit das Gerät so bootet, als ob der Benutzer gedrückt hätte der Einschaltknopf.

Fastboot-OEM-HAL

Um den Bootloader Fastboot vollständig zu ersetzen, muss Fastboot alle vorhandenen Fastboot-Befehle verarbeiten. Viele dieser Befehle stammen von OEMs und sind dokumentiert, erfordern jedoch eine benutzerdefinierte Implementierung. Viele OEM-spezifische Befehle sind nicht dokumentiert. Um solche Befehle zu verarbeiten, gibt die Fastboot-HAL die erforderlichen OEM-Befehle an. 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 fastbootd auf einem Gerät:

  1. fastbootd zu PRODUCT_PACKAGES in device.mk : PRODUCT_PACKAGES += fastbootd .

  2. Stellen Sie sicher, dass Fastboot-HAL, Startsteuerungs-HAL und Integritäts-HAL als Teil des Wiederherstellungsabbilds gepackt sind.

  3. Fügen Sie alle gerätespezifischen SEPolicy-Berechtigungen hinzu, die von fastbootd benötigt werden. Beispielsweise benötigt fastbootd Schreibzugriff auf eine gerätespezifische Partition, um diese Partition zu flashen. Darüber hinaus erfordert die Fastboot-HAL-Implementierung möglicherweise auch gerätespezifische Berechtigungen.

Um den Fastboot des Userspace zu validieren, führen Sie die Vendor Test Suite (VTS) aus.

Flashen von Hersteller-Ramdisks

Android 12 und höher bietet Unterstützung für das Flashen von Ramdisks mit einem zusätzlichen Fastboot-Befehl, der das vollständige vendor_boot -Image von einem Gerät abruft. Der Befehl fordert das hostseitige Fastboot-Tool auf, den Boot-Header des Herstellers zu lesen, ein Reimage durchzuführen und das neue Image zu flashen.

Um das vollständige vendor_boot -Image abzurufen, wurde der Befehl fetch:vendor_boot sowohl zum Fastboot-Protokoll als auch zur fastbootd-Implementierung des Protokolls in Android 12 hinzugefügt. Beachten Sie, dass fastbootd dies implementiert, aber der Bootloader selbst möglicherweise nicht. OEMs können den Befehl fetch:vendor_boot zu ihrer Bootloader-Implementierung des Protokolls hinzufügen. Wenn der Befehl jedoch im Bootloader-Modus nicht erkannt wird, ist das Flashen einzelner Anbieter-Ramdisks im Bootloader-Modus keine vom Anbieter unterstützte Option.

Bootloader-Änderungen

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

Fastbootd-Änderungen

getvar:max-fetch-size ist ähnlich wie max-download-size . Es gibt die maximale Größe an, die das Gerät in einer DATA-Antwort senden kann. Der Treiber darf keine größere Größe als diesen Wert abrufen.

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

  • Das Gerät führt einen debugfähigen Build aus.
  • Das Gerät ist entsperrt (Startzustand orange).
  • Der abgerufene Partitionsname ist vendor_boot .
  • Der size liegt zwischen 0 < size <= max-fetch-size .

Wenn diese verifiziert sind, gibt fetch:name[:offset[:size]] die Partitionsgröße und den Offset zurück. Beachte das Folgende:

  • fetch:name ist äquivalent zu fetch:name:0 , was äquivalent zu fetch:name:0:partition_size ist.
  • fetch:name:offset entspricht fetch:name:offset:(partition_size - offset)

Daher fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset)

Wenn offset oder partition_size (oder beide) nicht angegeben sind, werden die Standardwerte verwendet, die für offset 0 und für size den berechneten Wert von partition_size - offset sind.

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

Beispielsweise fetch:foo die gesamte foo -Partition bei Offset 0 ab.

Fahrerwechsel

Dem Fastboot-Tool wurden Befehle hinzugefügt, um Treiberänderungen zu implementieren. Jeder ist mit seiner vollständigen Definition in der Tabelle der Fastboot-Befehle verknüpft.

  • fastboot fetch vendor_boot out.img

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

    Dies ist eine spezielle Variante des Flash-Befehls. Es ruft das vendor_boot -Image ab, als ob fastboot fetch aufgerufen wurde.

    • Wenn der Vendor-Boot die Header- Version 3 ist, geschieht Folgendes:
      • Ersetzt die Hersteller-Ramdisk durch das angegebene Image.
      • Flasht das neue vendor_boot -Image.
    • Wenn der Boot-Header des Anbieters Version 4 ist, geschieht Folgendes:
      • Ersetzt die gesamte Vendor-Ramdisk durch das angegebene Image, sodass das angegebene Image das einzige Vendor-Ramdisk-Fragment im vendor_boot -Image wird.
      • Berechnet die Größe und den Offset in der Hersteller-Ramdisk-Tabelle neu.
      • Flasht das neue vendor_boot -Image.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    vendor_boot image ab, 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:

      • Findet das Hersteller-Ramdisk-Fragment mit dem Namen foo . Wenn nicht gefunden oder wenn mehrere Übereinstimmungen vorhanden sind, wird ein Fehler zurückgegeben.
      • Ersetzt das Ramdisk-Fragment des Anbieters durch das angegebene Image.
      • Berechnet jede Größe und jeden Offset in der Hersteller-Ramdisk-Tabelle neu.
      • Flasht das neue vendor_boot -Image.

mkbootimg

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

SELinux-Änderungen

In fastbootd.te wurde eine Änderung vorgenommen, um das Flashen von Hersteller- fastbootd.te zu unterstützen.