Fastboot è il nome di un modulo e di una modalità del bootloader. Android 10 e versioni successive supportano le partizioni ridimensionabili spostando l'implementazione di Fastboot dal bootloader allo spazio utente. Questo il relocation consente di spostare il codice flash in un ambiente posizione comune con solo le parti di fastboot specifiche del fornitore implementate da un HAL (Hardware Astrazione Layer). Inoltre, Android 12 e superiori supportano il flashing dei ramdisk tramite un comando fastboot aggiunto.
Unificare fastboot e recovery
Poiché il fastboot e il recupero nello spazio utente sono simili, puoi unirli in una sola partizione o in un unico file binario. Ciò offre vantaggi come l'utilizzo di meno spazio, un numero inferiore di partizioni complessive e la condivisione del kernel e delle librerie tra fastboot e recovery.
Fastbootd è il nome di un daemon e di una modalità dello spazio utente.
Per supportare fastbootd
, il bootloader deve implementare un nuovo comando BCB (boot control block) di boot-fastboot
. Per accedere alla modalità fastbootd
, il bootloader scrive boot-fastboot
nel campo di comando del messaggio BCB e lascia invariato il campo recovery
del BCB (per consentire il riavvio di eventuali attività di recupero interrotte). Anche i campi status
, stage
e reserved
rimangono invariati.
Il bootloader si carica e si avvia nell'immagine di ripristino dopo aver visualizzato
boot-fastboot
nel campo di comando BCB. Il recupero analizza quindi il messaggio BCB
e passa alla modalità fastbootd
.
Comandi ADB
Questa sezione descrive il comando adb
per l'integrazione di fastbootd
. La
ha risultati diversi, a seconda che venga eseguito dal sistema o
per ripristino.
Comando | Descrizione |
---|---|
reboot fastboot |
|
Comandi Fastboot
Questa sezione descrive i comandi fastboot per l'integrazione di fastbootd
, inclusi i nuovi comandi per il flashing e la gestione delle partizioni logiche. Alcuni
comandi hanno risultati diversi, a seconda che siano stati eseguiti dal
bootloader o da fastbootd
.
Comando | Descrizione |
---|---|
reboot recovery |
|
reboot fastboot |
Riavvia in fastbootd . |
getvar is-userspace |
|
getvar is-logical:<partition> |
Restituisce yes se la partizione specificata è una partizione logica,
no negli altri casi.
Le partizioni logiche supportano tutti i comandi elencati di seguito. |
getvar super-partition-name |
Restituisce il nome della super partizione. Il nome include il suffisso dello slot corrente se la partizione super è una partizione A/B (di solito non lo è). |
create-logical-partition <partition> <size> |
Crea una partizione logica con il nome e le dimensioni specificati. Il nome non deve esiste già come partizione logica. |
delete-logical-partition <partition> |
Elimina la partizione logica specificata (cancella la partizione). |
resize-logical-partition <partition> <size> |
Modifica le dimensioni della partizione logica in base alle nuove dimensioni senza modificarne i contenuti. Non va a buon fine se non è disponibile spazio sufficiente per eseguire il ridimensionamento. |
update-super <partition> |
Unisce le modifiche ai metadati della superpartizione. Se non è possibile eseguire l'unione (ad esempio, il formato sul dispositivo è una versione non supportata), questo comando non va a buon fine. Un parametro facoltativo wipe sovrascrive la versione del dispositivo
anziché eseguire un'unione. |
flash <partition> [ <filename> ] |
Scrive un file in una partizione flash. Il dispositivo deve essere sbloccato. |
erase <partition> |
Resetta una partizione (non è necessario che sia un'eliminazione sicura). Il dispositivo deve trovarsi in sbloccato. |
getvar <variable> | all |
Visualizza una variabile bootloader o tutte le variabili. Se la variabile non esiste, restituisce un errore. |
set_active <slot> |
Imposta lo slot di avvio A/B specificato come Per il supporto A/B, gli slot sono insiemi duplicati di partizioni da cui è possibile eseguire l'avvio in modo indipendente. Gli slot sono denominati |
reboot |
Riavvia il dispositivo normalmente. |
reboot-bootloader (o reboot bootloader ) |
Riavvia il dispositivo nel bootloader. |
fastboot fetch vendor_boot <out.img> |
Da utilizzare in Android 12 e versioni successive per supportare il flashing dei ramdisk del fornitore.
Recupera l'intera dimensione della partizione e la dimensione del blocco. Recupera i dati per ogni blocco,
poi unisce i dati in
Per maggiori dettagli, vedi |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
Utilizzalo in Android 12 e versioni successive per supportare i ramdisk del fornitore flash. Si tratta di una variante speciale del comando Flash. Svolge una funzione immagine
Per maggiori dettagli, vedi
|
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Da utilizzare in Android 12 e versioni successive per supportare il flashing dei ramdisk del fornitore. Recupera l'immagine Per maggiori dettagli, vedi
|
Fastboot e bootloader
Il bootloader esegue il flashing delle partizioni bootloader
, radio
e boot/recovery
, dopodiché il dispositivo si avvia in fastboot (spazio utente) ed esegue il flashing di tutte le altre partizioni. Il bootloader deve supportare i seguenti comandi.
Comando | Descrizione |
---|---|
download |
Scarica l'immagine da flash. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Esegue il flashing della partizione recovery/boot e del bootloader. |
reboot |
Riavvia il dispositivo. |
reboot fastboot |
Si riavvia in fastboot. |
reboot recovery |
Viene riavviato per il ripristino. |
getvar |
Recupera una variabile del bootloader necessaria per il flashing dell'immagine di recupero/boot (ad esempio current-slot e
max-download-size ). |
oem <command> |
Comando definito dall'OEM. |
Partizioni dinamiche
Il bootloader non deve consentire il flashing o la cancellazione delle partizioni dinamiche
e deve restituire un errore se si tenta di eseguire queste operazioni. Per ristrutturazione
i dispositivi di partizione dinamica, lo strumento fastboot (e bootloader) supporta una
per eseguire il flashing diretto di una partizione dinamica in modalità bootloader. Per
ad esempio, se system
è una partizione dinamica sul dispositivo riadattato,
utilizzando il comando fastboot --force flash system
abilita il bootloader
(invece di fastbootd
) per eseguire il flashing della partizione.
Ricarica in modalità off
Se un dispositivo supporta la ricarica fuori modalità o comunque si avvia automaticamente in una
in cui viene applicata la corrente, un'implementazione
Il comando fastboot oem off-mode-charge 0
deve
bypassare queste modalità speciali, in modo che il dispositivo si avvii come se l'utente avesse premuto
il tasto di accensione.
Fastboot OEM HAL
Per sostituire completamente fastboot del bootloader, fastboot deve gestire tutte le risorse esistenti comandi fastboot. Molti di questi comandi provengono dagli OEM e sono documentati, ma richiedono un'implementazione personalizzata. Molti comandi specifici degli OEM non sono documentato. Per gestire questi comandi, l'HAL fastboot specifica le i comandi OEM. Gli OEM possono anche implementare i propri comandi.
La definizione di fastboot HAL è la seguente:
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);
};
Attivare fastbootd
Per attivare fastbootd
su un dispositivo:
Aggiungi
fastbootd
aPRODUCT_PACKAGES
indevice.mk
:PRODUCT_PACKAGES += fastbootd
.Assicurati che l'HAL fastboot, l'HAL di controllo dell'avvio e l'HAL di salute siano pacchettizzati nell'immagine di ripristino.
Aggiungi eventuali autorizzazioni SEPolicy specifiche del dispositivo richieste da
fastbootd
. Ad esempio,fastbootd
richiede l'accesso in scrittura a una partizione specifica del dispositivo per eseguire il flashing della partizione. Inoltre, l'implementazione dell'HAL di fastboot potrebbe anche richiedere autorizzazioni specifiche del dispositivo.
Per convalidare l'avvio rapido dello spazio utente, esegui la Test Suite del fornitore (VTS).
Ramdisk fornitore Flash
Android 12 e versioni successive supportano il flashing delle ramdisk con un comando fastboot aggiuntivo che estrae l'immagine completavendor_boot
da un dispositivo. Il comando chiede allo strumento fastboot sul lato host di leggere l'intestazione di avvio del fornitore, eseguire il reimaging e il flashing della nuova immagine.
Per estrarre l'immagine completa vendor_boot
, il comando fetch:vendor_boot
è stato aggiunto sia al protocollo fastboot sia all'implementazione del protocollo fastbootd in Android 12. Tieni presente che fastbootd fa
implementarla, ma potrebbe non esserlo il bootloader stesso. Gli OEM possono aggiungere il comando fetch:vendor_boot
all'implementazione del bootloader del protocollo. Tuttavia, se il comando non viene riconosciuto in modalità bootloader, il flashing di singoli ramdisk del fornitore in modalità bootloader non è un'opzione supportata dal fornitore.
Modifiche del bootloader
I comandi getvar:max-fetch-size
e fetch:name
sono implementati in
fastbootd
. Per supportare il flashing delle ramdisk del fornitore nel bootloader, devi implementare questi due comandi.
Modifiche a fastbootd
getvar:max-fetch-size
è simile a max-download-size
. Specifica
dimensione massima che il dispositivo può inviare in una risposta DATA. Il conducente non deve
una dimensione superiore a questo valore.
fetch:name[:offset[:size]]
esegue una serie di controlli sul dispositivo. Se tutte le condizioni riportate di seguito sono vere, il comando fetch:name[:offset[:size]]
restituisce i dati:
- Sul dispositivo è in esecuzione una build di cui è possibile eseguire il debug.
- Il dispositivo è sbloccato (stato di avvio arancione).
- Il nome della partizione recuperata è
vendor_boot
. - Il valore
size
rientra nell'intervallo 0 <size
<=max-fetch-size
.
Una volta verificati, fetch:name[:offset[:size]]
restituisce le dimensioni e l'offset della partizione.
Nota:
fetch:name
è equivalente afetch:name:0
, che è equivalente afetch:name:0:partition_size
.fetch:name:offset
equivale afetch:name:offset:(partition_size - offset)
Pertanto fetch:name[:offset[:size]]
=
fetch:name:offset:(partition_size - offset)
.
Quando offset
o partition_size
(o entrambi) non sono specificati, vengono utilizzati i valori predefiniti, che per offset
sono 0 e per size
è il valore calcolato di partition_size - offset
.
- Offset specificato, dimensioni non specificate:
size = partition_size - offset
- Nessuno dei due specificati: valori predefiniti utilizzati per entrambi,
size = partition_size
- 0.
Ad esempio, fetch:foo
recupera l'intera partizione foo
con l'offset 0.
Modifiche ai driver
Sono stati aggiunti comandi allo strumento fastboot per implementare le modifiche del driver. Ciascuno è collegato alla sua definizione completa nella tabella di Fastboot comandi.
fastboot fetch vendor_boot out.img
- Chiama
getvar max-fetch-size
per determinare la dimensione del chunk. - Chiama
getvar partition-size:vendor_boot[_a]
per determinare le dimensioni dell'intera partizione. - Chiamate
fastboot fetch vendor_boot[_a]:offset:size
per ogni un blocco note. (la dimensione del blocco è maggiore della dimensionevendor_boot
, perciò di solito esiste un solo blocco. - Unisce i dati in
out.img
.
- Chiama
fastboot flash vendor_boot:default vendor-ramdisk.img
Si tratta di una variante speciale del comando flash. Recupera le
vendor_boot
immagine, come se venisse chiamatofastboot fetch
.- Se l'avvio del fornitore è la versione dell'intestazione
3,
esegue le seguenti operazioni:
- Sostituisce il ramdisk del fornitore con l'immagine specificata.
- Fa lampeggiare la nuova immagine
vendor_boot
.
- Se l'intestazione di avvio del fornitore è versione
4,
esegue le seguenti operazioni:
- Sostituisce l'intero ramdisk del fornitore con l'immagine specificata in modo che quest'ultima diventi l'unico frammento del ramdisk del fornitore nell'immagine
vendor_boot
. - Ricacula le dimensioni e l'offset nella tabella del ramdisk del fornitore.
- La nuova immagine
vendor_boot
lampeggia.
- Sostituisce l'intero ramdisk del fornitore con l'immagine specificata in modo che quest'ultima diventi l'unico frammento del ramdisk del fornitore nell'immagine
- Se l'avvio del fornitore è la versione dell'intestazione
3,
esegue le seguenti operazioni:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Recupera
vendor_boot image
, come se fosse stata chiamatafastboot fetch
.- Se l'intestazione di avvio del fornitore è la versione 3, restituisce un errore.
Se l'intestazione di avvio del fornitore è la versione 4, esegue le seguenti operazioni:
- Trova il frammento del ramdisk del fornitore con il nome
ramdisk_<var><foo></var>
. Se non viene trovata alcuna corrispondenza o se sono presenti più corrispondenze, viene restituito un errore. - Sostituisce il frammento ramdisk del fornitore con l'immagine fornita.
- Ricacula ogni dimensione e offset nella tabella del ramdisk del fornitore.
- La nuova immagine
vendor_boot
lampeggia.
- Trova il frammento del ramdisk del fornitore con il nome
Se <foo> non è specificato, prova a trovare
ramdisk_
.
mkbootimg
Il nome default
è riservato alla denominazione dei frammenti del ramdisk del fornitore in Android 12 e versioni successive. Mentre fastboot flash vendor_boot:default
la semantica rimane la stessa, non devi nominare i frammenti ramdisk come
default
.
Modifiche a SELinux
È stata apportata una modifica in
fastbootd.te
per supportare il flashing delle ramdisk del fornitore.