Wdrażanie czcionek niestandardowych

Od Androida 15 czcionki zmienne są renderowane w czasie działania z większą wydajnością i dokładnością. W związku z tą zmianą dostawcy muszą dodawać nowe konfiguracje czcionek zmiennych do font_fallback.xml zamiast do fonts.xml, ponieważ fonts.xml jest wycofywany. Więcej informacji znajdziesz w artykule Obsługa czcionek zmiennych.

W Androidzie 11 i starszych wersjach aktualizacja plików czcionek zainstalowanych na urządzeniu w AOSP (w partycji /system/fonts) lub w partycjach dostawcy (w partycjach /product/fonts lub /system/fonts) wymaga aktualizacji systemu od producenta OEM. Ten wymóg ma znaczący wpływ na zgodność emoji. W Androidzie 12 możesz używać FontManagerusługi systemowejFontManager do zarządzania zainstalowanymi plikami czcionek i aktualizowania ich na urządzeniu bez aktualizacji systemu.

Android 12 ma 3 interakcje procesów:FontManagerService, Font UpdaterApplication.

FontManagerService to centralny system zarządzania na serwerze systemowym. FontManagerService przechowuje najnowsze ustawienia czcionki systemowej dla poszczególnych użytkowników.

FontUpdater to wtykowy moduł aktualizacji czcionek, który jest zaufany przez sprawdzanie uprawnień signature|privileged. FontUpdater komunikuje się z FontManagerService, aby pobierać, instalować, usuwać lub aktualizować bieżące ustawienia czcionki systemowej. FontUpdater może przekazywać nową zawartość pliku czcionki za pomocą mechanizmów komunikacji międzyprocesowej (IPC). FontManagerService zapisuje zawartość w lokalizacji pamięci masowej dostępnej do odczytu dla wszystkich, np. w plikach /data/fonts. Ten magazyn jest chroniony. Może być zapisana FontManagerService tylko przez zasady SELinux.

Gdy uruchamia się klasa Application, przekazuje ustawienia czcionki systemowej jako argumenty metody bindApplication, a następnie inicjuje ustawienia czcionki do użycia przez proces aplikacji.

Obsługa czcionek zmiennych

Od Androida 15 konfiguracje czcionek zmiennych są określane w font_fallback.xml w tym formacie:

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

W tym formacie czcionka zmienna ma wszystkie atrybuty czcionki statycznej z dodatkowym atrybutem supportedAxes. Atrybut supportedAxes to rozdzielona przecinkami lista obsługiwanych tagów osi. W Androidzie 15 można określić tylko osie wghtital.

Jeśli atrybut supportedAxes nie jest określony, węzeł font działa jako statyczna czcionka pojedynczego wystąpienia czcionki zmiennej określonej za pomocą elementów podrzędnych axis.

Jeśli atrybut supportedAxes jest określony, system dynamicznie tworzy instancję czcionki dla podanej wartości wagi i stylu w czasie działania.

Deweloperzy mogą używać android.graphics.fonts.SystemFonts#getAvailableFontsinterfejsu Java API lub ASystemFontIterator_openinterfejsu NDK API, aby uzyskać listę plików czcionek zainstalowanych w systemie. Informacje o interfejsach API dla programistów, które obsługują tę aktualizację, znajdziesz w artykułach Ulepszony interfejs API czcionek zmiennych OpenTypebuildVariableFamily.

Dostosowywanie czcionek

Niektórzy producenci OEM instalują lub zastępują pliki czcionek w AOSP, aby wyświetlać swoje marki. Android 12 obsługuje tę funkcję, ale dodaje wymagania dotyczące aktualizowania czcionek emoji na urządzeniach. Producenci OEM, którzy nie modyfikują ani nie aktualizują plików czcionek emoji, nie muszą korzystać z tej funkcji.

Google aktualizuje pliki czcionek, zwłaszcza pliki NotoColorEmoji, za pomocą GMS Core, więc nie modyfikuj ani nie usuwaj pliku NotoColorEmoji.ttf z partycji /system ani z /frameworks/base/data/fonts/fonts.xml. Pamiętaj, że czcionki możesz dostosować na 3 sposoby:

  1. Zastąp plik NotoColorEmoji.ttf czcionką emoji z logo producenta OEM.
  2. Zmodyfikuj plik NotoColorEmoji.ttf, aby dostosować go do potrzeb lokalnego rynku.
  3. zastępować ani modyfikować innych plików czcionek;

Jeśli nie modyfikujesz czcionek emoji w AOSP, nie musisz nic robić. Jeśli chcesz dostosować czcionki emoji, skorzystaj z instrukcji w kolejnych sekcjach.

Zastąpienie pliku NotoColorEmoji.ttf czcionkami emoji z logo OEM

Aby zastąpić plik NotoColorEmoji.ttf plikiem czcionek emoji z logo producenta OEM, umieść czcionkę emoji tuż przed łańcuchem czcionek zastępczych:

  1. Umieść własną czcionkę o nazwie OEMCustomEmoji.ttf w partycji /system.
  2. Zmodyfikuj /frameworks/base/data/fonts/fonts.xml (i /frameworks/base/data/fonts/font-fallback.xml w Androidzie 15 i nowszym) zgodnie z tym kodem:

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

Modyfikowanie pliku NotoColorEmoji.ttf pod kątem potrzeb lokalnego rynku

Aby dostosować informacje do potrzeb lokalnego rynku, wykonaj te czynności:

  1. Utwórz własny plik NotoColorEmoji o innej nazwie, np. Modified\_NotoColorEmoji.ttf.
  2. Umieść go przed oryginalnym plikiem NotoColorEmoji.ttf.

Po wykonaniu kroku 2 zmodyfikowany znak obsługiwany przez Modified\NotoColorEmoji.ttf będzie wyświetlany zamiast oryginalnego znaku NotoColorEmoji.ttf. Google zaleca:

  • zawierać tylko niezbędny glif;
  • Przekaż niezmodyfikowane glify do oryginalnego NotoColorEmoji.ttf pliku, aby urządzenia otrzymywały poprawki projektu wprowadzone w przyszłych wersjach emoji.

Usuwanie glifów: aby usunąć glify z pliku NotoColorEmoji.ttf, wykonaj kroki 1 i 2 oraz w mapie znaków określ glyph ID = 0.

Użyj flagi regionalnej: jeśli docelowy znak to flaga regionalna, podaj identyfikator znaku jako nieznany kod kraju. (Użyj country code = "ZZ").

Utwórz glif tofu: możesz wyraźnie określić identyfikator glifu tofu, jeśli chcesz go użyć. Jeśli określisz wartość glyphID = 0, powiązana aplikacja zinterpretuje ją jako „glif jest niedostępny”. Na przykład, gdy użyjesz tego atrybutu, aplikacja Paint#hasGlyph zwróci false.

Zastępowanie lub modyfikowanie innych plików czcionek

Zastępowanie i modyfikowanie innych czcionek jest podobne do modyfikowania plików TTF na potrzeby rynku lokalnego. Nieznane pliki czcionek, które są aktualizowane w AOSP w czasie działania, są ignorowane i nie są aktualizowane. Google ignoruje nieznane czcionki na urządzeniu. Obejmuje to pliki czcionek zmodyfikowane na podstawie oryginalnych czcionek w AOSP.

Aktualizacje czcionek są przeprowadzane przez Google w GMS Core, ale ogólny mechanizm aktualizacji czcionek jest dostępny dla wszystkich producentów OEM. Producenci OEM mogą instalować dodatkowe programy do aktualizacji czcionek, wykonując czynności opisane w sekcjach Wymagania wstępne, Podpisywanie plików czcionekWprowadzanie aktualizacji czcionek w czasie działania.

Spełnianie wymagań wstępnych

Mechanizm aktualizacji czcionek korzysta z funkcji jądra systemu Linux fs-verity. Sprawdź, czy urządzenie jest zgodne z wymaganiami fs-verity, i dołącz certyfikat do urządzenia.

Podpisywanie plików czcionek

Pliki czcionek są zasobami ryzykownymi, dlatego muszą być weryfikowane za pomocą zaufanych kluczy. Dokładnie sprawdź wszystkie pliki czcionek, które mają zostać zaktualizowane, i podpisz je kluczem prywatnym. Podpis musi byćfs-verity zgodny.

Wprowadzanie zmian w czcionkach w czasie działania

Aktualizacje czcionek przeprowadza FontManager aplikacja systemowa. Aplikacja FontManager podaje stan najnowszej zainstalowanej czcionki systemowej i umożliwia aktualizowanie plików czcionek za pomocą podpisów. Aby wywoływać aplikacje do aktualizacji, dodaj uprawnienie UPDATE_FONT signature|privileged do listy dozwolonych aplikacjido pliku manifestu.

Przyznaj funkcji aktualizatora aplikacji uprawnienie UPDATE_FONT signature|privileged.