Fastboot ist der Name des Bootloader-Moduls und -Modus. Android 10 und höher unterstützt Partitionen mit anpassbarer Größe, indem die Fastboot-Implementierung von den Bootloader zum Userspace hinzu. 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.
Fastboot und Wiederherstellung zusammenführen
Da der Userspace-Schnellstart und die Wiederherstellung ähnlich sind, könnt ihr sie zusammenführen. oder Binärprogramm. Dies bietet Vorteile wie weniger Speicherplatz, insgesamt weniger Partitionen und einen gemeinsamen Kernel und Bibliotheken für Fastboot und Recovery.
Fastbootd ist der Name eines Userspace-Daemons und -Modus.
Zur Unterstützung von fastbootd
muss der Bootloader einen neuen Boot-Steuerblock implementieren
(BCB-)Befehl von boot-fastboot
. Um den fastbootd
-Modus aufzurufen, schreibt der Bootloader boot-fastboot
in das Befehlsfeld der BCB-Nachricht und lässt das Feld recovery
der BCB unverändert, um unterbrochene Wiederherstellungsaufgaben neu starten zu können. 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 |
|
Fastboot-Befehle
In diesem Abschnitt werden die Fastboot-Befehle für die Integration von fastbootd
beschrieben, einschließlich neuer Befehle zum Flashen und Verwalten logischer Partitionen. Einige
haben Befehle unterschiedliche Ergebnisse, je nachdem, ob sie von
Bootloader- oder fastbootd
-Datei.
Befehl | Beschreibung |
---|---|
reboot recovery |
|
reboot fastboot |
Startet im fastbootd neu. |
getvar is-userspace |
|
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 Suffix des aktuellen Slots, wenn es sich bei der Superpartition um eine A/B-Partition handelt (in der Regel ist das 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 bereits als logische Partition vorhanden sein. |
delete-logical-partition <partition> |
Löscht die angegebene logische Partition. |
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). Das Gerät muss 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 auf Bei der A/B-Unterstützung sind Slots duplizierte Partitionen, von denen unabhängig gestartet werden kann. Anzeigenflächen heißen |
reboot |
Das Gerät wird normal neu gestartet. |
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. Daten für jeden Block abrufen und dann zu
Weitere Informationen finden Sie unter |
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 Befehls „flash“. Er führt eine
Weitere Informationen finden Sie unter |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Unter Android 12 und höher verwenden, um das Flashen von Anbieter-Ramdisks zu unterstützen. Ruft das Weitere Informationen finden Sie unter
|
Fastboot und Bootloader
Der Bootloader flasht die Partitionen bootloader
, radio
und boot/recovery
. Danach wird das Gerät in Fastboot (Userspace) gestartet und alle anderen Partitionen werden geflasht. Der Bootloader sollte die folgenden Befehle unterstützen.
Befehl | Beschreibung |
---|---|
download |
Das Image wird zum Flashen heruntergeladen. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Flash-Partition und Bootloader für recovery/boot . |
reboot |
Das Gerät wird neu gestartet. |
reboot fastboot |
Das Gerät wird im Fastboot-Modus neu gestartet. |
reboot recovery |
Neustarts zur Wiederherstellung. |
getvar |
Ruft eine Bootloadervariable 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 versucht wird, diese Vorgänge auszuführen. Bei Geräten mit nachträglich hinzugefügten dynamischen Partitionen unterstützen das Fastboot-Tool und der Bootloader einen Zwangsmodus, um eine dynamische Partition direkt im Bootloader-Modus zu flashen. Wenn system
beispielsweise eine dynamische Partition auf dem nachgerüsteten Gerät ist, kann der Bootloader mit dem Befehl fastboot --force flash system
(anstelle von fastbootd
) die Partition flashen.
Laden im Aus-Modus
Unterstützt das Gerät das Laden im ausgeschalteten 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
Damit der Bootloader-Fastboot vollständig ersetzt werden kann, muss Fastboot alle vorhandenen Fastboot-Befehle verarbeiten. Viele dieser Befehle stammen von OEMs und sind dokumentiert, eine benutzerdefinierte Implementierung. Viele OEM-spezifische Befehle sind nicht dokumentiert. 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:
fastbootd
zuPRODUCT_PACKAGES
indevice.mk
hinzufügen:PRODUCT_PACKAGES += fastbootd
.Achten Sie darauf, dass der Fastboot-HAL, der Bootsteuerungs-HAL und der Zustands-HAL gepackt sind als Teil des Wiederherstellungsabbilds.
Fügen Sie alle für
fastbootd
erforderlichen gerätespezifischen SEPolicy-Berechtigungen hinzu. Beispielsweise benötigtfastbootd
Schreibzugriff auf eine gerätespezifische Partition, um diese zu flashen. Außerdem sind für die Implementierung von Fastboot HAL möglicherweise gerätespezifische Berechtigungen erforderlich.
Führen Sie die Vendor Test Suite (VTS) aus, um den Userspace-Fastboot zu validieren.
Ramdisks von Flash-Anbietern
Android 12 und höher unterstützen das Flashen von RAM-Disks 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 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.
Änderungen am Bootloader
Die Befehle getvar:max-fetch-size
und fetch:name
sind in fastbootd
implementiert. 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 folgenden Bedingungen erfüllt sind, gibt der Befehl fetch:name[:offset[:size]]
Daten zurück:
- Auf dem Gerät wird ein debugbarer Build ausgeführt.
- Das Gerät ist entsperrt (Bootstatus orange).
- Der abgerufene Partitionsname ist
vendor_boot
. - Der Wert
size
liegt im Bereich 0 <size
<=max-fetch-size
.
Wenn diese bestätigt sind, gibt fetch:name[:offset[:size]]
die Partitionsgröße und den Offset zurück.
Beachten Sie Folgendes:
fetch:name
entsprichtfetch:name:0
, wasfetch:name:0:partition_size
entspricht.fetch:name:offset
entsprichtfetch:name:offset:(partition_size - offset)
Daher 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: Für beide werden die Standardwerte 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 alsvendor_boot
, sodass es normalerweise nur einen Block gibt.)- Die Daten werden zu
out.img
zusammengeführt.
- Ruft
fastboot flash vendor_boot:default vendor-ramdisk.img
Dies ist eine spezielle Variante des Flash-Befehls. Es ruft das
vendor_boot
-Image ab, als wärefastboot fetch
aufgerufen worden.- Beim Booten des Anbieters wird der Header version
3
geschieht Folgendes:
- Ersetzt das RAM-Disk des Anbieters durch das angegebene Image.
- Das neue
vendor_boot
-Bild wird kurz eingeblendet.
- Wenn der Boot-Header des Anbieters Version 4 hat, geschieht Folgendes:
- 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.
- Das neue
vendor_boot
-Bild wird kurz eingeblendet.
- Ersetzt die gesamte anbieterseitige Ramdisk durch das angegebene Image, sodass das
ist das einzige Ramdisk-Fragment des Anbieters im
- Beim Booten des Anbieters wird der Header version
3
geschieht Folgendes:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Ruft
vendor_boot image
ab, als wärefastboot fetch
aufgerufen worden.- 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 Ramdisk-Fragment des Anbieters mit dem Namen
ramdisk_<var><foo></var>
Wenn keine Übereinstimmung gefunden wird oder es mehrere Übereinstimmungen gibt, wird ein Fehler zurückgegeben. - Ersetzt das RAM-Disk-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.
- Findet das Ramdisk-Fragment des Anbieters mit dem Namen
Wenn <foo> nicht angegeben ist, wird nach
ramdisk_
gesucht.
MKbootimg
Der Name default
ist für die Benennung von RAM-Disk-Fragmenten von Anbietern in Android 12 und höher reserviert. Die Semantik von flash vendor_boot:default
für Fastboot bleibt gleich, aber Sie dürfen Ihre Ramdisk-Fragmente nicht default
nennen.
SELinux-Änderungen
Eine Änderung wurde vorgenommen in
fastbootd.te
um Flash-Anbieter-RAMdisks zu unterstützen.