Règles concernant les fuseaux horaires

Android 10 abandonne le mécanisme de mise à jour des données de fuseau horaire basé sur les APK (disponible dans Android 8.1 et Android 9) et le remplace par un mécanisme de mise à jour des modules basé sur APEX. Les versions 8.1 à 13 d'AOSP incluent toujours le code de plate-forme nécessaire aux OEM pour activer les mises à jour basées sur les APK. Les appareils passant à Android 10 peuvent donc toujours recevoir les mises à jour des données de fuseaux horaires fournies par les partenaires via les APK. Toutefois, le mécanisme de mise à jour des APK ne doit pas être utilisé sur un appareil de production qui reçoit également des mises à jour de modules, car une mise à jour basée sur un APK remplace une mise à jour basée sur APEX (c'est-à-dire qu'un appareil ayant reçu une mise à jour d'APK ignore les mises à jour basées sur APEX).

Mises à jour du fuseau horaire (Android 10 et versions ultérieures)

Le module de données de fuseau horaire compatible avec Android 10 et les versions ultérieures met à jour l'heure d'été et les fuseaux horaires sur les appareils Android, en standardisant les données qui peuvent changer fréquemment pour des raisons religieuses, politiques et géopolitiques.

Les mises à jour suivent le processus suivant :

  1. L'IANA publie une mise à jour de la base de données des fuseaux horaires lorsqu'un ou plusieurs gouvernements modifient une règle de fuseau horaire dans leur pays.
  2. Google ou le partenaire Android prépare une mise à jour du module de données de fuseau horaire (fichier APEX) contenant les fuseaux horaires mis à jour.
  3. L'appareil de l'utilisateur final télécharge la mise à jour, redémarre, puis applique les modifications. Les données de fuseau horaire de l'appareil contiennent alors les nouvelles données de fuseau horaire issues de la mise à jour.

Pour en savoir plus sur les modules, consultez Composants du système modulaire.

Mises à jour du fuseau horaire (Android 8.1 à 9)

Remarque : La fonctionnalité de mécanisme de mise à jour des données de fuseau horaire basé sur les APK a été complètement supprimée d'Android 14 et des versions ultérieures. Elle n'est pas disponible dans le code source. Les partenaires doivent migrer complètement vers le module Mainline Time Zone.

Dans Android 8.1 et Android 9, les OEM peuvent utiliser un mécanisme basé sur les APK pour envoyer des données de règles de fuseau horaire mises à jour aux appareils sans nécessiter de mise à jour du système. Ce mécanisme permet aux utilisateurs de recevoir des mises à jour en temps opportun (prolongeant ainsi la durée de vie utile d'un appareil Android) et aux partenaires Android de tester les mises à jour des fuseaux horaires indépendamment des mises à jour des images système.

L'équipe des bibliothèques principales Android fournit les fichiers de données nécessaires pour mettre à jour les règles de fuseaux horaires sur un appareil Android standard. Les OEM peuvent choisir d'utiliser ces fichiers de données lorsqu'ils créent des mises à jour du fuseau horaire pour leurs appareils ou créer leurs propres fichiers de données s'ils le préfèrent. Dans tous les cas, les OEM conservent le contrôle de l'assurance qualité/des tests, du calendrier et du lancement des mises à jour des règles de fuseau horaire pour leurs appareils compatibles.

Code source et données du fuseau horaire Android

Tous les appareils Android standards, même ceux qui n'utilisent pas cette fonctionnalité, ont besoin de données de règles de fuseau horaire et doivent être fournis avec un ensemble par défaut de données de règles de fuseau horaire dans la partition /system. Ces données sont ensuite utilisées par le code des bibliothèques suivantes dans l'arborescence source Android :

  • Le code géré de libcore/ (par exemple, java.util.TimeZone) utilise les fichiers tzdata et tzlookup.xml.
  • Le code de la bibliothèque native dans bionic/ (par exemple, pour les appels système localtime mktime) utilise le fichier tzdata.
  • Le code de la bibliothèque ICU4J/ICU4C dans external/icu/ utilise le fichier icu.dat.

Ces bibliothèques permettent de suivre les fichiers de superposition qui peuvent être présents dans le répertoire /data/misc/zoneinfo/current. Les fichiers de superposition sont censés contenir des données améliorées sur les règles de fuseaux horaires, ce qui permet de mettre à jour les appareils sans modifier /system.

Les composants système Android qui ont besoin de données de règles de fuseau horaire vérifient d'abord les emplacements suivants :

  • Le code libcore/ et bionic/ utilise la copie /data des fichiers tzdata et tzlookup.xml.
  • Le code ICU4J/ICU4C utilise les fichiers de /data et revient aux fichiers /system pour les données manquantes (pour les formats, les chaînes localisées, etc.).

Fichiers de distribution

Les fichiers .zip de distribution contiennent les fichiers de données nécessaires pour remplir le répertoire /data/misc/zoneinfo/current. Les fichiers de distribution contiennent également des métadonnées qui permettent aux appareils de détecter les problèmes de version.

Le format du fichier de distribution dépend de la version d'Android, car le contenu change en fonction de la version d'ICU, des exigences de la plate-forme Android et d'autres modifications apportées à la version. Android fournit des fichiers de distribution pour les versions Android compatibles à chaque mise à jour de l'IANA (en plus de la mise à jour des fichiers système de la plate-forme). Pour que leurs appareils restent à jour, les OEM peuvent utiliser ces fichiers de distribution ou créer les leurs à l'aide de l'arborescence source Android (qui contient les scripts et autres fichiers nécessaires à la génération des fichiers de distribution).

Composants de mise à jour du fuseau horaire

Une mise à jour des règles de fuseau horaire implique la transmission de fichiers de distribution à un appareil et l'installation sécurisée des fichiers qu'il contient. Pour transférer et installer l'application, vous devez disposer des éléments suivants :

  • Fonctionnalité de service de plate-forme (timezone.RulesManagerService), qui est désactivée par défaut. Les OEM doivent activer la fonctionnalité par le biais de la configuration. RulesManagerService s'exécute dans le processus du serveur système et prépare les opérations de mise à jour du fuseau horaire en écrivant dans /data/misc/zoneinfo/staged. RulesManagerService peut également remplacer ou supprimer des opérations déjà mises en scène.
  • TimeZoneUpdater, une application système non actualisable (également appelée application Updater). Les OEM doivent inclure cette application dans l'image système des appareils utilisant la fonctionnalité.
  • OEM TimeZoneData, une application système pouvant être mise à jour (également appelée application de données) qui transfère les fichiers de distribution sur l'appareil et les met à la disposition de l'application Updater. Les OEM doivent inclure cette application dans l'image système des appareils utilisant la fonctionnalité.
  • tzdatacheck, un binaire d'amorçage requis pour le bon fonctionnement et la sécurité des mises à jour des fuseaux horaires.

L'arborescence source Android contient le code source générique des composants ci-dessus, que l'OEM peut choisir d'utiliser sans le modifier. Un code de test est fourni pour permettre aux OEM de vérifier automatiquement qu'ils ont activé la fonctionnalité correctement.

Installation de la distribution

Le processus d'installation de la distribution comprend les étapes suivantes :

  1. L'application de données est mise à jour via un téléchargement sur une plate-forme de téléchargement d'applications ou par chargement latéral. Le processus du serveur système (via les classes timezone.RulesManagerServer/timezone.PackageTracker) surveille les modifications apportées au nom du package de l'application de données configuré et spécifique à l'OEM.

    Mises à jour des applications de données

    Figure 1 : Mises à jour des applications de données.

  2. Le processus du serveur système déclenche une vérification des mises à jour en diffusant une intention ciblée avec un jeton unique à usage unique à l'application Updater. Le serveur système conserve la trace du jeton le plus récent qu'il a généré afin de pouvoir déterminer quand la vérification la plus récente qu'il a déclenchée est terminée. Tous les autres jetons sont ignorés.

    Déclencher une mise à jour

    Figure 2. Déclenchez la vérification des mises à jour.

  3. Lors de la vérification des mises à jour, l'application Updater effectue les tâches suivantes :
    • Interroge l'état actuel de l'appareil en appelant RulesManagerService.

      Appeler RulesManagerService

      Figure 3. Mises à jour de l'application de données, appelant RulesManagerService.

    • Interroge l'application Data en interrogeant une URL ContentProvider et des spécifications de colonnes bien définies pour obtenir des informations sur la distribution.

      Obtenir des informations sur la distribution

      Figure 4. Mises à jour de l'application de données, obtenir des informations sur la distribution

  4. L'application Updater effectue l'action appropriée en fonction des informations dont elle dispose. Voici les actions disponibles :
    • Demandez une installation. Les données de distribution sont lues à partir de l'application Données et transmises au RulesManagerService dans le serveur système. Le RulesManagerService reconfirme que la version et le contenu du format de distribution sont adaptés à l'appareil et prépare l'installation.
    • Demander la désinstallation (cette situation est rare). Par exemple, si l'APK mis à jour dans /data est désactivé ou désinstallé, et que l'appareil revient à la version présente dans /system.
    • Ne rien faire. Se produit lorsque la distribution de l'application de données n'est pas valide.
    Dans tous les cas, l'application Updater appelle RulesManagerService avec le jeton de vérification afin que le serveur système sache que la vérification est terminée et réussie.

    Vérification terminée

    Figure 5. Vérification terminée.

  5. Redémarrez et exécutez tzdatacheck. Au prochain démarrage de l'appareil, le fichier binaire tzdatacheck exécute toute opération intermédiaire. Le binaire tzdatacheck peut effectuer les tâches suivantes :
    • Exécutez l'opération intermédiaire en gérant la création, le remplacement et/ou la suppression des fichiers /data/misc/zoneinfo/current avant que d'autres composants du système n'aient ouvert et commencé à utiliser les fichiers.
    • Vérifiez que les fichiers de /data sont corrects pour la version actuelle de la plate-forme. Ce ne sera peut-être pas le cas si l'appareil vient de recevoir une mise à jour du système et que la version du format de distribution a changé.
    • Assurez-vous que la version des règles IANA est identique ou plus récente que celle de /system. Cela permet d'éviter qu'une mise à jour du système ne laisse un appareil avec des données de règles de fuseau horaire plus anciennes que celles présentes dans l'image /system.

Fiabilité

Le processus d'installation de bout en bout est asynchrone et réparti sur trois processus OS. À tout moment pendant l'installation, l'appareil peut être mis hors tension, manquer d'espace disque ou rencontrer d'autres problèmes, ce qui peut entraîner l'inachèvement de la vérification de l'installation. Dans le meilleur des cas d'échec, l'application Updater informe le serveur système de l'échec. Dans le pire des cas d'échec, le RulesManagerService ne reçoit aucun appel.

Pour gérer cela, le code du serveur système garde une trace de la fin d'une vérification de mise à jour déclenchée et du dernier code de version vérifié de l'application Data. Lorsque l'appareil est inactif et en charge, le code du serveur système peut vérifier l'état actuel. S'il détecte une vérification de mise à jour incomplète ou une version inattendue de l'application de données, il déclenche spontanément une vérification de mise à jour.

Sécurité

Lorsqu'il est activé, le code RulesManagerService du serveur système effectue plusieurs vérifications pour s'assurer que le système peut être utilisé sans danger.

  • Les problèmes qui indiquent qu'une image système est mal configurée empêchent le démarrage d'un appareil. Par exemple, une configuration incorrecte de l'application Updater ou Data, ou l'absence de l'application Updater ou Data dans /system/priv-app.
  • Les problèmes indiquant qu'une application de données incorrecte a été installée n'empêchent pas le démarrage d'un appareil, mais empêchent le déclenchement d'une vérification des mises à jour. Par exemple, il peut s'agir d'un manque d'autorisations système requises ou du fait que l'application de données n'expose pas de ContentProvider sur l'URI attendue.

Les autorisations d'accès aux répertoires /data/misc/zoneinfo sont appliquées à l'aide des règles SELinux. Comme pour tout APK, l'application de données doit être signée avec la même clé que celle utilisée pour signer la version /system/priv-app. L'application Données doit avoir un nom de package et une clé dédiés et spécifiques à l'OEM.

Intégrer les mises à jour du fuseau horaire

Pour activer la fonctionnalité de mise à jour du fuseau horaire, les OEM doivent généralement :

  • créer leur propre application de données.
  • Incluez les applications Updater et Data dans la compilation de l'image système.
  • Configurez le serveur système pour activer le service RulesManagerService.

Préparation

Avant de commencer, les OEM doivent examiner les points suivants concernant les règles, l'assurance qualité et la sécurité :

  • Créez une clé de signature spécifique à l'application pour leur application de données.
  • Créez une stratégie de publication et de gestion des versions pour les mises à jour des fuseaux horaires afin de comprendre quels appareils seront mis à jour et comment vous assurer que les mises à jour ne sont installées que sur les appareils qui en ont besoin. Par exemple, les OEM peuvent souhaiter disposer d'une seule application Données pour tous leurs appareils ou choisir d'avoir différentes applications Données pour différents appareils. Cette décision a un impact sur le choix du nom du package, éventuellement sur les codes de version utilisés et sur la stratégie d'assurance qualité.
  • Déterminez s'il souhaite utiliser les données de fuseau horaire Android standards de l'AOSP ou créer les siennes.

Créer une application de données

AOSP inclut l'ensemble du code source et des règles de compilation nécessaires pour créer une application de données dans packages/apps/TimeZoneData, avec des instructions et des exemples de modèles pour AndroidManifest.xml et d'autres fichiers situés dans packages/apps/TimeZoneData/oem_template. Les modèles d'exemple incluent à la fois une cible de compilation pour le véritable APK de l'application Data et des cibles supplémentaires pour créer des versions de test de l'application Data.

Les OEM peuvent personnaliser l'application Données avec leur propre icône, nom, traductions et autres informations. Toutefois, comme l'application Données ne peut pas être lancée, l'icône n'apparaît que sur l'écran Paramètres > Applications.

L'application Data est conçue pour être compilée avec une version tapas qui produit des APK pouvant être ajoutés à l'image système (pour la version initiale), signés et distribués via un app store (pour les mises à jour ultérieures). Pour en savoir plus sur l'utilisation des tapas, consultez Créer l'application de données à l'aide de tapas.

Les OEM doivent installer l'application Données précompilée dans l'image système d'un appareil dans /system/priv-app. Pour inclure des APK prédéfinis (générés par le processus de compilation tapas) dans l'image système, les OEM peuvent copier les exemples de fichiers dans packages/apps/TimeZoneData/oem_template/data_app_prebuilt. Les modèles d'exemple incluent également des cibles de compilation permettant d'inclure des versions de test de l'application Data dans les suites de tests.

Inclure les applications Updater et Data dans l'image système

Les OEM doivent placer les APK des applications Updater et Data dans le répertoire /system/priv-app de l'image système. Pour ce faire, la compilation de l'image système doit inclure explicitement les cibles précompilées de l'application Updater et de l'application Data.

L'application Updater doit être signée avec la clé de plate-forme et incluse comme n'importe quelle autre application système. La cible est définie dans packages/apps/TimeZoneUpdater comme TimeZoneUpdater. L'inclusion de l'application Données est spécifique à l'OEM et dépend du nom de la cible choisie pour la précompilation.

Configurer le serveur système

Pour activer les mises à jour du fuseau horaire, les OEM peuvent configurer le serveur système en remplaçant les propriétés de configuration définies dans frameworks/base/core/res/res/values/config.xml.

Propriété Description Ignorer les règles ?
config_enableUpdateableTimeZoneRules
Doit être défini sur true pour activer RulesManagerService. Oui
config_timeZoneRulesUpdateTrackingEnabled
Doit être défini sur true pour que le système écoute les modifications apportées à l'application Data. Oui
config_timeZoneRulesDataPackage
Nom du package de l'application de données spécifique à l'OEM. Oui
config_timeZoneRulesUpdaterPackage
Configuré pour l'application Updater par défaut. Ne modifiez cette valeur que si vous fournissez une autre implémentation de l'application Updater. Non
config_timeZoneRulesCheckTimeMillisAllowed
Délai autorisé entre le déclenchement d'une vérification de mise à jour par le service RulesManagerService et une réponse d'installation, de désinstallation ou de non-action. Après ce point, un déclencheur de fiabilité spontané peut être généré. Non
config_timeZoneRulesCheckRetryCount
Nombre de vérifications de mise à jour infructueuses consécutives autorisées avant que RulesManagerService cesse d'en générer d'autres. Non

Les remplacements de configuration doivent se trouver dans l'image système (et non dans le fournisseur ni ailleurs), car un appareil mal configuré peut refuser de démarrer. Si les remplacements de configuration se trouvaient dans l'image du fournisseur, la mise à jour vers une image système sans application Données (ou avec des noms de packages d'application Données/Updater différents) serait considérée comme une erreur de configuration.

Tests xTS

xTS fait référence à toute suite de tests spécifique à un OEM qui est similaire aux suites de tests Android standards utilisant Tradefed (telles que CTS et VTS). Les OEM qui disposent de telles suites de tests peuvent ajouter les tests de mise à jour du fuseau horaire Android fournis aux emplacements suivants :

  • packages/apps/TimeZoneData/testing/xts inclut le code nécessaire pour les tests fonctionnels automatisés de base.
  • packages/apps/TimeZoneData/oem_template/xts contient une structure de répertoire d'exemple pour inclure des tests dans une suite xTS de type Tradefed. Comme pour les autres répertoires de modèles, les OEM sont censés copier et personnaliser les modèles en fonction de leurs besoins.
  • packages/apps/TimeZoneData/oem_template/data_app_prebuilt contient la configuration au moment de la compilation pour inclure les APK de test prédéfinis requis par le test.

Créer des mises à jour du fuseau horaire

Lorsque l'IANA publie un nouvel ensemble de règles de fuseaux horaires, l'équipe des bibliothèques centrales Android génère des correctifs pour mettre à jour les versions dans AOSP. Les OEM qui utilisent le système Android standard et les fichiers de distribution peuvent récupérer ces commits, les utiliser pour créer une nouvelle version de leur application Données, puis déployer la nouvelle version pour mettre à jour leurs appareils en production.

Étant donné que les applications de données contiennent des fichiers de distribution étroitement liés aux versions d'Android, les OEM doivent créer une nouvelle version de l'application de données pour chaque version d'Android compatible qu'ils souhaitent mettre à jour. Par exemple, si un OEM souhaite fournir des mises à jour pour les appareils Android 8.1, 9 et 10, il doit effectuer la procédure trois fois.

Étape 1 : Mettez à jour les fichiers de données système/de fuseau horaire et externes/icu

Dans cette étape, les OEM prennent les commits Android standards pour system/timezone et external/icu à partir des branches de développement release dans AOSP et appliquent ces commits à leur copie du code source Android.

Le correctif AOSP système/fuseau horaire contient des fichiers mis à jour dans system/timezone/input_data et system/timezone/output_data. Les OEM qui doivent apporter des corrections locales supplémentaires peuvent modifier les fichiers d'entrée, puis utiliser les fichiers dans system/timezone/input_data et external/icu pour générer des fichiers dans output_data.

Le fichier le plus important est system/timezone/output_data/distro/distro.zip, qui est automatiquement inclus lors de la création de l'APK de l'application Data.

Étape 2 : Mettez à jour le code de version de l'application Données

Dans cette étape, les OEM mettent à jour le code de version de l'application Données. La compilation sélectionne automatiquement distro.zip, mais la nouvelle version de l'application Données doit avoir un nouveau code de version pour être reconnue comme nouvelle et être utilisée pour remplacer une application Données préchargée ou une application Données installée sur un appareil par une mise à jour précédente.

Lorsque vous compilez l'application de données à l'aide de fichiers copiés à partir de package/apps/TimeZoneData/oem_template/data_app, vous pouvez trouver le code de version/nom de version appliqué à l'APK dans Android.mk :

TIME_ZONE_DATA_APP_VERSION_CODE :=
TIME_ZONE_DATA_APP_VERSION_NAME :=

Des entrées similaires sont disponibles dans testing/Android.mk (toutefois, les codes de version de test doivent être supérieurs à la version de l'image système). Pour en savoir plus, consultez le schéma d'exemple de stratégie de code de version. Si le schéma d'exemple ou un schéma similaire est utilisé, les codes de version de test n'ont pas besoin d'être mis à jour, car ils sont garantis d'être supérieurs aux codes de version réels.

Étape 3 : Recompilez, signez, testez et publiez

À cette étape, les OEM reconstruisent l'APK à l'aide de tapas, signent l'APK généré, puis le testent et le publient :

  • Pour les appareils non commercialisés (ou lorsque vous préparez une mise à jour du système pour un appareil commercialisé), envoyez les nouveaux APK dans le répertoire de l'application Data précompilée pour vous assurer que l'image système et les tests xTS disposent des derniers APK. Les OEM doivent tester le nouveau fichier pour s'assurer qu'il fonctionne correctement (c'est-à-dire qu'il réussit le CTS et tous les tests automatisés et manuels spécifiques aux OEM).
  • Pour les appareils commercialisés qui ne reçoivent plus de mises à jour du système, l'APK signé ne peut être publié que via un app store.

Les OEM sont responsables de l'assurance qualité et du test de l'application Données mise à jour sur leurs appareils avant la publication.

Stratégie de code de version de l'application de données

L'application Data doit disposer d'une stratégie de gestion des versions appropriée pour s'assurer que les appareils reçoivent les APK appropriés. Par exemple, si une mise à jour du système est reçue et contient un APK plus ancien que celui téléchargé depuis l'App Store, la version de l'App Store doit être conservée.

Le code de version de l'APK doit inclure les informations suivantes :

  • Version du format de distribution (majeure + mineure)
  • Numéro de version incrémentiel (opaque)

Actuellement, le niveau d'API de la plate-forme est fortement corrélé à la version du format de distribution, car chaque niveau d'API est généralement associé à une nouvelle version d'ICU (ce qui rend les fichiers de distribution incompatibles). À l'avenir, Android pourra modifier ce comportement afin qu'un fichier de distribution puisse fonctionner sur plusieurs versions de la plate-forme Android (et que le niveau d'API ne soit pas utilisé dans le schéma de code de version de l'application Data).

Exemple de stratégie de code de version

Ce système de numérotation des versions garantit que les versions de format de distribution supérieures remplacent les versions inférieures. AndroidManifest.xml utilise android:minSdkVersion pour s'assurer que les anciens appareils ne reçoivent pas de versions dont le format de distribution est supérieur à celui qu'ils peuvent gérer.

Vérification de la version

Figure 6. Exemple de stratégie de code de version.

Exemple Valeur Objectif
Y Réservée Permet de futurs schémas alternatifs/APK de test. Sa valeur initiale (implicite) est 0. Comme le type sous-jacent est un type int signé de 32 bits, ce schéma est compatible avec un maximum de deux révisions futures du schéma de numérotation.
01 Version majeure du format Suit la version majeure au format à trois chiffres décimaux. Le format de distribution accepte trois chiffres après la virgule, mais seuls deux sont utilisés ici. Il est peu probable qu'il atteigne 100, compte tenu de l'augmentation majeure attendue par niveau d'API. La version majeure 1 équivaut au niveau d'API 27.
1 Version mineure du format Suit la version mineure au format à trois chiffres décimaux. Le format de distribution accepte trois chiffres après la virgule, mais un seul est utilisé ici. Il est peu probable qu'il atteigne 10.
X Réservée La valeur est définie sur 0 pour les versions de production (et peut être différente pour les APK de test).
ZZZZZ Numéro de version opaque Nombre décimal attribué à la demande. Inclut des espaces vides pour permettre d'effectuer des mises à jour interstitielles si nécessaire.

Le schéma pourrait être mieux compressé si le format binaire était utilisé à la place du format décimal, mais ce schéma a l'avantage d'être lisible par l'homme. Si la plage de numéros complète est épuisée, le nom du package de l'application Données peut changer.

Le nom de la version est une représentation lisible des détails, par exemple major=001,minor=001,iana=2017a, revision=1,respin=2. Vous trouverez des exemples dans le tableau ci-dessous.

# Code de la version minSdkVersion {Version majeure du format},{Version mineure du format},{Version des règles IANA},{Révision}
1 11000010 O-MR1 major=001,minor=001,iana=2017a,revision=1
2 21000010 P major=002,minor=001,iana=2017a,revision=1
3 11000020 O-MR1 major=001,minor=001,iana=2017a,revision=2
4 11000030 O-MR1 major=001,minor=001,iana=2017b,revision=1
5 21000020 P major=002,minor=001,iana=2017b,revision=1
6 11000040 O-MR1 major=001,minor=001,iana=2018a,revision=1
7 21000030 P major=002,minor=001,iana=2018a,revision=1
8 1123456789 - -
9 11000021 O-MR1 major=001,minor=001,iana=2017a,revision=2,respin=2
  • Les exemples 1 et 2 montrent deux versions d'APK pour la même version 2017a de l'IANA, avec des versions majeures de format différentes. 2 est numériquement supérieur à 1, ce qui est nécessaire pour s'assurer que les appareils plus récents reçoivent les versions de format supérieures. La minSdkVersion garantit que la version P ne sera pas fournie aux appareils O.
  • L'exemple 3 est une révision/correction de l'exemple 1 et est numériquement supérieur à 1.
  • Les exemples 4 et 5 montrent les versions 2017b pour O-MR1 et P. Étant numériquement plus élevés, ils remplacent les versions IANA/révisions Android précédentes de leurs prédécesseurs respectifs.
  • Les exemples 6 et 7 montrent les versions 2018a pour O-MR1 et P.
  • L'exemple 8 montre comment utiliser Y pour remplacer complètement le schéma Y=0.
  • L'exemple 9 montre comment utiliser l'espace laissé entre 3 et 4 pour relancer l'APK.

Comme chaque appareil est fourni avec un APK par défaut et correctement versionné dans l'image système, il n'y a aucun risque qu'une version O-MR1 soit installée sur un appareil P, car son numéro de version est inférieur à celui d'une version d'image système P. Un appareil sur lequel la version O-MR1 est installée dans /data et qui reçoit ensuite une mise à jour du système vers la version P utilise la version /system de préférence à la version O-MR1 dans /data, car la version P est toujours supérieure à toute application destinée à la version O-MR1.

Créer l'application de données à l'aide de tapas

Les OEM sont responsables de la gestion de la plupart des aspects de l'application Données de fuseau horaire et de la configuration correcte de l'image système. L'application Data est conçue pour être compilée avec une compilation tapas qui produit des APK pouvant être ajoutés à l'image système (pour la version initiale), signés et distribués via un app store (pour les mises à jour ultérieures).

Tapas est une version allégée du système de compilation Android qui utilise un arbre source réduit pour produire des versions distribuables d'applications. Les OEM connaissant le système de compilation Android normal devraient reconnaître les fichiers de compilation à partir de la compilation normale de la plate-forme Android.

Créer le fichier manifeste

Une arborescence source réduite est généralement obtenue avec un fichier manifeste personnalisé qui ne fait référence qu'aux projets Git nécessaires au système de compilation et à la compilation de l'application. Après avoir suivi les instructions de la section Créer une application de données, les OEM doivent avoir créé au moins deux projets Git spécifiques aux OEM à l'aide des fichiers modèles sous packages/apps/TimeZoneData/oem_template :

  • Un projet Git contient des fichiers d'application tels que le fichier manifeste et les fichiers de compilation requis pour créer le fichier APK de l'application (par exemple, vendor/oem/apps/TimeZoneData). Ce projet contient également des règles de compilation pour les APK de test qui peuvent être utilisés par les tests xTS.
  • Un projet Git contient les APK signés produits par la compilation de l'application pour inclusion dans la compilation de l'image système et les tests xTS.

La compilation de l'application s'appuie sur plusieurs autres projets Git qui sont partagés avec la compilation de la plate-forme ou qui contiennent des bibliothèques de code indépendantes de l'OEM.

L'extrait de fichier manifeste suivant contient l'ensemble minimal de projets Git nécessaires pour prendre en charge une version O-MR1 de l'application de données de fuseau horaire. Les OEM doivent ajouter leurs projets Git spécifiques aux OEM (qui incluent généralement un projet contenant le certificat de signature) à ce fichier manifeste et peuvent configurer différentes branches en conséquence.

   <!-- Tapas Build -->
    <project
        path="build"
        name="platform/build">
        <copyfile src="core/root.mk" dest="Makefile" />
    </project>
    <project
        path="prebuilts/build-tools"
        name="platform/prebuilts/build-tools"
        clone-depth="1" />
    <project
        path="prebuilts/go/linux-x86"
        name="platform/prebuilts/go/linux-x86"
        clone-depth="1" />
    <project
        path="build/blueprint"
        name="platform/build/blueprint" />
    <project
        path="build/kati"
        name="platform/build/kati" />
    <project
        path="build/soong"
        name="platform/build/soong">
        <linkfile src="root.bp" dest="Android.bp" />
        <linkfile src="bootstrap.bash" dest="bootstrap.bash" />
    </project>

    <!-- SDK for system / public API stubs -->
    <project
        path="prebuilts/sdk"
        name="platform/prebuilts/sdk"
        clone-depth="1" />
    <!-- App source -->
    <project
        path="system/timezone"
        name="platform/system/timezone" />
    <project
        path="packages/apps/TimeZoneData"
        name="platform/packages/apps/TimeZoneData" />
    <!-- Enable repohooks -->
    <project
        path="tools/repohooks"
        name="platform/tools/repohooks"
        revision="main"
        clone_depth="1" />
    <repo-hooks
        in-project="platform/tools/repohooks"
        enabled-list="pre-upload" />

Exécuter la compilation Tapas

Une fois l'arborescence source établie, appelez la compilation tapas à l'aide des commandes suivantes :

source build/envsetup.sh
tapas
make -j30 showcommands dist TARGET_BUILD_APPS='TimeZoneData TimeZoneData_test1 TimeZoneData_test2'  TARGET_BUILD_VARIANT=userdebug

Une compilation réussie génère des fichiers dans le répertoire out/dist pour les tests. Ces fichiers peuvent être placés dans le répertoire des précompilés pour être inclus dans l'image système et/ou distribués via une plate-forme de téléchargement d'applications pour les appareils compatibles.