Implementare caratteri personalizzati

A partire da Android 15, i caratteri variabili vengono visualizzati in fase di runtime con maggiore efficienza e granularità. Con questo aggiornamento, i fornitori devono aggiungere nuove configurazioni di caratteri variabili a font_fallback.xml anziché a fonts.xml, poiché fonts.xml è in fase di ritiro. Per ulteriori informazioni, consulta Supporto dei caratteri variabili.

In Android 11 e versioni precedenti, l'aggiornamento dei file dei caratteri installati sul dispositivo in AOSP (nella partizione /system/fonts) o nelle partizioni del fornitore (nelle partizioni /product/fonts o /system/fonts) richiede un aggiornamento di sistema dell'OEM. Questo requisito ha un impatto significativo sulla compatibilità delle emoji. In Android 12 puoi utilizzare il servizio di sistema FontManager per gestire i file dei caratteri installati e aggiornare i file dei caratteri installati sul dispositivo senza un aggiornamento di sistema.

Android 12 prevede tre interazioni di processo: FontManagerService, Font Updater e Application.

FontManagerService è il sistema di gestione centrale nel server di sistema. FontManagerService memorizza le impostazioni dei caratteri di sistema più recenti per utente.

FontUpdater è un programma di aggiornamento dei caratteri plug-in considerato attendibile da un controllo delle autorizzazioni signature|privileged. FontUpdater comunica con FontManagerService per ottenere, installare, rimuovere o aggiornare le impostazioni del carattere di sistema corrente. FontUpdater può passare i nuovi contenuti del file del carattere tramite meccanismi di comunicazione interprocesso (IPC). FontManagerService salva i contenuti in una posizione di archiviazione leggibile a livello globale, ad esempio nei file /data/fonts. Questo spazio di archiviazione è protetto. Può essere scritto solo dal FontManagerService, dai criteri SELinux.

Quando viene avviata la classe Application, passa le impostazioni dei caratteri di sistema come argomenti del metodo bindApplication, quindi inizializza le impostazioni dei caratteri per l'utilizzo da parte del processo dell'app.

Supporto per i caratteri variabili

A partire da Android 15, le configurazioni dei caratteri variabili vengono specificate in font_fallback.xml utilizzando il seguente formato:

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

In questo formato, un carattere variabile ha tutti gli attributi di un carattere statico con un attributo supportedAxes aggiuntivo. Un attributo supportedAxes è un elenco separato da virgole di tag asse supportati. Con Android 15, è possibile specificare solo gli assi wght e ital.

Se l'attributo supportedAxes non è specificato, il nodo font funziona come un carattere statico di una singola istanza di un carattere variabile specificato con elementi secondari axis.

Se viene specificato l'attributo supportedAxes, il sistema crea dinamicamente un'istanza del carattere per il valore di peso e stile specificato in fase di runtime.

Gli sviluppatori possono utilizzare l'API Java android.graphics.fonts.SystemFonts#getAvailableFonts o l'API NDK ASystemFontIterator_open per ottenere un elenco di file di caratteri installati nel sistema. Per informazioni sulle API per sviluppatori che supportano questo aggiornamento, vedi API per caratteri variabili OpenType migliorata e buildVariableFamily.

Personalizzare i caratteri

Alcuni OEM installano o sostituiscono i file dei caratteri in AOSP per mostrare i propri brand. Android 12 supporta questa funzionalità, ma aggiunge requisiti per mantenere aggiornati i caratteri emoji nei dispositivi. I produttori OEM che non modificano o aggiornano i file dei caratteri emoji non devono utilizzare questa funzionalità.

Google aggiorna i file dei caratteri, in particolare i file NotoColorEmoji tramite GMS Core, quindi non modificare o rimuovere il file NotoColorEmoji.ttf dalla partizione /system e non rimuoverlo da /frameworks/base/data/fonts/fonts.xml. Tieni presente i tre modi seguenti in cui puoi personalizzare i caratteri:

  1. Sostituisci il file NotoColorEmoji.ttf con un carattere emoji con il brand OEM.
  2. Modifica il file NotoColorEmoji.ttf in base alle esigenze del tuo mercato locale.
  3. Sostituisci o modifica altri file di caratteri.

Se non modifichi i caratteri emoji in AOSP, non devi fare nulla. Se vuoi personalizzare i caratteri degli emoji, segui le istruzioni riportate nelle sezioni seguenti.

Sostituisci NotoColorEmoji.ttf con i caratteri emoji con brand OEM

Per sostituire il file NotoColorEmoji.ttf con il file dei caratteri emoji con il brand OEM, inserisci il carattere emoji appena prima della catena di fallback dei caratteri:

  1. Inserisci il tuo carattere, chiamato OEMCustomEmoji.ttf, nella partizione /system.
  2. Modifica /frameworks/base/data/fonts/fonts.xml (e /frameworks/base/data/fonts/font-fallback.xml in Android 15 e versioni successive) come nel seguente codice:

    <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 in base alle esigenze del mercato locale

Segui questi passaggi per personalizzare i dati in base alle esigenze del mercato locale:

  1. Crea un file NotoColorEmoji con un nome diverso, ad esempio Modified\_NotoColorEmoji.ttf.
  2. Posizionalo prima del file NotoColorEmoji.ttf originale.

Dopo aver eseguito il passaggio 2, viene visualizzato il glifo modificato supportato da Modified\NotoColorEmoji.ttf anziché quello originale NotoColorEmoji.ttf. Google consiglia quanto segue:

  • Contiene solo il glifo necessario.
  • Delega i glifi non modificati al file NotoColorEmoji.ttf originale in modo che i tuoi dispositivi ricevano le correzioni di progettazione apportate nelle future release di emoji.

Rimuovi i glifi: per rimuovere i glifi dal file NotoColorEmoji.ttf, segui i passaggi 1 e 2 e specifica glyph ID = 0 nella cmap.

Utilizza un flag regionale:se il glifo di destinazione è un flag regionale, specifica l'ID glifo come codice paese sconosciuto. (Utilizza country code = "ZZ".)

Crea un glifo tofu: puoi specificare esplicitamente un ID glifo tofu se vuoi utilizzarne uno. Quando specifichi glyphID = 0, l'app correlata lo interpreta come "il glifo non è disponibile". Ad esempio, quando utilizzi questo attributo, l'app Paint#hasGlyph restituisce false.

Sostituire o modificare altri file di caratteri

Per sostituire o modificare altri caratteri, la personalizzazione è simile a quella per la modifica dei file TTF per le esigenze del mercato locale. I file dei caratteri sconosciuti che vengono aggiornati in AOSP in fase di runtime vengono ignorati e non vengono aggiornati. Google ignora i caratteri sconosciuti sul tuo dispositivo. Sono inclusi i file dei caratteri modificati rispetto ai caratteri originali in AOSP.

Sebbene gli aggiornamenti dei caratteri vengano eseguiti da Google in GMS Core, il meccanismo generale di aggiornamento dei caratteri è aperto a tutti gli OEM. Gli OEM possono installare ulteriori programmi di aggiornamento dei caratteri seguendo i passaggi descritti in Prerequisiti, Firma dei file dei caratteri e Aggiornamenti dei caratteri in fase di runtime.

Soddisfare i prerequisiti

Il meccanismo di aggiornamento dei caratteri utilizza la funzionalità del kernel Linux fs-verity. Verifica che il tuo dispositivo sia conforme a fs-verity e includi il certificato nel dispositivo.

File dei caratteri del cartello

Poiché i file dei caratteri sono risorse rischiose, devono essere verificati con chiavi attendibili. Esamina attentamente tutti i file di caratteri da aggiornare e firma con la tua chiave privata. La firma deve essere compatibile con fs-verity.

Eseguire aggiornamenti dei caratteri di runtime

L'app di sistema FontManager esegue gli aggiornamenti dei caratteri. L'app FontManager fornisce lo stato dei caratteri di sistema installati più recenti e la possibilità di aggiornare i file dei caratteri con le firme. Per chiamare le app di aggiornamento, aggiungi l'autorizzazione UPDATE_FONT signature|privileged alla tua lista consentita delle app e al tuo manifest.

Fornisci l'autorizzazione UPDATE_FONT signature|privileged alla funzione di aggiornamento dell'app.