Mises à jour du système non A/B

Sur les anciens appareils Android sans partitions A/B, l'espace flash contient généralement les partitions suivantes :

botte
Contient le noyau Linux et un système de fichiers racine minimal (chargé sur un disque RAM). Il monte le système et les autres partitions et démarre le runtime situé sur la partition système.
système
Contient des applications système et des bibliothèques dont le code source est disponible sur le projet Android Open Source (AOSP). En fonctionnement normal, cette partition est montée en lecture seule ; son contenu ne change que lors d'une mise à jour OTA.
fournisseur
Contient des applications système et des bibliothèques dont le code source n'est pas disponible sur le projet Android Open Source (AOSP). En fonctionnement normal, cette partition est montée en lecture seule ; son contenu ne change que lors d'une mise à jour OTA.
données d'utilisateur
Stocke les données enregistrées par les applications installées par l'utilisateur, etc. Cette partition n'est normalement pas touchée par le processus de mise à jour OTA.
cache
Zone d'attente temporaire utilisée par quelques applications (l'accès à cette partition nécessite des autorisations d'application spéciales) et pour le stockage des packages de mise à jour OTA téléchargés. D'autres programmes utilisent cet espace dans l'espoir que les fichiers puissent disparaître à tout moment. Certaines installations de packages OTA peuvent entraîner l'effacement complet de cette partition. Le cache contient également les journaux de mise à jour d'une mise à jour OTA.
récupération
Contient un deuxième système Linux complet, comprenant un noyau et le binaire de récupération spécial qui lit un paquet et utilise son contenu pour mettre à jour les autres partitions.
divers
Petite partition utilisée par la récupération pour stocker certaines informations sur ce qu'elle fait au cas où le périphérique serait redémarré pendant l'application du package OTA.

Durée de vie d'une mise à jour OTA

Une mise à jour OTA typique contient les étapes suivantes :

  1. L'appareil effectue un enregistrement régulier auprès des serveurs OTA et est informé de la disponibilité d'une mise à jour, y compris l'URL du package de mise à jour et une chaîne de description à afficher à l'utilisateur.
  2. Mettez à jour les téléchargements vers un cache ou une partition de données, et sa signature cryptographique est vérifiée par rapport aux certificats dans /system/etc/security/otacerts.zip . L'utilisateur est invité à installer la mise à jour.
  3. Le périphérique redémarre en mode de récupération, dans lequel le noyau et le système de la partition de récupération sont démarrés à la place du noyau de la partition de démarrage.
  4. Le binaire de récupération est démarré par init. Il trouve des arguments de ligne de commande dans /cache/recovery/command qui le pointent vers le package téléchargé.
  5. La récupération vérifie la signature cryptographique du package par rapport aux clés publiques dans /res/keys (partie du disque RAM contenu dans la partition de récupération).
  6. Les données sont extraites du package et utilisées pour mettre à jour les partitions de démarrage, du système et/ou du fournisseur si nécessaire. L'un des nouveaux fichiers laissés sur la partition système contient le contenu de la nouvelle partition de récupération.
  7. L'appareil redémarre normalement.
    1. La partition de démarrage nouvellement mise à jour est chargée, elle monte et commence à exécuter les fichiers binaires dans la partition système nouvellement mise à jour.
    2. Dans le cadre du démarrage normal, le système vérifie le contenu de la partition de récupération par rapport au contenu souhaité (qui était auparavant stocké sous forme de fichier dans /system ). Ils sont différents, donc la partition de récupération est reflasher avec le contenu souhaité. (Lors des démarrages suivants, la partition de récupération contient déjà le nouveau contenu, donc aucun reflash n'est nécessaire.)

La mise à jour du système est terminée ! Les journaux de mise à jour se trouvent dans /cache/recovery/last_log. # .

Paquets de mise à jour

Un package de mise à jour est un fichier .zip qui contient le binaire exécutable META-INF/com/google/android/update-binary . Après avoir vérifié la signature sur le package, recovery extrait ce binaire dans /tmp et exécute le binaire en transmettant les arguments suivants :

  • Mettre à jour le numéro de version de l'API binaire . Si les arguments transmis au binaire de mise à jour changent, ce nombre augmente.
  • Descripteur de fichier du tube de commande . Le programme de mise à jour peut utiliser ce canal pour renvoyer des commandes au binaire de récupération, principalement pour les modifications de l'interface utilisateur, telles que l'indication de la progression à l'utilisateur.
  • Nom de fichier du package de mise à jour fichier .zip .

Un package de mise à jour peut utiliser n’importe quel binaire lié statiquement comme binaire de mise à jour. Les outils de construction de packages OTA utilisent le programme de mise à jour ( bootable/recovery/updater ), qui fournit un langage de script simple capable d'effectuer de nombreuses tâches d'installation. Vous pouvez remplacer n'importe quel autre binaire exécuté sur l'appareil.

Pour plus de détails sur le binaire du programme de mise à jour, la syntaxe edify et les fonctions intégrées, consultez Inside OTA Packages .

Migrer à partir des versions précédentes

Lors de la migration depuis la version Android 2.3/3.0/4.0, le changement majeur est la conversion de toutes les fonctionnalités spécifiques à l'appareil d'un ensemble de fonctions C avec des noms prédéfinis vers des objets C++. Le tableau suivant répertorie les anciennes fonctions et les nouvelles méthodes qui remplissent un objectif à peu près équivalent :

Fonction C Méthode C++
périphérique_récupération_start() Appareil ::RecoveryStart()
périphérique_toggle_display()
périphérique_reboot_now()
RécupérationUI :: CheckKey ()
(également RecoveryUI :: IsKeyPressed ())
périphérique_handle_key() Appareil ::HandleMenuKey()
périphérique_perform_action() Appareil ::InvokeMenuItem()
périphérique_wipe_data() Appareil ::WipeData()
périphérique_ui_init() ScreenRecoveryUI :: Init ()

La conversion d'anciennes fonctions vers de nouvelles méthodes devrait être raisonnablement simple. N'oubliez pas d'ajouter la nouvelle fonction make_device() pour créer et renvoyer une instance de votre nouvelle sous-classe Device.