Fastboot est le nom du module et du mode du bootloader. Android 10 et les versions ultérieures prennent en charge les partitions redimensionnables en déplaçant l'implémentation de Fastboot du bootloader vers l'espace utilisateur. Cette relocalisation permet de déplacer le code de flashage vers un emplacement commun, facile à gérer et à tester, avec uniquement les parties de fastboot spécifiques au fournisseur implémentées par une couche d'abstraction matérielle (HAL). De plus, Android 12 et les versions ultérieures prennent en charge le flash des ramdisks via une commande fastboot ajoutée.
Unifier Fastboot et la récupération
Comme le démarrage rapide et la récupération de l'espace utilisateur sont similaires, vous pouvez les fusionner en une seule partition ou un seul binaire. Cela offre des avantages tels que l'utilisation de moins d'espace, la réduction du nombre de partitions et le partage du noyau et des bibliothèques entre Fastboot et la récupération.
Fastbootd est le nom d'un daemon et d'un mode d'espace utilisateur.
Pour prendre en charge fastbootd
, le bootloader doit implémenter une nouvelle commande BCB (boot control block) de boot-fastboot
. Pour entrer en mode fastbootd
, le bootloader écrit boot-fastboot
dans le champ de commande du message BCB et laisse le champ recovery
du BCB inchangé (pour permettre de redémarrer les tâches de récupération interrompues). Les champs status
, stage
et reserved
restent également inchangés.
Le bootloader charge et démarre dans l'image de récupération lorsqu'il voit boot-fastboot
dans le champ de commande BCB. La récupération analyse ensuite le message BCB et passe en mode fastbootd
.
Commandes ADB
Cette section décrit la commande adb
pour intégrer fastbootd
. La commande produit des résultats différents, selon qu'elle est exécutée par le système ou par la récupération.
Commande | Description |
---|---|
reboot fastboot |
|
Commandes Fastboot
Cette section décrit les commandes fastboot permettant d'intégrer fastbootd
, y compris les nouvelles commandes de flashage et de gestion des partitions logiques. Certaines commandes ont des résultats différents, selon qu'elles ont été exécutées par le bootloader ou par fastbootd
.
Commande | Description |
---|---|
reboot recovery |
|
reboot fastboot |
Redémarrage dans fastbootd . |
getvar is-userspace |
|
getvar is-logical:<partition> |
Renvoie yes si la partition donnée est une partition logique, et no dans les autres cas.
Les partitions logiques sont compatibles avec toutes les commandes listées ci-dessous. |
getvar super-partition-name |
Renvoie le nom de la super partition. Le nom inclut le suffixe de l'emplacement actuel si la super partition est une partition A/B (ce qui n'est généralement pas le cas). |
create-logical-partition <partition> <size> |
Crée une partition logique avec le nom et la taille donnés. Le nom ne doit pas déjà exister en tant que partition logique. |
delete-logical-partition <partition> |
Supprime la partition logique donnée (efface efficacement la partition). |
resize-logical-partition <partition> <size> |
Redimensionne la partition logique à la nouvelle taille sans modifier son contenu. Échec si l'espace disponible n'est pas suffisant pour effectuer le redimensionnement. |
update-super <partition> |
Fusionne les modifications apportées aux métadonnées de la super partition. Si une fusion n'est pas possible (par exemple, si le format de l'appareil est une version non prise en charge), cette commande échoue. Un paramètre wipe facultatif écrase les métadonnées de l'appareil, plutôt que d'effectuer une fusion. |
flash <partition> [ <filename> ] |
Écrit un fichier sur une partition Flash. L'appareil doit être déverrouillé. |
erase <partition> |
Efface une partition (pas nécessairement un effacement sécurisé). L'appareil doit être déverrouillé. |
getvar <variable> | all |
Affiche une variable du bootloader ou toutes les variables. Si la variable n'existe pas, une erreur est renvoyée. |
set_active <slot> |
Définit l'emplacement de démarrage A/B donné sur Pour la prise en charge de l'option A/B, les emplacements sont des ensembles de partitions en double qui peuvent être démarrés indépendamment. Les emplacements sont nommés |
reboot |
Redémarre l'appareil normalement. |
reboot-bootloader (ou reboot bootloader ) |
Redémarre l'appareil dans le bootloader. |
fastboot fetch vendor_boot <out.img> |
À utiliser dans Android 12 et versions ultérieures pour prendre en charge le flashage des ramdisks du fournisseur.
Récupère la taille totale de la partition et la taille du segment. Récupère les données pour chaque fragment, puis les assemble en
Pour en savoir plus, consultez |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
À utiliser dans Android 12 et versions ultérieures pour prendre en charge le flash des ramdisks du fournisseur. Il s'agit d'une variante spéciale de la commande flash. Il exécute une fonction d'image
Pour en savoir plus, consultez |
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
À utiliser dans Android 12 et versions ultérieures pour prendre en charge le flash des ramdisks du fournisseur. Récupère l'image Pour en savoir plus, consultez |
Fastboot et bootloader
Le bootloader flashe les partitions bootloader
, radio
et boot/recovery
, après quoi l'appareil démarre en fastboot (espace utilisateur) et toutes les autres partitions sont flashées. Le bootloader doit prendre en charge les commandes suivantes.
Commande | Description |
---|---|
download |
Télécharge l'image à flasher. |
flash recovery <image>/ flash boot <image>/ flash
bootloader <image>/ |
Flashe la partition recovery/boot et le bootloader. |
reboot |
Redémarre l'appareil. |
reboot fastboot |
Redémarre en mode Fastboot. |
reboot recovery |
Redémarre en mode récupération. |
getvar |
Récupère une variable de bootloader requise pour le flashage de l'image de récupération/démarrage (par exemple, current-slot et max-download-size ). |
oem <command> |
Commande définie par l'OEM. |
Partitions dynamiques
Le bootloader ne doit pas autoriser le flashage ou l'effacement de partitions dynamiques, et doit renvoyer une erreur si ces opérations sont tentées. Pour les appareils à partition dynamique rétrofités, l'outil fastboot (et le bootloader) prend en charge un mode de force pour flasher directement une partition dynamique en mode bootloader. Par exemple, si system
est une partition dynamique sur l'appareil rétrofitté, l'utilisation de la commande fastboot --force flash system
permet au bootloader (au lieu de fastbootd
) de flasher la partition.
Recharge hors mode
Si un appareil prend en charge la recharge hors mode ou démarre automatiquement dans un mode spécial lorsqu'il est alimenté, une implémentation de la commande fastboot oem off-mode-charge 0
doit contourner ces modes spéciaux, afin que l'appareil démarre comme si l'utilisateur avait appuyé sur le bouton Marche/Arrêt.
HAL OEM Fastboot
Pour remplacer complètement le fastboot du bootloader, fastboot doit gérer toutes les commandes fastboot existantes. La plupart de ces commandes proviennent d'OEM et sont documentées, mais nécessitent une implémentation personnalisée. De nombreuses commandes spécifiques aux OEM ne sont pas documentées. Pour gérer ces commandes, le HAL fastboot spécifie les commandes OEM requises. Les OEM peuvent également implémenter leurs propres commandes.
La définition de l'HAL fastboot est la suivante:
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);
};
Activer fastbootd
Pour activer fastbootd
sur un appareil:
Ajoutez
fastbootd
àPRODUCT_PACKAGES
dansdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Assurez-vous que le HAL de démarrage rapide, le HAL de contrôle de démarrage et le HAL d'état sont empaquetés dans l'image de récupération.
Ajoutez toutes les autorisations SEPolicy spécifiques à l'appareil requises par
fastbootd
. Par exemple,fastbootd
nécessite un accès en écriture à une partition spécifique à l'appareil pour flasher cette partition. De plus, l'implémentation du HAL fastboot peut également nécessiter des autorisations spécifiques à l'appareil.
Pour valider le fastboot de l'espace utilisateur, exécutez la suite de test de fournisseur (VTS).
Disques RAM du fournisseur Flash
Android 12 et versions ultérieures prennent en charge le flashage de ramdisks avec une commande fastboot supplémentaire qui extrait l'image vendor_boot
complète d'un appareil. La commande invite l'outil fastboot côté hôte à lire l'en-tête de démarrage du fournisseur, à recréer l'image et à flasher la nouvelle image.
Pour extraire l'image vendor_boot
complète, la commande fetch:vendor_boot
a été ajoutée à la fois au protocole fastboot et à l'implémentation fastbootd du protocole dans Android 12. Notez que fastbootd implémente cette fonctionnalité, mais que le bootloader lui-même ne le fait peut-être pas. Les OEM peuvent ajouter la commande fetch:vendor_boot
à l'implémentation du bootloader du protocole. Toutefois, si la commande n'est pas reconnue en mode bootloader, le flashage de ramdisks de fournisseurs individuels en mode bootloader n'est pas une option prise en charge par le fournisseur.
Modifications apportées au bootloader
Les commandes getvar:max-fetch-size
et fetch:name
sont implémentées dans fastbootd
. Pour prendre en charge le flash des ramdisks du fournisseur dans le bootloader, vous devez implémenter ces deux commandes.
Modifications apportées à fastbootd
getvar:max-fetch-size
est semblable à max-download-size
. Il spécifie la taille maximale que l'appareil peut envoyer dans une réponse DATA. Le pilote ne doit pas extraire une taille supérieure à cette valeur.
fetch:name[:offset[:size]]
effectue une série de vérifications sur l'appareil. Si toutes les conditions suivantes sont remplies, la commande fetch:name[:offset[:size]]
renvoie des données:
- L'appareil exécute un build débogable.
- L'appareil est déverrouillé (état de démarrage orange).
- Le nom de la partition récupérée est
vendor_boot
. - La valeur
size
est comprise entre 0 <size
<=max-fetch-size
.
Une fois ces éléments vérifiés, fetch:name[:offset[:size]]
renvoie la taille et le décalage de la partition.
Remarques :
fetch:name
équivaut àfetch:name:0
, ce qui équivaut àfetch:name:0:partition_size
.fetch:name:offset
est équivalent àfetch:name:offset:(partition_size - offset)
On obtient donc fetch:name[:offset[:size]]
= fetch:name:offset:(partition_size - offset)
.
Lorsque offset
ou partition_size
(ou les deux) ne sont pas spécifiés, les valeurs par défaut sont utilisées. Pour offset
, elle est égale à 0, et pour size
, la valeur calculée de partition_size - offset
.
- Décalage spécifié, taille non spécifiée:
size = partition_size - offset
- Aucune valeur n'est spécifiée: valeurs par défaut utilisées pour les deux,
size = partition_size
- 0.
Par exemple, fetch:foo
extrait l'intégralité de la partition foo
au décalage 0.
Modifications des pilotes
Des commandes ont été ajoutées à l'outil fastboot pour implémenter les modifications de pilotes. Chacun est associé à sa définition complète dans le tableau des commandes Fastboot.
fastboot fetch vendor_boot out.img
- Appele
getvar max-fetch-size
pour déterminer la taille du segment. - Appele
getvar partition-size:vendor_boot[_a]
pour déterminer la taille de l'ensemble de la partition. - Appels
fastboot fetch vendor_boot[_a]:offset:size
pour chaque bloc. (La taille des fragments est supérieure àvendor_boot
, il n'y a donc normalement qu'un seul fragment.) - Assemblage des données à
out.img
.
- Appele
fastboot flash vendor_boot:default vendor-ramdisk.img
Il s'agit d'une variante spéciale de la commande flash. Il extrait l'image
vendor_boot
, comme sifastboot fetch
était appelé.- Si le démarrage du fournisseur est l'en-tête de la version 3, il effectue les opérations suivantes :
- Remplace le ramdisk du fournisseur par l'image donnée.
- Affiche la nouvelle image
vendor_boot
.
- Si l'en-tête de démarrage du fournisseur est de la version 4, il effectue les opérations suivantes :
- Remplace l'ensemble du disque ramdisk du fournisseur par l'image donnée, de sorte que cette image devienne le seul fragment ramdisk du fournisseur dans l'image
vendor_boot
. - Recalcule la taille et le décalage dans la table de ramdisk du fournisseur.
- Affiche la nouvelle image
vendor_boot
.
- Remplace l'ensemble du disque ramdisk du fournisseur par l'image donnée, de sorte que cette image devienne le seul fragment ramdisk du fournisseur dans l'image
- Si le démarrage du fournisseur est l'en-tête de la version 3, il effectue les opérations suivantes :
fastboot flash vendor_boot:foo vendor-ramdisk.img
Récupère
vendor_boot image
, comme sifastboot fetch
était appelé.- Si l'en-tête de démarrage du fournisseur est de la version 3, une erreur est renvoyée.
Si l'en-tête de démarrage du fournisseur est de la version 4, il effectue les opérations suivantes:
- Recherche le fragment de ramdisk du fournisseur nommé
ramdisk_<var><foo></var>
. S'il n'est pas trouvé ou s'il existe plusieurs correspondances, renvoie une erreur. - Remplace le fragment de ramdisk du fournisseur par l'image donnée.
- Recalcule chaque taille et décalage dans la table de ramdisk du fournisseur.
- Flashe la nouvelle image
vendor_boot
.
- Recherche le fragment de ramdisk du fournisseur nommé
Si <foo> n'est pas spécifié, il tente de trouver
ramdisk_
.
mkbootimg
Le nom default
est réservé à la dénomination des fragments de ramdisk du fournisseur dans Android 12 et versions ultérieures. Bien que la sémantique flash vendor_boot:default
de fastboot reste la même, vous ne devez pas nommer vos fragments ramdisk default
.
Modifications apportées à SELinux
Une modification a été apportée dans fastbootd.te
pour prendre en charge le flash des ramdisks du fournisseur.