A partir do Android 15, as fontes variáveis são renderizadas no
tempo de execução com maior 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 para 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 apresenta 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 com plug-in 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 o novo conteúdo do arquivo de fonte por mecanismos de
comunicação entre processos (IPC). O FontManagerService
salva o conteúdo em
um local de armazenamento legível por todos, como nos arquivos /data/fonts
. Esse
armazenamento é protegido. Ele só pode ser gravado pelo FontManagerService
(apenas), de acordo
com a política do SELinux.
Quando a classe Application
é iniciada, ela transmite as configurações de fonte do sistema como
argumentos do método bindApplication
. Em seguida, ela inicializa as configurações de fonte
para uso pelo processo do app.
Suporte a fontes variáveis
No Android 15 e versões mais recentes, as configurações de fonte variável são
especificadas em
font_fallback.xml
usando este 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 eixo compatíveis. No
Android 15, apenas os eixos wght
e ital
podem ser
especificados.
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 momento da execução.
Os desenvolvedores podem usar a API Java android.graphics.fonts.SystemFonts#getAvailableFonts
ou a API NDK ASystemFontIterator_open
para acessar uma lista de arquivos de fonte instalados pelo sistema. Para saber mais sobre
APIs para desenvolvedores com 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 oferece suporte a essa funcionalidade, mas adiciona requisitos para manter as fontes de emoji atualizadas nos dispositivos. OEMs que não modificam ou atualizam arquivos de fontes de emoji não precisam usar esse recurso.
O Google atualiza os arquivos de fonte, especialmente 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
.
Veja a seguir três maneiras de personalizar suas fontes:
- Substitua o arquivo
NotoColorEmoji.ttf
por uma fonte de emoji com a marca OEM. - Modifique o arquivo
NotoColorEmoji.ttf
de acordo com as necessidades do seu mercado local. - Substitua ou modifique outros arquivos de fonte.
Se você não estiver modificando as fontes de emoji no AOSP, não precisa fazer nada. Se você quiser personalizar as fontes de emojis, siga as instruções nas seções a seguir.
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 de emojis logo antes da cadeia de fontes substitutas:
- Insira uma fonte própria, chamada
OEMCustomEmoji.ttf
, na partição/system
. Modifique
/frameworks/base/data/fonts/fonts.xml
(e/frameworks/base/data/fonts/font-fallback.xml
no Android 15 e mais recentes) conforme o código abaixo:<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:
- Crie seu próprio arquivo
NotoColorEmoji
com um nome diferente. Por exemplo, nomeie-o comoModified\_NotoColorEmoji.ttf
. - Coloque-o antes do arquivo
NotoColorEmoji.ttf
original.
Depois de realizar a etapa 2, o glifo modificado aceito por
Modified\NotoColorEmoji.ttf
será mostrado em vez do NotoColorEmoji.ttf
original.
O Google recomenda o seguinte:
- Tenha apenas o glifo necessário nessa fonte.
- Delegue glifos não modificados para o arquivo
NotoColorEmoji.ttf
original para que seus dispositivos recebam as 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 cmap.
Usar 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"
.
Crie um glifo de tofu:você pode especificar explicitamente um ID de glifo de 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 à de modificação dos arquivos TTF para necessidades do mercado local. Arquivos de fonte 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 dispositivo. Isso inclui arquivos de fontes que foram modificados das fontes originais no AOSP.
Embora as atualizações de fonte sejam feitas pelo Google no GMS Core, o mecanismo geral de atualização de fontes está aberto para todos os OEMs. Os OEMs podem instalar outros atualizadores de fontes seguindo as etapas em Como atender aos pré-requisitos, Assinar arquivos de fonte e Como fazer atualizações de fontes no ambiente de execução.
Cumpra os pré-requisitos
O mecanismo de atualização de fontes usa o recurso do kernel do Linux fs-verity
. Verifique se
o 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 a
chave privada. A assinatura precisa ser compatível com fs-verity
.
Atualizar a fonte no momento da execução
O app do sistema FontManager
executa atualizações de fontes. O app FontManager
oferece o status da fonte do sistema instalada mais recente e a capacidade de atualizar arquivos
de fontes com assinaturas. Para chamar apps de atualização, adicione a permissão
UPDATE_FONT signature|privileged
à
lista de permissões de apps
e ao manifesto.
Conceda a permissão UPDATE_FONT signature|privileged
à função do atualizador do
app.