Implémenter des polices personnalisées

À partir d'Android 15, les polices variables sont affichées au moment de l'exécution avec une meilleure efficacité et une meilleure précision. Avec cette mise à jour, les fournisseurs doivent ajouter de nouvelles configurations de polices variables à font_fallback.xml au lieu de fonts.xml, car fonts.xml est en cours d'abandon. Pour en savoir plus, consultez la section Compatibilité avec les polices variables.

Sous Android 11 ou version antérieure, la mise à jour des fichiers de polices installés sur l'appareil dans AOSP (dans la partition /system/fonts) ou les partitions du fournisseur (dans les partitions /product/fonts ou /system/fonts) nécessite une mise à jour du système de l'OEM. Cette exigence a un impact significatif sur la compatibilité des emoji. Dans Android 12, vous pouvez utiliser le service système FontManager pour gérer les fichiers de police installés et mettre à jour ceux installés sur l'appareil sans mise à jour du système.

Android 12 propose trois interactions de processus : FontManagerService, Font Updater et Application.

FontManagerService est le système de gestion centralisé du serveur système. FontManagerService stocke les derniers paramètres de police système par utilisateur.

FontUpdater est un outil de mise à jour de polices enfichable approuvé par une vérification d'autorisation signature|privileged. FontUpdater communique avec FontManagerService pour obtenir, installer, supprimer ou mettre à jour les paramètres de police système actuels. Le FontUpdater peut transmettre le contenu d'un nouveau fichier de police par des mécanismes de communication inter-processus (IPC). FontManagerService enregistre le contenu dans un emplacement de stockage accessible à tous, par exemple dans les fichiers /data/fonts. Cet espace de stockage est protégé. Il peut être écrit uniquement par la règle FontManagerService, par la règle SELinux.

Lorsque la classe Application se lance, elle transmet les paramètres de police système en tant qu'arguments de la méthode bindApplication, puis elle initialise les paramètres de police à utiliser par le processus de l'application.

Prise en charge des polices variables

À partir d'Android 15, les configurations de polices variables sont spécifiées dans font_fallback.xml à l'aide du format suivant :

<family lang="und-Ethi" supportedAxes="wght,ital">
    <font>NotoSansEthiopic-VF.ttf</font>
</family>

Dans ce format, une police variable possède tous les attributs d'une police statique avec un attribut supportedAxes supplémentaire. Un attribut supportedAxes est une liste de balises d'axe compatibles séparées par une virgule. Avec Android 15, seuls les axes wght et ital peuvent être spécifiés.

Si l'attribut supportedAxes n'est pas spécifié, le nœud font fonctionne comme une police statique d'une seule instance d'une police variable spécifiée avec des enfants axis.

Si l'attribut supportedAxes est spécifié, le système crée dynamiquement une instance de police pour la valeur de style et d'épaisseur donnée au moment de l'exécution.

Les développeurs peuvent utiliser l'API Java android.graphics.fonts.SystemFonts#getAvailableFonts ou l'API NDK ASystemFontIterator_open pour obtenir la liste des fichiers de polices installés par le système. Pour en savoir plus sur les API de développement compatibles avec cette mise à jour, consultez API OpenType Variable Font Font améliorée et buildVariableFamily.

Personnaliser les polices

Certains OEM installent ou remplacent des fichiers de polices dans AOSP pour afficher leurs marques. Android 12 est compatible avec cette fonctionnalité, mais ajoute des exigences pour que les polices d'emoji soient à jour sur les appareils. Les OEM qui ne modifient pas ni ne mettent à jour les fichiers de police des emoji n'ont pas besoin d'utiliser cette fonctionnalité.

Google met à jour les fichiers de polices, en particulier les fichiers NotoColorEmoji via GMS Core. Par conséquent, ne modifiez ni ne supprimez le fichier NotoColorEmoji.ttf de la partition /system, et ne le supprimez pas de /frameworks/base/data/fonts/fonts.xml. Voici trois façons de personnaliser vos polices :

  1. Remplacez le fichier NotoColorEmoji.ttf par une police d'emojis de la marque OEM.
  2. Modifiez le fichier NotoColorEmoji.ttf en fonction des besoins de votre marché local.
  3. Remplacer ou modifier d'autres fichiers de police

Si vous ne modifiez pas les polices d'emoji dans AOSP, aucune action n'est requise de votre part. Si vous souhaitez personnaliser les polices d'emojis, suivez les instructions des sections suivantes.

Remplacement du fichier NotoColorEmoji.ttf par des polices emoji de marque OEM

Pour remplacer le fichier NotoColorEmoji.ttf par le fichier de polices d'emoji de votre OEM, placez la police d'emoji juste avant la chaîne de police de remplacement:

  1. Placez votre propre police, appelée OEMCustomEmoji.ttf, dans la partition /system.
  2. Modifiez /frameworks/base/data/fonts/fonts.xml (et /frameworks/base/data/fonts/font-fallback.xml dans Android 15 ou version ultérieure) comme dans le code suivant:

    <family lang="ko">
    <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
    </family>
    <!-- ADD FOLLOWING LINE -->
    <family lang="und-Zsye">
       <font weight="400" style="normal">OEMCustomEmoji.ttf</font>
    </family>
    <!-- END OF MODIFICATION -->
    <family lang="und-Zsye">
       <font weight="400" style="normal">NotoColorEmoji.ttf</font>
    </family>
    <family lang="und-Zsym">
       <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font>
    </family>
    

Modifier NotoColorEmoji.ttf pour répondre aux besoins des marchés locaux

Pour personnaliser votre fiche en fonction des besoins de votre marché local, procédez comme suit :

  1. Créez votre propre fichier NotoColorEmoji avec un nom différent, par exemple Modified\_NotoColorEmoji.ttf.
  2. Placez-le avant le fichier NotoColorEmoji.ttf d'origine.

Une fois l'étape 2 effectuée, le glyphe modifié compatible avec Modified\NotoColorEmoji.ttf s'affiche à la place de l'NotoColorEmoji.ttf d'origine. Google recommande ce qui suit :

  • Ne contient que les glyphes nécessaires dans cette police.
  • Délèguez les glyphes non modifiés au fichier NotoColorEmoji.ttf d'origine afin que vos appareils reçoivent les corrections de conception apportées dans les futures versions d'emoji.

Supprimer les glyphes:pour supprimer des glyphes du fichier NotoColorEmoji.ttf, suivez les étapes 1 et 2, puis spécifiez glyph ID = 0 dans votre carte cmap.

Utilisez un indicateur régional:si le glyphe cible est un indicateur régional, spécifiez son ID sous la forme d'un code pays inconnu. (Utilisez country code = "ZZ".)

Créer un glyphe tofu : vous pouvez spécifier explicitement un ID de glyphe tofu si vous souhaitez en utiliser un. Lorsque vous spécifiez glyphID = 0, l'application associée l'interprète comme "le glyphe n'est pas disponible". Par exemple, lorsque vous utilisez cet attribut, l'application Paint#hasGlyph renvoie false.

Remplacer ou modifier d'autres fichiers de police

Pour remplacer ou modifier d'autres polices, la personnalisation est semblable à celle utilisée pour modifier les fichiers TTF pour les besoins du marché local. Les fichiers de police inconnus mis à jour dans AOSP au moment de l'exécution sont ignorés et ne sont pas mis à jour. Google ignore les polices inconnues de votre appareil. Cela inclut les fichiers de police modifiés à partir des polices d'origine dans AOSP.

Bien que les mises à jour de police soient effectuées par Google dans GMS Core, le mécanisme général de mise à jour des polices est ouvert à tous les OEM. Les OEM peuvent installer des outils de mise à jour de polices supplémentaires en suivant les étapes décrites dans les sections Conditions préalables à remplir, Signer des fichiers de polices et Effectuer des mises à jour de polices d'exécution.

Répondre aux conditions préalables

Le mécanisme de mise à jour des polices utilise la fonctionnalité de noyau Linux fs-verity. Vérifiez que votre appareil est conforme à fs-verity et incluez le certificat dans votre appareil.

Signer les fichiers de police

Les fichiers de police étant des ressources à risque, ils doivent être validés à l'aide de clés approuvées. Examinez attentivement tous les fichiers de police à mettre à jour et signez-les avec votre clé privée. La signature doit être compatible avec fs-verity.

Effectuer des mises à jour de polices d'exécution

L'application système FontManager effectue les mises à jour de police. L'application FontManager fournit l'état de la dernière police système installée et la possibilité de mettre à jour les fichiers de police avec des signatures. Pour appeler des applications de mise à jour, ajoutez l'autorisation UPDATE_FONT signature|privileged à votre liste d'autorisation d'applications et à votre fichier manifeste.

Fournissez l'autorisation UPDATE_FONT signature|privileged à la fonction de mise à jour de votre application.