Implementando o fallback de fonte personalizada

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

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

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

O FontUpdater é um atualizador de fonte conectável que é confiável por uma verificação de permissão signature|privileged . O FontUpdater comunica com o FontManagerService para obter, instalar, remover ou atualizar as configurações atuais de fonte do sistema. O FontUpdater pode passar novos conteúdos de arquivo de fonte por mecanismos de comunicação 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 é guardado. Ele pode ser escrito apenas pelo FontManagerService , pela política SELinux.

Quando a classe Application é iniciada, ela passa as configurações de fonte do sistema como argumentos do método bindApplication ; em seguida, ele inicializa as configurações de fonte para uso pelo processo do aplicativo.

Implementando fontes personalizadas

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

O Google atualiza os arquivos de fonte, especialmente os arquivos NotoColorEmoji por meio do GMS Core, portanto, não modifique ou remova o arquivo NotoColorEmoji.ttf da partição /system e não o remova de /system/etc/fonts.xml . Observe as três maneiras a seguir de personalizar suas fontes:

  1. Substitua o arquivo NotoColorEmoji.ttf por uma fonte emoji da marca OEM.
  2. Modifique o arquivo NotoColorEmoji.ttf para suas necessidades de mercado local.
  3. Substitua ou modifique outros arquivos de fonte.

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

Substituindo NotoColorEmoji.ttf por fontes emoji da marca OEM

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

  1. Coloque sua própria fonte, chamada OEMCustomEmoji.ttf , na partição /system .
  2. Modifique /system/etc/fonts.xml 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>
    

Modificando 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 um nome diferente; por exemplo, nomeie-o Modified\_NotoColorEmoji.ttf .
  2. Coloque-o antes do arquivo NotoColorEmoji.ttf original.

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

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

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

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

Faça um glifo de tofu: você pode especificar explicitamente um ID de glifo de tofu se quiser usar um. Quando você especifica glyphID = 0 , o aplicativo relacionado interpreta isso como “glifo não disponível”. Por exemplo, quando você usa esse atributo, o aplicativo 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 tff para as necessidades do mercado local. Arquivos de fonte desconhecidos que são atualizados no AOSP em tempo de execução são ignorados e não são atualizados. O Google ignora fontes desconhecidas em seu dispositivo. Isso inclui arquivos de fonte 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 usando as etapas em Atendendo aos pré-requisitos , Assinando arquivos de fontes e Fazendo atualizações de fontes em tempo de execução .

Atendendo aos pré-requisitos

O mecanismo de atualização de fonte usa o recurso de kernel Linux fs-verity . Verifique se o seu dispositivo é compatível fs-verity e inclua o certificado no seu dispositivo.

Assinando arquivos de fonte

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

Fazendo atualizações de fonte de tempo de execução

O aplicativo FontManger System executa atualizações de fontes. O aplicativo FontManager fornece o status de fonte do sistema instalado mais recente e a capacidade de atualizar arquivos de fonte com assinaturas. Para chamar aplicativos de atualização, adicione a UPDATE_FONT signature|privileged permission à sua lista de permissões do aplicativo e ao seu manifesto .

Forneça a UPDATE_FONT signature|privileged para a função de atualização do seu aplicativo.