Implementar fontes personalizadas

A partir do Android 15, as fontes variáveis são renderizadas em tempo de execução com mais eficiência e granularidade. Com essa atualização, os fornecedores precisam adicionar novas configurações de fontes variáveis a font_fallback.xml em vez de fonts.xml, já que fonts.xml está sendo descontinuado. Consulte Suporte a fontes variáveis para mais informações.

No Android 11 e versões anteriores, a atualização de arquivos de fonte instalados pelo dispositivo no AOSP (na partição /system/fonts) ou nas partições do fornecedor (nas partições /product/fonts ou /system/fonts) exige uma atualização do sistema do OEM. Esse requisito tem um impacto significativo na compatibilidade com emojis. No Android 12, você pode usar o serviço do sistema FontManager para gerenciar arquivos de fontes instaladas e atualizar os arquivos de fontes no dispositivo sem precisar de uma atualização do sistema.

O Android 12 tem três interações de processo: FontManagerService, Font Updater e Application.

O FontManagerService é o sistema de gerenciamento central no servidor do sistema. O FontManagerService armazena as configurações de fonte do sistema mais recentes por usuário.

O FontUpdater é um atualizador de fontes conectável confiável por uma verificação de permissão signature|privileged. O FontUpdater se comunica com o FontManagerService para receber, instalar, remover ou atualizar as configurações atuais de fonte do sistema. O FontUpdater pode transmitir novos conteúdos de arquivos de fontes por mecanismos de comunicações entre processos (IPC). O FontManagerService salva o conteúdo em um local de armazenamento legível para todos, como nos arquivos /data/fonts. Este armazenamento está protegido. Ela pode ser gravada apenas pelo FontManagerService ou pela política do SELinux.

Quando a classe Application é iniciada, ela transmite as configurações de fonte do sistema como argumentos do método bindApplication e inicializa as configurações de fonte para uso pelo processo do app.

Suporte a fontes variáveis

A partir do Android 15, as configurações de fontes variáveis são especificadas em font_fallback.xml usando o seguinte formato:

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

Nesse formato, uma fonte variável tem todos os atributos de uma fonte estática com um atributo supportedAxes adicional. Um atributo supportedAxes é uma lista separada por vírgulas de tags de eixos compatíveis. No Android 15, só é possível especificar os eixos wght e ital.

Se o atributo supportedAxes não for especificado, o nó font vai funcionar como uma fonte estática de uma única instância de uma fonte variável especificada com filhos axis.

Se o atributo supportedAxes for especificado, o sistema vai criar dinamicamente uma instância de fonte para o peso e o valor de estilo especificados no ambiente de execução.

Os desenvolvedores podem usar a API Java android.graphics.fonts.SystemFonts#getAvailableFonts ou a API NDK ASystemFontIterator_open para receber uma lista de arquivos de fontes instalados no sistema. Para informações sobre APIs de desenvolvedor que oferecem suporte a essa atualização, consulte API OpenType Variable Font aprimorada e buildVariableFamily.

Personalizar fontes

Alguns OEMs instalam ou substituem arquivos de fonte no AOSP para mostrar as marcas deles. O Android 12 é compatível com essa funcionalidade, mas adiciona requisitos para manter as fontes de emoji atualizadas nos dispositivos. Os OEMs que não modificam nem atualizam arquivos de fontes de emoji não precisam usar esse recurso.

O Google atualiza os arquivos de fontes, principalmente os arquivos NotoColorEmoji, pelo GMS Core. Portanto, não modifique nem remova o arquivo NotoColorEmoji.ttf da partição /system e não o remova de /frameworks/base/data/fonts/fonts.xml. Confira as três maneiras de personalizar suas fontes:

  1. Substitua o arquivo NotoColorEmoji.ttf por uma fonte de emojis com a marca do OEM.
  2. Modifique o arquivo NotoColorEmoji.ttf para atender às necessidades do seu mercado local.
  3. Substitua ou modifique outros arquivos de fonte.

Se você não estiver modificando fontes de emoji no AOSP, não precisará fazer nada. Se você quiser personalizar as fontes de emoji, siga as instruções nas seções abaixo.

Substitua NotoColorEmoji.ttf por fontes de emoji com a marca do OEM

Para substituir o arquivo NotoColorEmoji.ttf pelo arquivo de fontes de emoji da sua marca OEM, coloque a fonte de emoji logo antes da cadeia de substituição de fontes:

  1. Coloque sua própria fonte, chamada OEMCustomEmoji.ttf, na partição /system.
  2. Modifique /frameworks/base/data/fonts/fonts.xml (e /frameworks/base/data/fonts/font-fallback.xml no Android 15 e versões mais recentes) como no código a seguir:

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

Modificar NotoColorEmoji.ttf para atender às necessidades do mercado local

Siga estas etapas para personalizar de acordo com as necessidades do seu mercado local:

  1. Crie seu próprio arquivo NotoColorEmoji com um nome diferente. Por exemplo, nomeie-o como Modified\_NotoColorEmoji.ttf.
  2. Coloque-o antes do arquivo NotoColorEmoji.ttf original.

Depois de realizar a etapa 2, o glifo modificado compatível com Modified\NotoColorEmoji.ttf vai aparecer em vez do NotoColorEmoji.ttf original. O Google recomenda o seguinte:

  • Tenha apenas o glifo necessário nessa fonte.
  • Delegue glifos não modificados ao arquivo NotoColorEmoji.ttf original para que seus dispositivos recebam correções de design feitas em versões futuras de emojis.

Remover glifos:para remover glifos do arquivo NotoColorEmoji.ttf, siga as etapas 1 e 2 e especifique glyph ID = 0 no seu cmap.

Use uma flag regional:se o glifo de destino for uma flag regional, especifique o ID do glifo como um código de país desconhecido. (Use country code = "ZZ".)

Criar um glifo tofu:você pode especificar explicitamente um ID de glifo tofu se quiser usar um. Quando você especifica glyphID = 0, o app relacionado interpreta isso como "glifo não disponível". Por exemplo, quando você usa esse atributo, o app Paint#hasGlyph retorna false.

Substituir ou modificar outros arquivos de fonte

Para substituir ou modificar outras fontes, a personalização é semelhante à modificação dos arquivos TTF para atender às necessidades do mercado local. Arquivos de fontes desconhecidos que são atualizados no AOSP durante a execução são ignorados e não são atualizados. O Google ignora fontes desconhecidas no seu dispositivo. Isso inclui arquivos de fontes que foram modificados das fontes originais no AOSP.

Embora as atualizações de fontes sejam feitas pelo Google no GMS Core, o mecanismo geral de atualização de fontes está aberto a todos os OEMs. Os OEMs podem instalar atualizadores de fontes adicionais seguindo as etapas em Atender aos pré-requisitos, Assinar arquivos de fontes e Fazer atualizações de fontes em tempo de execução.

Atender aos pré-requisitos

O mecanismo de atualização de fontes usa o recurso fs-verity do kernel do Linux. Verifique se o dispositivo está em conformidade com fs-verity e inclua o certificado nele.

Assinar arquivos de fonte

Como os arquivos de fontes são recursos arriscados, eles precisam ser verificados com chaves confiáveis. Revise cuidadosamente todos os arquivos de fontes que serão atualizados e assine com sua chave privada. A assinatura precisa ser compatível comfs-verity.

Fazer atualizações de fontes no ambiente de execução

O app do sistema FontManager faz atualizações de fontes. O app FontManager fornece o status mais recente da fonte do sistema instalada e a capacidade de atualizar arquivos de fontes com assinaturas. Para chamar a atualização de apps, adicione a permissão UPDATE_FONT signature|privileged à lista de permissões de apps e ao manifesto.

Forneça a permissão UPDATE_FONT signature|privileged à função de atualização do app.