Android 10 et versions ultérieures prennent en charge les partitions redimensionnables en déplaçant l'implémentation de fastboot du chargeur de démarrage vers l'espace utilisateur. Ce déplacement permet de déplacer le code clignotant vers un emplacement commun maintenable et testable 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 versions ultérieures prennent en charge le flashage des disques virtuels via une commande fastboot ajoutée.
Unifier le démarrage rapide et la récupération
Étant donné que 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, le fait d'avoir globalement moins de partitions et le fait que Fastboot et Recovery partagent leur noyau et leurs bibliothèques.
Pour prendre en charge
fastbootd , le chargeur de démarrage doit implémenter une nouvelle commande de bloc de contrôle de démarrage (BCB) de
boot-fastboot . Pour passer en mode
fastbootd , le chargeur de démarrage écrit
boot-fastboot dans le champ de commande du message BCB et laisse le champ
recovery de BCB inchangé (pour permettre le redémarrage de toute tâche de récupération interrompue). Les champs
status ,
stage et
reserved restent également inchangés. Le chargeur de démarrage se charge et démarre dans l'image de récupération après avoir vu
boot-fastboot dans le champ de commande BCB. Recovery analyse ensuite le message BCB et passe en mode
fastbootd .
Commandes BAD
Cette section décrit la commande
adb pour intégrer
fastbootd . La commande a des résultats différents selon qu'elle est exécutée par le système ou par récupération.
|Commande||Description|


Commandes de démarrage rapide
Cette section décrit les commandes fastboot pour intégrer
fastbootd , y compris les nouvelles commandes pour flasher et gérer les 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|


| || Redémarre dans |


| || Renvoie |
| ||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 n'est généralement pas le cas).|
| ||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.|
| ||Supprime la partition logique donnée (efface effectivement la partition).|
| ||Redimensionne la partition logique à la nouvelle taille sans modifier son contenu. Échoue s'il n'y a pas suffisamment d'espace disponible pour effectuer le redimensionnement.|
| || Fusionne les modifications apportées aux métadonnées de la super partition. Si une fusion n'est pas possible (par exemple, le format sur l'appareil est une version non prise en charge), cette commande échoue. Un paramètre |
| ||Écrit un fichier sur une partition flash. L'appareil doit être dans l'état déverrouillé.|
| ||Efface une partition (pas nécessaire pour un effacement sécurisé). L'appareil doit être dans l'état déverrouillé.|
| ||Affiche une variable du chargeur de démarrage ou toutes les variables. Si la variable n'existe pas, renvoie une erreur.|


Définit l'emplacement de démarrage A/B donné comme
Pour la prise en charge A/B, les emplacements sont des ensembles de partitions dupliqués qui peuvent être démarrés indépendamment. Les emplacements sont nommés
| ||Redémarre l'appareil normalement.|
| ||Redémarre l'appareil dans le chargeur de démarrage.|


À utiliser sous Android 12 et versions ultérieures pour prendre en charge les disques virtuels clignotants des fournisseurs.
Obtient la taille totale de la partition et la taille du bloc. Récupère les données pour chaque morceau, puis assemble les données dans
Pour plus de détails, consultez


À utiliser sous Android 12 et versions ultérieures pour prendre en charge les disques virtuels clignotants des fournisseurs.
Il s'agit d'une variante spéciale de la commande flash. Il exécute une fonction de récupération de l'image
Pour plus de détails, consultez
| || À utiliser sous Android 12 et versions ultérieures pour prendre en charge les disques virtuels clignotants des fournisseurs.|
Récupère l'image
Pour plus de détails, consultez
Fastboot et chargeur de démarrage
Le chargeur de démarrage fait clignoter les partitions du
bootloader ,
radio et
boot/recovery , après quoi le périphérique démarre dans fastboot (espace utilisateur) et fait clignoter toutes les autres partitions. Le chargeur de démarrage doit prendre en charge les commandes suivantes.
|Commande||Description|
| ||Télécharge l'image à flasher.|
| || Clignote la partition |
| ||Redémarre l'appareil.|
| ||Redémarre en fastboot.|
| ||Redémarre vers la récupération.|
| || Obtient une variable du chargeur de démarrage requise pour le flashage de l'image de récupération/de démarrage (par exemple, |
| ||Commande définie par OEM.|
Partitions dynamiques
Le chargeur de démarrage ne doit pas permettre le flashage ou l'effacement des partitions dynamiques et doit renvoyer une erreur si ces opérations sont tentées. Pour les périphériques de partition dynamique modernisés, l'outil fastboot (et le chargeur de démarrage) prend en charge un mode forcé pour flasher directement une partition dynamique en mode chargeur de démarrage. Par exemple, si
system est une partition dynamique sur le périphérique mis à niveau, l'utilisation de la commande
fastboot --force flash system permet au chargeur de démarrage (au lieu de
fastbootd ) de flasher la partition.
Chargement hors mode
Si un appareil prend en charge le chargement hors mode ou démarre automatiquement dans un mode spécial lorsque l'alimentation est appliquée, 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 d'alimentation.
HAL OEM de démarrage rapide
Pour remplacer complètement le chargeur de démarrage fastboot, fastboot doit gérer toutes les commandes fastboot existantes. Beaucoup 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 de telles commandes, le fastboot HAL spécifie les commandes OEM requises. Les OEM peuvent également implémenter leurs propres commandes.
La définition de fastboot HAL 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); };
Activation de Fastbootd
Pour activer
fastbootd sur un appareil :
Ajoutez
fastbootdà
PRODUCT_PACKAGESdans
device.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'intégrité sont intégrés à l'image de récupération.
Ajoutez toutes les autorisations SEPolicy spécifiques au périphérique requises par
fastbootd. Par exemple,
fastbootdnécessite un accès en écriture à une partition spécifique au périphérique pour flasher cette partition. De plus, la mise en œuvre de fastboot HAL peut également nécessiter des autorisations spécifiques au périphérique.
Pour valider le démarrage rapide de l'espace utilisateur, exécutez Vendor Test Suite (VTS) .
Disques RAM du fournisseur clignotants
Android 12 et versions ultérieures prennent en charge les disques virtuels clignotants avec une commande fastboot ajoutée qui extrait l'image complète
vendor_boot d'un appareil. La commande invite l'outil de démarrage rapide côté hôte à lire l'en-tête de démarrage du fournisseur, à réimager et à flasher la nouvelle image.
Pour extraire l'image complète
vendor_boot , 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 l' implémente , mais le chargeur de démarrage lui-même pourrait ne pas le faire. Les OEM peuvent ajouter la commande
fetch:vendor_boot à leur implémentation du protocole dans leur chargeur de démarrage. Cependant, si la commande n'est pas reconnue en mode chargeur de démarrage, le flashage des disques virtuels d'un fournisseur individuel en mode chargeur de démarrage n'est pas une option prise en charge par le fournisseur.
Modifications du chargeur de démarrage
Les commandes
getvar:max-fetch-size et
fetch:name sont implémentées dans
fastbootd . Pour prendre en charge les disques virtuels clignotants du fournisseur dans le chargeur de démarrage, vous devez implémenter ces deux commandes.
Modifications à démarrage rapide
getvar:max-fetch-size est similaire à
max-download-size . Il spécifie la taille maximale que l'appareil peut envoyer dans une réponse DATA. Le pilote ne doit pas récupérer une taille supérieure à cette valeur.
fetch:name[:offset[:size]] effectue une série de vérifications sur le périphérique. Si toutes les conditions suivantes sont vraies, la commande
fetch:name[:offset[:size]] renvoie des données :
- L'appareil exécute une version déboguable.
- L'appareil est déverrouillé (état de démarrage orange).
- Le nom de la partition récupéré est
vendor_boot.
- La valeur
sizeest comprise entre 0 <
size<=
max-fetch-size.
Une fois ceux-ci vérifiés,
fetch:name[:offset[:size]] renvoie la taille et le décalage de la partition. Notez ce qui suit :
-
fetch:nameest équivalent à
fetch:name:0, qui est équivalent à
fetch:name:0:partition_size.
-
fetch:name:offsetest équivalent à
fetch:name:offset:(partition_size - offset)
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, qui pour
offset est 0 et pour
size est la valeur calculée de
partition_size - offset .
- Décalage spécifié, taille non spécifiée :
size = partition_size - offset
- Aucun des deux n'est spécifié : valeurs par défaut utilisées pour les deux,
size = partition_size- 0.
Par exemple,
fetch:foo récupère la totalité de la partition
foo au décalage 0.
Changements de pilote
Des commandes ont été ajoutées à l'outil fastboot pour implémenter les modifications du pilote. Chacune est liée à sa définition complète dans le tableau des commandes Fastboot .
fastboot fetch vendor_boot out.img
- Appelle
getvar max-fetch-sizepour déterminer la taille du morceau.
- Appelle
getvar partition-size:vendor_boot[_a]pour déterminer la taille de la partition entière.
- Appelle
fastboot fetch vendor_boot[_a]:offset:sizepour chaque morceau. (La taille du bloc est supérieure à la taille du
vendor_boot, il n'y a donc normalement qu'un seul bloc.)
- Assemble les données ensemble, vers
out.img.
- Appelle
fastboot flash vendor_boot:default vendor-ramdisk.img
Il s'agit d'une variante spéciale de la commande flash. Il récupère l'image
vendor_boot, comme si
fastboot fetchétait appelé.
- Si le démarrage du fournisseur est la version d'en-tête 3 , il effectue les opérations suivantes :
- Remplace le disque virtuel du fournisseur par l'image donnée.
- Fait clignoter la nouvelle image
vendor_boot.
- Si l'en-tête de démarrage du fournisseur est la version 4 , il effectue les opérations suivantes :
- Remplace l'intégralité du disque virtuel du fournisseur par l'image donnée afin que l'image donnée devienne le seul fragment de disque virtuel du fournisseur dans l'image
vendor_boot.
- Recalcule la taille et le décalage dans la table du disque virtuel du fournisseur.
- Fait clignoter la nouvelle image
vendor_boot.
- Remplace l'intégralité du disque virtuel du fournisseur par l'image donnée afin que l'image donnée devienne le seul fragment de disque virtuel du fournisseur dans l'image
- Si le démarrage du fournisseur est la version d'en-tête 3 , il effectue les opérations suivantes :
fastboot flash vendor_boot:foo vendor-ramdisk.img
Récupère
vendor_boot image, comme si
fastboot fetchétait appelé.
- Si l'en-tête de démarrage du fournisseur est la version 3, il renvoie une erreur.
Si l'en-tête de démarrage du fournisseur est la version 4, il effectue les opérations suivantes :
- Recherche le fragment de disque virtuel du fournisseur portant le nom
foo. S'il n'est pas trouvé ou s'il existe plusieurs correspondances, renvoie une erreur.
- Remplace le fragment de disque virtuel du fournisseur par l'image donnée.
- Recalcule chaque taille et décalage dans la table du disque virtuel du fournisseur.
- Fait clignoter la nouvelle image
vendor_boot.
- Recherche le fragment de disque virtuel du fournisseur portant le nom
mkbootimg
Le nom
default est réservé pour nommer les fragments de disque virtuel du fournisseur dans Android 12 et versions ultérieures. Bien que la sémantique fastboot
flash vendor_boot:default reste la même, vous ne devez pas nommer vos fragments de disque virtuel par
default .
Modifications de SELinux
Une modification a été apportée à
fastbootd.te pour prendre en charge les disques virtuels clignotants des fournisseurs.