Déplacement de Fastboot vers l'espace utilisateur

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Android 10 et versions ultérieures prennent en charge les partitions redimensionnables en déplaçant l'implémentation de démarrage rapide du chargeur de démarrage vers l'espace utilisateur. Cette relocalisation permet de déplacer le code clignotant dans un emplacement commun maintenable et testable avec uniquement les parties spécifiques au fournisseur de fastboot implémentées par une couche d'abstraction matérielle (HAL). De plus, Android 12 et les versions ultérieures prennent en charge les disques RAM clignotants via une commande fastboot ajoutée.

Unification du démarrage rapide et de 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 binaire. Cela offre des avantages tels que l'utilisation de moins d'espace, le fait d'avoir moins de partitions dans l'ensemble et le fait que le démarrage rapide et la récupération 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 entrer en mode fastbootd , le chargeur de démarrage écrit boot-fastboot dans le champ de commande du message BCB et laisse le champ de 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 en voyant 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 a des résultats différents, selon qu'elle est exécutée par le système ou par la récupération.

Commander La description
reboot fastboot
  • Redémarre en fastbootd (système).
  • Entre dans fastbootd directement sans redémarrage (récupération).

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 bootloader ou par fastbootd .

Commander La description
reboot recovery
  • Redémarre en récupération (bootloader).
  • Entre directement dans la récupération sans redémarrage ( fastbootd ).
reboot fastboot Redémarre en fastbootd .
getvar is-userspace
  • Renvoie yes ( fastbootd ).
  • Renvoie no (bootloader).
getvar is-logical: <partition> Renvoie yes si la partition donnée est une partition logique, no sinon. Les partitions logiques prennent en charge toutes les commandes répertorié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 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 effectivement la partition).
resize-logical-partition <partition> <size> Redimensionne la partition logique à la nouvelle taille sans modifier son contenu. Échoue s'il n'y a pas assez d'espace disponible 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, le format sur l'appareil est une version non prise en charge), cette commande échoue. Un paramètre de 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 à l'état déverrouillé.
erase <partition> Efface une partition (il n'est pas nécessaire d'effectuer un effacement sécurisé). L'appareil doit être à l'état déverrouillé.
getvar <variable> | all Affiche une variable du chargeur de démarrage ou toutes les variables. Si la variable n'existe pas, renvoie une erreur.
set_active <slot>

Définit l'emplacement d'amorçage A/B donné comme active . Lors de la prochaine tentative de démarrage, le système démarre à partir de l'emplacement spécifié.

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 a , b , etc., et différenciés en ajoutant les suffixes _a , _b , etc. au nom de la partition.

reboot Redémarre l'appareil normalement.
reboot-bootloader (ou reboot bootloader ) Redémarre l'appareil dans le chargeur de démarrage.
fastboot fetch vendor_boot <out.img>

À utiliser dans Android 12 et versions ultérieures pour prendre en charge les disques RAM de fournisseurs clignotants.

Obtient la taille entière de la partition et la taille du bloc. Obtient des données pour chaque morceau, puis assemble les données dans <out.img>

Pour plus de détails, voir fastboot fetch vendor_boot <out.img> .

fastboot flash vendor_boot:default <vendor-ramdisk.img>

À utiliser dans Android 12 et versions ultérieures pour prendre en charge les disques RAM de fournisseurs clignotants.

Il s'agit d'une variante spéciale de la commande flash. Il exécute une fonction d'extraction de l'image fetch vendor_boot , comme si fastboot fetch était appelée. La nouvelle image vendor_boot qui clignote dépend de si la version de l'en-tête de démarrage est la version 3 ou la version 4.

Pour plus de détails, voir fastboot flash vendor_boot:default <vendor-ramdisk.img> .

fastboot flash vendor_boot: <foo> <vendor-ramdisk.img> À utiliser dans Android 12 et versions ultérieures pour prendre en charge les disques RAM de fournisseurs clignotants.

Récupère l'image vendor_boot . Renvoie une erreur si l'en-tête de démarrage du fournisseur est la version 3. S'il s'agit de la version 4, il trouve le fragment de disque virtuel du fournisseur correct (si disponible). Il la remplace par l'image donnée, recalcule les tailles et les décalages et fait clignoter la nouvelle vendor_boot image .

Pour plus de détails, voir fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

Fastboot et chargeur de démarrage

Le chargeur de démarrage fait clignoter les partitions bootloader , radio et boot/recovery , après quoi l'appareil démarre en fastboot (espace utilisateur) et fait clignoter toutes les autres partitions. Le chargeur de démarrage doit prendre en charge les commandes suivantes.

Commander La description
download Télécharge l'image à flasher.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Clignote la partition recovery/boot et le chargeur de démarrage.
reboot Redémarre l'appareil.
reboot fastboot Redémarre en fastboot.
reboot recovery Redémarre en récupération.
getvar Obtient une variable de chargeur de démarrage 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 chargeur de démarrage ne doit pas autoriser 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 mis à niveau, l'outil de démarrage rapide (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 le system est une partition dynamique sur le périphérique modernisé, l'utilisation de la commande fastboot --force flash system permet au chargeur de démarrage (au lieu de fastbootd ) de flasher la partition.

Charge hors mode

Si un appareil prend en charge la charge 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, de sorte que l'appareil démarre comme si l'utilisateur avait appuyé sur le bouton d'alimentation.

Fastboot OEM HAL

Pour remplacer complètement bootloader fastboot, 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, la HAL fastboot 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);

};

Activer le démarrage rapide

Pour activer fastbootd sur un appareil :

  1. Ajoutez fastbootd à PRODUCT_PACKAGES dans device.mk : PRODUCT_PACKAGES += fastbootd .

  2. Assurez-vous que la couche HAL de démarrage rapide, la couche HAL de contrôle de démarrage et la couche HAL d'intégrité sont intégrées à l'image de récupération.

  3. 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 à un périphérique pour flasher cette partition. De plus, l'implémentation de fastboot HAL peut également nécessiter des autorisations spécifiques à l'appareil.

Pour valider le démarrage rapide de l'espace utilisateur, exécutez Vendor Test Suite (VTS) .

Flasher les disques RAM du fournisseur

Android 12 et versions ultérieures prennent en charge les disques virtuels flash avec une commande fastboot supplémentaire qui extrait l'image complète de 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 implémente cela , mais que le chargeur de démarrage lui-même ne le peut pas. Les OEM peuvent ajouter la commande fetch:vendor_boot à leur implémentation de bootloader du protocole. Cependant, si la commande n'est pas reconnue en mode chargeur de démarrage, le flashage des disques virtuels des fournisseurs individuels 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 RAM du fournisseur clignotant dans le chargeur de démarrage, vous devez implémenter ces deux commandes.

Modifications du 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é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 de size est comprise entre 0 < size <= max-fetch-size .

Lorsque ceux-ci sont vérifiés, fetch:name[:offset[:size]] renvoie la taille et le décalage de la partition. Notez ce qui suit :

  • fetch:name est équivalent à fetch:name:0 , qui est équivalent à fetch:name:0:partition_size .
  • fetch:name:offset est équivalent à fetch:name:offset:(partition_size - offset)

Par conséquent 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 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 à l'offset 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-size pour déterminer la taille du bloc.
    • 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 morceau. (La taille du bloc est supérieure à la taille de vendor_boot , il n'y a donc normalement qu'un seul bloc.)
    • Assemble les données ensemble, à out.img .
  • 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 la fastboot fetch était appelée.

    • Si le démarrage du fournisseur est la version 3 de l'en-tête, 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 tout le 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 des disques virtuels du fournisseur.
      • Fait clignoter la nouvelle image vendor_boot .
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Récupère vendor_boot image , comme si la fastboot fetch était appelée.

    • 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 :

      • Trouve le fragment de disque virtuel du fournisseur avec le nom foo . S'il n'est pas trouvé, ou s'il y a 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 des disques virtuels du fournisseur.
      • Fait clignoter la nouvelle image vendor_boot .

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 comme default .

Changements de SELinux

Une modification a été apportée à fastbootd.te pour prendre en charge les disques virtuels flash des fournisseurs.