Android 10 ou version ultérieure est compatible avec les partitions redimensionnables déplacer l'implémentation de fastboot du bootloader vers l'espace utilisateur. Ce le déplacement permet de déplacer le code clignotant dans un environnement emplacement commun avec uniquement les parties spécifiques au fournisseur de fastboot implémentées par 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 de l'espace utilisateur et la récupération sont similaires, vous pouvez les fusionner en un seul ou binaire. Cela offre des avantages tels que l'utilisation de moins d'espace, la possibilité moins de partitions dans l'ensemble, et le fait que fastboot et la récupération partagent leurs du noyau et des bibliothèques.
Pour prendre en charge fastbootd
, le bootloader doit implémenter un nouveau bloc de contrôle du démarrage.
(BCB) de boot-fastboot
. Pour passer 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 le redémarrage en cas d'interruption de la récupération
tâches). Les champs status
, stage
et reserved
restent également inchangés.
Le bootloader se charge et démarre dans l'image de récupération lorsque
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
a 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 de nouvelles commandes pour flasher
et gérer des partitions logiques. Un peu
des commandes ont des résultats différents, selon qu'elles ont été exécutées ou non
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.
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 l'emplacement actuel s'il s'agit d'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 existe déjà en tant que partition logique. |
delete-logical-partition <partition> |
Supprime la partition logique donnée (efface la partition). |
resize-logical-partition <partition> <size> |
Redimensionne la partition logique à la nouvelle taille sans modifier son contenu. L'opération échoue si l'espace disponible est insuffisant pour effectuer le redimensionnement. |
update-super <partition> |
Fusionne les modifications apportées aux métadonnées de la super-partition. Si la fusion est impossible
(par exemple, le format de l'appareil est une version non prise en charge), alors cette
la commande échoue. Un paramètre wipe facultatif remplace le paramètre
au lieu 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 (non nécessaire pour une effacement sécurisé). L'appareil doit se trouver dans l'état déverrouillé. |
getvar <variable> | all |
Affiche une variable du bootloader ou toutes les variables. Si la variable existe, renvoie une erreur. |
set_active <slot> |
Définit l'emplacement de démarrage A/B donné sur Pour la compatibilité A/B, les emplacements sont des ensembles de partitions en double qui peuvent être démarrés
indépendamment les unes des autres. Les emplacements sont nommés |
reboot |
Redémarre normalement l'appareil. |
reboot-bootloader (ou reboot bootloader ) |
Redémarre l'appareil dans le bootloader. |
fastboot fetch vendor_boot <out.img> |
Utilisez-la sur Android 12 ou version ultérieure pour permettent de flasher les ramdisks des fournisseurs.
Récupère la taille totale de la partition et la taille des fragments. Elle obtient les données de chaque fragment,
puis assemble les données pour
Pour en savoir plus, consultez |
fastboot flash vendor_boot:default <vendor-ramdisk.img> |
À utiliser sur Android 12 ou version ultérieure pour permettre la mise en flash des ramdisks des fournisseurs. Il s'agit d'une variante spéciale de la commande flash. Elle exécute une fonction d'image
Pour en savoir plus, consultez
|
fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> |
Utilisez-la sur Android 12 ou version ultérieure pour
prendre en charge le flashage
des ramdisks des fournisseurs. Récupère l'image Pour en savoir plus, consultez
|
Fastboot et bootloader
Le bootloader clignote bootloader
, radio
et boot/recovery
partitions, après lesquelles l'appareil démarre en fastboot (espace utilisateur) et clignote
toutes les autres partitions. Le bootloader doit être compatible avec 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 avant la récupération. |
getvar |
Récupère une variable de bootloader requise pour flasher la récupération ou le 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 permettre le flash ou l'effacement des partitions dynamiques
et doit renvoyer une erreur en cas de tentative de ces opérations. Pour une rénovation
les périphériques de partitionnement dynamiques, l'outil fastboot (et le bootloader) prend en charge
pour flasher directement une partition dynamique
en mode bootloader. Pour
Par exemple, si system
est une partition dynamique sur l'appareil réaménagé,
la commande fastboot --force flash system
active le bootloader
(au lieu de fastbootd
) pour flasher la partition.
Recharge hors mode
Si un appareil prend en charge la recharge hors mode ou démarre automatiquement sur un
en cas de mise sous tension, une implémentation du
La commande fastboot oem off-mode-charge 0
doit
contourner ces modes spéciaux, de sorte que l'appareil démarre comme si l'utilisateur avait appuyé
le bouton Marche/Arrêt.
HAL OEM Fastboot
Pour remplacer complètement le démarrage rapide du bootloader, il doit gérer tous les fastboot. Bon nombre de ces commandes proviennent d'OEM et sont documentées, mais nécessitent une implémentation personnalisée. De nombreuses commandes propres aux OEM ne sont pas documentées. Pour gérer de telles commandes, le HAL fastboot spécifie les attributs Commandes OEM. Les OEM peuvent également implémenter leurs propres commandes.
Voici la définition du HAL fastboot:
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 Fastboot, le HAL de contrôle du démarrage et le HAL d'état sont inclus dans le package dans l'image de récupération.
Ajoutez toutes les autorisations SEPolicy spécifiques à l'appareil requises par
fastbootd
. Pour exemple,fastbootd
nécessite un accès en écriture à une partition spécifique à l'appareil pour flasher cette partition. De plus, l'implémentation d'une HAL fastboot peut aussi nécessitent des autorisations spécifiques à l'appareil.
Pour valider le démarrage rapide d'un espace utilisateur, exécutez la suite de test fournisseur (VTS).
Disques RAM du fournisseur Flash
Android 12 et versions ultérieures sont compatibles avec
flasher les ramdisks avec une commande fastboot qui récupère
vendor_boot
image provenant d'un appareil. La commande déclenche l'exécution rapide
pour lire l'en-tête de démarrage du fournisseur, réimager et flasher la nouvelle image.
Pour extraire l'image vendor_boot
complète, la commande fetch:vendor_boot
a été ajoutée
au protocole fastboot et à son implémentation fastbootd
sur Android 12. Notez que fastbootd fait
mettre en œuvre cela, mais le bootloader lui-même pourrait ne pas l'être. Les OEM peuvent ajouter
la commande fetch:vendor_boot
à l'implémentation du bootloader de
standard. Toutefois, si la commande n'est pas reconnue en mode bootloader, alors
flasher les ramdisks de fournisseurs individuels en mode bootloader n'est pas pris en charge par les fournisseurs
.
Modifications apportées au bootloader
Les commandes getvar:max-fetch-size
et fetch:name
sont implémentées dans
fastbootd
Pour pouvoir flasher les ramdisks de fournisseurs dans le bootloader, vous devez
à implémenter ces deux commandes.
Modifications en fastboot
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 conducteur ne doit pas
récupérer une taille supérieure à cette valeur.
fetch:name[:offset[:size]]
effectue une série de vérifications sur l'appareil. Si tous
des conditions suivantes sont vraies, la commande fetch:name[:offset[:size]]
renvoie des données:
- L'appareil exécute une version 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 les éléments validés, fetch:name[:offset[:size]]
renvoie la taille de la partition.
et le décalage.
Remarques :
fetch:name
équivaut àfetch:name:0
, ce qui équivaut àfetch:name:0:partition_size
fetch:name:offset
équivaut à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, la propriété
des valeurs par défaut sont utilisées : 0 pour offset
et 0 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 spécifiée: valeurs par défaut utilisées dans les deux cas (
size = partition_size
- 0).
Par exemple, fetch:foo
récupère la totalité de la partition foo
avec un décalage de 0.
Modifications des pilotes
Des commandes ont été ajoutées à l'outil fastboot pour implémenter les modifications apportées au pilote. Chacun d'eux est associé à sa définition complète dans le tableau Fastboot commandes.
fastboot fetch vendor_boot out.img
- Elle appelle
getvar max-fetch-size
pour déterminer la taille des fragments. - Elle appelle
getvar partition-size:vendor_boot[_a]
pour déterminer la taille de la partition entière. - Appelle
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.) - Associe les données à
out.img
.
- Elle appelle
fastboot flash vendor_boot:default vendor-ramdisk.img
Il s'agit d'une variante spéciale de la commande flash. Elle récupère les Image
vendor_boot
, comme sifastboot fetch
était appelé.- Si le démarrage du fournisseur est la version d'en-tête
3,
il effectue les opérations suivantes:
<ph type="x-smartling-placeholder">
- </ph>
- Remplace le ramdisk du fournisseur par l'image donnée.
- Flashe la nouvelle image
vendor_boot
.
- Si l'en-tête de démarrage du fournisseur est version
4,
il effectue les opérations suivantes:
<ph type="x-smartling-placeholder">
- </ph>
- Remplace l'ensemble du disque ramdisk du fournisseur par l'image donnée, de sorte que le
l'image donnée devient le seul fragment ramdisk du fournisseur dans
vendor_boot
image. - Il recalcule la taille et le décalage dans la table ramdisk du fournisseur.
- Flashe la nouvelle image
vendor_boot
.
- Remplace l'ensemble du disque ramdisk du fournisseur par l'image donnée, de sorte que le
l'image donnée devient le seul fragment ramdisk du fournisseur dans
- Si le démarrage du fournisseur est la version d'en-tête
3,
il effectue les opérations suivantes:
<ph type="x-smartling-placeholder">
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 correspond à la version 3, une erreur est renvoyée.
Si l'en-tête de démarrage du fournisseur correspond à la version 4, il effectue les opérations suivantes:
- Recherche le fragment ramdisk du fournisseur nommé
foo
. Si vous ne le trouvez pas, ou s'il existe plusieurs correspondances, renvoie une erreur. - Remplace le fragment ramdisk du fournisseur par l'image donnée.
- Il recalcule chaque taille et chaque décalage dans la table ramdisk du fournisseur.
- Flashe la nouvelle image
vendor_boot
.
- Recherche le fragment ramdisk du fournisseur nommé
MKbootimg
Le nom default
est réservé à l'attribution de noms aux fragments ramdisk du fournisseur dans
Android 12 ou version ultérieure. Alors que le fastboot flash vendor_boot:default
reste la même, vous ne devez pas nommer vos fragments ramdisk de la manière
default
Modifications apportées à SELinux
Une modification a été apportée dans
fastbootd.te
pour prendre en charge le flashage
des ramdisks des fournisseurs.