Implementar fontes personalizadas

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

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

O Android 12 apresenta três interações de processos: 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 e confiável Verificação de permissão signature|privileged. O FontUpdater se comunica com FontManagerService para acessar, instalar, remover ou atualizar a fonte atual do sistema configurações. O FontUpdater pode transmitir o novo conteúdo do arquivo de fonte por processos internos. de comunicação (IPC). O FontManagerService salva o conteúdo em um local de armazenamento legível por todos, como nos arquivos /data/fonts. Isso se o armazenamento é protegido. Pode ser escrita apenas pela FontManagerService, pela política do SELinux.

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

Suporte a fontes variáveis

A partir do Android 15, as configurações de fonte variáveis são: especificado 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 extra. Um atributo supportedAxes é um lista separada por vírgulas de tags de eixo compatíveis. Com Android 15, apenas os eixos wght e ital podem ser especificado.

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

Se o atributo supportedAxes for especificado, o sistema criará dinamicamente um instância de fonte para o valor de peso e estilo no tempo de execução.

Os desenvolvedores podem usar o android.graphics.fonts.SystemFonts#getAvailableFonts API Java ou a ASystemFontIterator_open API NDK para receber uma lista de arquivos de fontes instalados pelo sistema. Para informações sobre APIs de desenvolvedor compatíveis com 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 emojis atualizadas nos dispositivos. OEMs que não modificam nem os arquivos de fonte de emojis não precisam usar esse recurso.

O Google atualiza os arquivos de fontes, especialmente os arquivos NotoColorEmoji pelo GMS Core. Portanto, não modifique nem remova o arquivo NotoColorEmoji.ttf da /system e não a remova da /frameworks/base/data/fonts/fonts.xml. Veja a seguir 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 de acordo com as necessidades do seu mercado local.
  3. Substitua ou modifique outros arquivos de fonte.

Se você não está modificando fontes de emojis no AOSP, não precisa fazer nada. Se quiser personalizar as fontes de emojis, siga as instruções abaixo em outras seções.

Substituir NotoColorEmoji.ttf por fontes de emojis com a marca do OEM

Para substituir o arquivo NotoColorEmoji.ttf pelo arquivo de fontes de emojis da marca OEM: coloque a fonte do emoji logo antes da cadeia de fontes substitutas:

  1. Insira uma fonte própria, chamada OEMCustomEmoji.ttf, na partição /system.
  2. Modifique /frameworks/base/data/fonts/fonts.xml (e /frameworks/base/data/fonts/font-fallback.xml pol. Android 15 e versões mais recentes), como no seguinte 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>
    

Modifique o NotoColorEmoji.ttf para as 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 outro nome. por exemplo, nomeie-o como Modified\_NotoColorEmoji.ttf.
  2. Coloque-o antes do arquivo NotoColorEmoji.ttf original.

Depois de executar a etapa 2, o glifo modificado suportado pelo Mostra Modified\NotoColorEmoji.ttf 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 recebem as correções de design feitas em lançamentos futuros de emojis.

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

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

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

Substituir ou modificar outros arquivos de fonte

Para substituir ou modificar outras fontes, a personalização é semelhante à do modificando os arquivos TTF para as necessidades do mercado local. Os arquivos de fonte desconhecidos que são atualizados no AOSP no momento da execução são ignorados e não são atualizados. O Google ignora fontes desconhecidas no seu dispositivo. Isso inclui arquivos de fonte que foram modificados as fontes originais no AOSP.

Embora as atualizações de fonte sejam feitas pelo Google no GMS Core, a atualização geral de fontes é aberto a todos os OEMs. OEMs podem instalar mais atualizadores de fontes usando Siga as etapas em Pré-requisitos da reunião e Assinar arquivos de fonte. e Como fazer atualizações de fontes no momento da execução.

Atender aos pré-requisitos

O mecanismo de atualização de fontes usa o recurso fs-verity do kernel do Linux. Verifique se Seu dispositivo é compatível com fs-verity e inclua o certificado nele.

Assinar arquivos de fonte

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

Fazer atualizações de fonte durante a execução

O app do sistema FontManager executa atualizações de fonte. O app FontManager oferece o status mais recente da fonte do sistema instalada e a capacidade de atualizar a fonte arquivos com assinaturas. Para chamar apps de atualização, adicione o método UPDATE_FONT signature|privileged permissão para sua lista de permissões de apps, e ao manifesto.

Conceder a permissão UPDATE_FONT signature|privileged ao atualizador do app função.