Sposta fastboot nello spazio utente

Android 10 e versioni successive supportano le partizioni ridimensionabili riposizionando l'implementazione fastboot dal bootloader allo spazio utente. Questo trasferimento consente di spostare il codice di flashing in una posizione comune gestibile e testabile, dove solo le parti di fastboot specifiche del fornitore sono implementate tramite un HAL (Hardware Astrazione Layer). Inoltre, Android 12 e versioni successive supportano il flashing dei ramdisk tramite un comando fastboot aggiunto.

Unifica fastboot e ripristino

Poiché fastboot e ripristino dello spazio utente sono simili, puoi unirli in un'unica partizione o file binario. Ciò offre vantaggi come l'utilizzo di meno spazio, il minor numero di partizioni nel complesso e la condivisione di kernel e librerie di avvio rapido e ripristino.

Per supportare fastbootd, il bootloader deve implementare un nuovo comando di blocco di controllo di avvio (BCB) di boot-fastboot. Per attivare la modalità fastbootd, il bootloader scrive boot-fastboot nel campo di comando del messaggio BCB e lascia invariato il campo recovery di BCB (per consentire il riavvio di qualsiasi attività di ripristino interrotta). Anche i campi status, stage e reserved rimangono invariati. Il bootloader viene caricato e avviato nell'immagine di ripristino dopo aver visualizzato boot-fastboot nel campo di comando BCB. Il ripristino analizza quindi il messaggio BCB e passa alla modalità fastbootd.

Comandi ADB

Questa sezione descrive il comando adb per l'integrazione di fastbootd. I risultati del comando sono diversi, a seconda che venga eseguito dal sistema o dal ripristino.

Comando Descrizione
reboot fastboot
  • Si riavvia in fastbootd (sistema).
  • Inserisce direttamente fastbootd senza riavvio (ripristino).

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 da bootloader o da fastbootd.

Comando Descrizione
reboot recovery
  • Si riavvia e viene eseguito il ripristino (bootloader).
  • Inserisce il ripristino direttamente senza riavvio (fastbootd).
reboot fastboot Si riavvia in fastbootd.
getvar is-userspace
  • Restituisce yes (fastbootd).
  • Restituisce no (bootloader).
getvar is-logical:<partition> Restituisce yes se la partizione specificata è una partizione logica, no in caso contrario. 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 attuale se la super partizione è 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 già esistere come partizione logica.
delete-logical-partition <partition> Elimina la partizione logica specificata (cancella la partizione).
resize-logical-partition <partition> <size> Ridimensiona la partizione logica alle nuove dimensioni senza modificarne i contenuti. L'operazione non riesce se non c'è abbastanza spazio disponibile per eseguire il ridimensionamento.
update-super <partition> Unisce le modifiche ai metadati della superpartizione. Se non è possibile unire (ad esempio, il formato sul dispositivo è una versione non supportata), questo comando non riesce. Un parametro facoltativo wipe sovrascrive i metadati del dispositivo, anziché eseguire un'unione.
flash <partition><filename> ] Scrive un file in una partizione flash. Il dispositivo deve essere in stato sbloccato.
erase <partition> Cancella una partizione (non è necessaria per essere resettata sicura). Il dispositivo deve essere 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 active. Al successivo tentativo di avvio, il sistema si avvia dallo slot specificato.

Per il supporto A/B, gli slot sono insiemi duplicati di partizioni che possono essere avviate in modo indipendente. Gli slot sono denominati a, b e così via e sono differenziati aggiungendo i suffissi _a, _b e così via al nome della partizione.

reboot Riavvia il dispositivo normalmente.
reboot-bootloader (o reboot bootloader) Riavvia il dispositivo in bootloader.
fastboot fetch vendor_boot <out.img>

Utilizza in Android 12 e versioni successive per supportare gli ramdisk del fornitore flash.

Recupera l'intera dimensione della partizione e la dimensione del blocco. Recupera i dati per ogni blocco e poi li unisce in <out.img>

Per maggiori dettagli, vedi fastboot fetch vendor_boot <out.img>.

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 fetch vendor_boot, come se fosse stato chiamato fastboot fetch. La nuova immagine vendor_boot visualizzata dipende dalla versione 3 o 4 dell'intestazione di avvio.

Per maggiori dettagli, vedi fastboot flash vendor_boot:default <vendor-ramdisk.img>.

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Utilizza in Android 12 e versioni successive per supportare gli ramdisk del fornitore flash.

Recupera l'immagine vendor_boot. Restituisce un errore se l'intestazione di avvio del fornitore è in versione 3. Se è la versione 4, trova il frammento ramdisk del fornitore corretto (se disponibile). Sostituisce quello con l'immagine specificata, ricalcola le dimensioni e gli offset e mostra il nuovo vendor_boot image.

Per maggiori dettagli, vedi fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>

Fastboot e bootloader

Il bootloader esegue il flashing delle partizioni bootloader, radio e boot/recovery, dopodiché il dispositivo si avvia in fastboot (spazio utente) e esegue il flashing di tutte le altre partizioni. Il bootloader deve supportare i comandi riportati di seguito.

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 Ottiene una variabile bootloader necessaria per il flashing dell'immagine di ripristino/di avvio (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 i dispositivi di partizione dinamica riadattati, lo strumento fastboot (e bootloader) supporta una modalità forzata per eseguire il flashing diretto di una partizione dinamica in modalità bootloader. Ad esempio, se system è una partizione dinamica sul dispositivo aggiornato, l'utilizzo del comando fastboot --force flash system consente al bootloader (invece di fastbootd) di eseguire il flashing della partizione.

Ricarica in modalità off

Se un dispositivo supporta la ricarica fuori modalità o si avvia automaticamente in una modalità speciale quando viene applicata l'alimentazione, un'implementazione del 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.

HAL OEM Fastboot

Per sostituire completamente fastboot del bootloader, fastboot deve gestire tutti i comandi fastboot esistenti. Molti di questi comandi provengono da OEM e sono documentati, ma richiedono un'implementazione personalizzata. Molti comandi specifici OEM non sono documentati. Per gestire questi comandi, l'HAL fastboot specifica i comandi OEM richiesti. 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);

};

Abilita fastbootd

Per attivare fastbootd su un dispositivo:

  1. Aggiungi fastbootd a PRODUCT_PACKAGES in device.mk: PRODUCT_PACKAGES += fastbootd.

  2. Assicurati che l'HAL fastboot, l'HAL per il controllo dell'avvio e l'HAL di integrità siano pacchettizzati come parte dell'immagine di ripristino.

  3. Aggiungi eventuali autorizzazioni SEPolicy specifiche per il 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 di fastboot HAL può anche richiedere autorizzazioni specifiche del dispositivo.

Per convalidare fastboot dello spazio utente, esegui Vendor Test Suite (VTS).

Ramdisk fornitore Flash

Android 12 e versioni successive supportano il flashing dei ramdisk con un comando fastboot aggiunto che esegue il pull dell'immagine vendor_boot completa da un dispositivo. Il comando richiede allo strumento fastboot lato host di leggere l'intestazione di avvio del fornitore, ricreare l'immagine e eseguire il flashing della nuova immagine.

Per eseguire il pull dell'immagine vendor_boot completa, è stato aggiunto il comando fetch:vendor_boot sia al protocollo fastboot sia all'implementazione fastbootd del protocollo in Android 12. Tieni presente che fastbootd implementa questa funzionalità, ma potrebbe non essere 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 dei ramdisk dei singoli fornitori 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 dei ramdisk del fornitore nel bootloader, devi implementare questi due comandi.

Modifiche a Fastbootd

getvar:max-fetch-size è simile a max-download-size. Specifica le dimensioni massime che il dispositivo può inviare in una risposta DATA. Il driver non deve recuperare una dimensione superiore a questo valore.

fetch:name[:offset[:size]] esegue una serie di controlli sul dispositivo. Se tutte le seguenti condizioni 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 in 0 < size <= max-fetch-size.

Una volta verificati, fetch:name[:offset[:size]] restituisce la dimensione e l'offset della partizione. Nota:

  • fetch:name è equivalente a fetch:name:0, che equivale a fetch:name:0:partition_size.
  • fetch:name:offset equivale a fetch: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 è 0, mentre per size è il valore calcolato 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 relativa definizione completa nella tabella dei comandi Fastboot.

  • fastboot fetch vendor_boot out.img

    • Richiama getvar max-fetch-size per determinare la dimensione del blocco.
    • Richiama getvar partition-size:vendor_boot[_a] per determinare la dimensione dell'intera partizione.
    • Chiama fastboot fetch vendor_boot[_a]:offset:size per ogni blocco. (La dimensione del blocco è maggiore della dimensione vendor_boot, quindi di solito è presente un solo blocco.)
    • Unisci i dati per out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Si tratta di una variante speciale del comando Flash. Recupera l'immagine vendor_boot, come se fosse stato chiamato fastboot fetch.

    • Se l'avvio del fornitore è l'intestazione versione 3, fa quanto segue:
      • Sostituisce il ramdisk del fornitore con l'immagine fornita.
      • Fa lampeggiare la nuova immagine vendor_boot.
    • Se l'intestazione di avvio del fornitore è la versione 4, fa quanto segue:
      • Sostituisce l'intero ramdisk del fornitore con l'immagine fornita, in modo che quest'ultima diventi l'unico frammento ramdisk del fornitore nell'immagine vendor_boot.
      • Ricalcola la dimensione e l'offset nella tabella ramdisk del fornitore.
      • Fa lampeggiare la nuova immagine vendor_boot.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Recupera vendor_boot image, come se fosse stato chiamato fastboot fetch.

    • Se l'intestazione di avvio del fornitore è la versione 3, restituisce un errore.
    • Se l'intestazione di avvio del fornitore è la versione 4, procede come segue:

      • Trova il frammento ramdisk del fornitore con nome foo. Se non viene trovato o se sono presenti più corrispondenze, restituisce un errore.
      • Sostituisce il frammento ramdisk del fornitore con l'immagine fornita.
      • Ricalcola ogni dimensione e offset nella tabella ramdisk del fornitore.
      • Fa lampeggiare la nuova immagine vendor_boot.

mkbootimg

Il nome default è riservato alla denominazione dei frammenti ramdisk del fornitore in Android 12 e versioni successive. Anche se la semantica di fastboot flash vendor_boot:default rimane la stessa, non devi assegnare ai tuoi frammenti ramdisk il nome default.

Modifiche a SELinux

È stata apportata una modifica in fastbootd.te per supportare i ramdisk del fornitore flash.