Cómo implementar fuentes personalizadas

A partir de Android 15, las fuentes variables se renderizan en el tiempo de ejecución con mayor eficiencia y nivel de detalle. Con esta actualización, los proveedores deben agregar nuevas configuraciones de fuentes variables a font_fallback.xml en lugar de fonts.xml, ya que fonts.xml dejará de estar disponible. Consulta Compatibilidad con fuentes variables para obtener más información.

En Android 11 y versiones anteriores, la actualización de archivos de fuente instalados en el dispositivo en AOSP (en la partición /system/fonts) o las particiones del proveedor (en las particiones /product/fonts o /system/fonts) requiere una actualización del sistema del OEM. Este requisito tiene un impacto significativo en la compatibilidad con emojis. En Android 12, puedes usar el servicio del sistema FontManager para administrar los archivos de fuentes instalados y actualizar los archivos de fuentes instalados en el dispositivo sin una actualización del sistema.

Android 12 incluye tres interacciones de procesos: FontManagerService, Font Updater y Application.

FontManagerService es el sistema de administración central en el servidor del sistema. FontManagerService almacena la última configuración de fuentes del sistema por usuario.

FontUpdater es un actualizador de fuentes conectables en el que se confía en una verificación de permisos signature|privileged. FontUpdater se comunica con FontManagerService para obtener, instalar, quitar o actualizar la configuración actual de la fuente del sistema. FontUpdater puede pasar contenidos nuevos del archivo de fuentes mediante mecanismos de comunicación entre procesos (IPC). FontManagerService guarda el contenido en una ubicación de almacenamiento legible por todos, como en los archivos /data/fonts. Este almacenamiento está protegido. Solo FontManagerService puede escribirlo , según la política de SELinux.

Cuando se inicia la clase Application, pasa la configuración de la fuente del sistema como argumentos del método bindApplication y, luego, inicializa la configuración de la fuente para que la use el proceso de la app.

Compatibilidad con fuentes variables

A partir de Android 15, las configuraciones de fuentes variables se especifican en font_fallback.xml con el siguiente formato:

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

En este formato, una fuente variable tiene todos los atributos de una fuente estática con un atributo supportedAxes adicional. Un atributo supportedAxes es una lista de etiquetas de ejes compatibles separadas por comas. Con Android 15, solo se pueden especificar los ejes wght y ital.

Si no se especifica el atributo supportedAxes, el nodo font funciona como una fuente estática de una sola instancia de una fuente variable especificada con elementos secundarios axis.

Si se especifica el atributo supportedAxes, el sistema crea dinámicamente una instancia de fuente para el valor de peso y estilo determinados en el tiempo de ejecución.

Los desarrolladores pueden usar la API de Java android.graphics.fonts.SystemFonts#getAvailableFonts o la API del NDK ASystemFontIterator_open para obtener una lista de los archivos de fuentes instalados en el sistema. Para obtener información sobre las APIs de desarrollador que admiten esta actualización, consulta Mejora de la API de OpenType Variable Font y buildVariableFamily.

Personaliza las fuentes

Algunos OEM instalan o reemplazan archivos de fuente en AOSP para mostrar sus marcas. Android 12 admite esta funcionalidad, pero agrega requisitos para mantener las fuentes de emojis actualizadas en los dispositivos. Los OEMs que no modifican ni actualizan los archivos de fuentes de emojis no necesitan usar esta función.

Google actualiza los archivos de fuentes, en especial los archivos NotoColorEmoji a través de GMS Core, por lo que no debes modificar ni quitar el archivo NotoColorEmoji.ttf de la partición /system ni de /frameworks/base/data/fonts/fonts.xml. Ten en cuenta las siguientes tres formas en que puedes personalizar tus fuentes:

  1. Reemplaza el archivo NotoColorEmoji.ttf con una fuente de emojis de la marca OEM.
  2. Modifica el archivo NotoColorEmoji.ttf según las necesidades de tu mercado local.
  3. Reemplaza o modifica otros archivos de fuentes.

Si no modificas las fuentes de emojis en AOSP, no es necesario que realices ninguna acción. Si quieres personalizar las fuentes de emojis, sigue las instrucciones de las siguientes secciones.

Reemplaza NotoColorEmoji.ttf con fuentes de emojis de la marca OEM.

Para reemplazar el archivo NotoColorEmoji.ttf por tu archivo de fuentes de emojis de la marca OEM, coloca la fuente de emojis justo antes de la cadena de resguardo de fuentes:

  1. Coloca tu propia fuente, llamada OEMCustomEmoji.ttf, en la partición /system.
  2. Modifica /frameworks/base/data/fonts/fonts.xml (y /frameworks/base/data/fonts/font-fallback.xml en Android 15 y versiones posteriores) como se muestra en el siguiente código:

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

Modifica NotoColorEmoji.ttf para las necesidades del mercado local

Sigue estos pasos para personalizarlos según las necesidades de tu mercado local:

  1. Crea tu propio archivo NotoColorEmoji con un nombre diferente; por ejemplo, puedes asignarle el nombre Modified\_NotoColorEmoji.ttf.
  2. Colócalo antes del archivo NotoColorEmoji.ttf original.

Después de realizar el paso 2, se muestra el glifo modificado compatible con Modified\NotoColorEmoji.ttf en lugar del NotoColorEmoji.ttf original. Google recomienda lo siguiente:

  • Solo tiene el glifo necesario en esta fuente.
  • Delega glifos sin modificar al archivo NotoColorEmoji.ttf original para que tus dispositivos reciban las correcciones de diseño realizadas en futuras versiones de emojis.

Quita glifos: Para quitar glifos del archivo NotoColorEmoji.ttf, sigue los pasos 1 y 2, y especifica glyph ID = 0 en tu cmap.

Usa una marca regional: Si el glifo de destino es una marca regional, especifica el ID de glifo como un código de país desconocido. (Usa country code = "ZZ").

Crea un glifo de tofu: puedes especificar explícitamente un ID de glifo de tofu si deseas utilizar uno. Cuando especificas glyphID = 0, la app relacionada lo interpreta como "el glifo no está disponible". Por ejemplo, cuando usas este atributo, la app Paint#hasGlyph muestra false.

Reemplaza o modifica otros archivos de fuente

Para reemplazar o modificar otras fuentes, la personalización es similar a la de modificar los archivos TTF según las necesidades del mercado local. Los archivos de fuentes desconocidos que se actualizan en el AOSP durante el tiempo de ejecución se ignoran y no se actualizan. Google ignora las fuentes desconocidas en tu dispositivo. Esto incluye archivos de fuentes que se modificaron a partir de las fuentes originales en el AOSP.

Si bien Google realiza las actualizaciones de fuentes en GMS Core, el mecanismo general de actualización de fuentes está disponible para todos los OEM. Los OEMs pueden instalar actualizadores de fuentes adicionales con los pasos que se indican en Cumple con los requisitos previos, Firma archivos de fuentes y Realiza actualizaciones de fuentes del entorno de ejecución.

Cumpla con los requisitos previos

El mecanismo de actualización de fuentes usa la función del kernel de Linux fs-verity. Verifica que tu dispositivo cumpla con fs-verity y asegúrate de incluir el certificado en el dispositivo.

Firma archivos de fuentes

Dado que los archivos de fuentes son recursos riesgosos, se deben verificar con claves de confianza. Revisa con atención todos los archivos de fuentes que deseas actualizar y fírmalos con tu clave privada. La firma debe ser compatible con fs-verity.

Cómo realizar actualizaciones de fuentes de tiempo de ejecución

La app del sistema FontManager realiza actualizaciones de fuentes. La app de FontManager proporciona el estado más reciente de la fuente del sistema instalada y la capacidad de actualizar los archivos de fuente con firmas. Para llamar a la actualización de apps, agrega el permiso UPDATE_FONT signature|privileged a tu lista de apps permitidas y a tu manifiesto.

Proporciona el permiso UPDATE_FONT signature|privileged a la función de actualización de tu app.