Wdrażanie czcionek niestandardowych

Od Androida 15 czcionki zmienne są renderowane w czasie działania z większą wydajnością i szczegółowością. W ramach tej aktualizacji 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 aktualizowanie 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. To wymaganie ma znaczący wpływ na zgodność z emotikonami. W Androidzie 12 możesz używać usługi systemowej FontManager do zarządzania zainstalowanymi plikami czcionek i aktualizowania plików czcionek zainstalowanych na urządzeniu bez aktualizacji systemu.

Android 12 obejmuje 3 interakcje procesów: FontManagerService, Font Updater i Application.

FontManagerService to centralny system zarządzania na serwerze systemowym. FontManagerService przechowuje najnowsze ustawienia czcionek systemowych dla każdego użytkownika.

FontUpdater to wtyczka do aktualizowania czcionek, która jest zaufana dzięki sprawdzeniu uprawnień signature|privileged. FontUpdater komunikuje się z FontManagerService, aby pobierać, instalować, usuwać lub aktualizować bieżące ustawienia czcionek systemowych. FontUpdater może przekazywać nowe treści plików czcionek za pomocą mechanizmów komunikacji międzyprocesowej (IPC). FontManagerService zapisuje treści w lokalizacji pamięci dostępnej do odczytu dla wszystkich, np. w plikach /data/fonts. Ta pamięć jest chroniona. Zapisywać w niej może FontManagerService tylko za pomocą zasad SELinux.

Gdy uruchamia się klasa Application, przekazuje ona ustawienia czcionek systemowych jako argumenty metody bindApplication, a następnie inicjuje ustawienia czcionek 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 oraz dodatkowy atrybut supportedAxes. Atrybut supportedAxes to rozdzielona przecinkami lista obsługiwanych tagów osi. W Androidzie 15 można określić tylko osie wght i ital.

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

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

Programiści mogą używać interfejsu android.graphics.fonts.SystemFonts#getAvailableFonts Java API lub interfejsu ASystemFontIterator_open 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 OpenType Variable Font API i buildVariableFamily.

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 emotikon na urządzeniach. Producenci OEM, którzy nie modyfikują ani nie aktualizują plików czcionek emotikon, 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 nie usuwaj go z pliku /frameworks/base/data/fonts/fonts.xml. Pamiętaj o tych 3 sposobach dostosowywania czcionek:

  1. Zastąp plik NotoColorEmoji.ttf czcionką emotikon z logo producenta OEM.
  2. Zmodyfikuj plik NotoColorEmoji.ttf pod kątem potrzeb lokalnego rynku.
  3. Zastąp lub zmodyfikuj inne pliki czcionek.

Jeśli nie modyfikujesz czcionek emotikon w AOSP, nie musisz podejmować żadnych działań. Jeśli chcesz dostosować czcionki emotikon, postępuj zgodnie z instrukcjami w kolejnych sekcjach.

Zastępowanie pliku NotoColorEmoji.ttf czcionkami emotikon z logo producenta OEM

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

  1. Umieść własną czcionkę o nazwie OEMCustomEmoji.ttf w partycji /system.
  2. Zmodyfikuj plik /frameworks/base/data/fonts/fonts.xml (oraz /frameworks/base/data/fonts/font-fallback.xml w Androidzie 15 i nowszych wersjach) 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ć czcionkę do potrzeb lokalnego rynku:

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

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

  • W tej czcionce umieść tylko niezbędne glify.
  • Przekaż niezmienione glify do oryginalnego pliku NotoColorEmoji.ttf, aby urządzenia otrzymywały poprawki projektowe wprowadzone w przyszłych wersjach emotikon.

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

Używanie flagi regionalnej: jeśli docelowy glif jest flagą regionalną, określ identyfikator glifu jako nieznany kod kraju. (Użyj country code = "ZZ").

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

Zastępowanie lub modyfikowanie innych plików czcionek

Aby zastąpić lub zmodyfikować inne czcionki, dostosowanie jest podobne do modyfikowania plików TTF pod kątem potrzeb lokalnego rynku. 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. Dotyczy to plików czcionek, które zostały zmodyfikowane na podstawie oryginalnych czcionek w AOSP.

Chociaż aktualizacje czcionek są przeprowadzane przez Google w GMS Core, ogólny mechanizm aktualizacji czcionek jest otwarty dla wszystkich producentów OEM. Producenci OEM mogą instalować dodatkowe aktualizatory czcionek, wykonując czynności opisane w sekcjach Spełnianie wymagań wstępnych, Podpisywanie plików czcionek, i Wprowadzanie 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 fs-verity, i umieść na nim certyfikat.

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ć zgodny z fs-verity.

Wprowadzanie aktualizacji czcionek w czasie działania

Aktualizacje czcionek przeprowadza aplikacja systemowa FontManager. Aplikacja FontManager udostępnia najnowszy stan zainstalowanych czcionek systemowych oraz możliwość aktualizowania plików czcionek za pomocą podpisów. Aby wywoływać aktualizacje aplikacji, dodaj uprawnienie UPDATE_FONT signature|privileged do listy dozwolonych aplikacji, i do pliku manifestu.

Przyznaj uprawnienie UPDATE_FONT signature|privileged funkcji aktualizatora aplikacji.