Wdrażanie czcionek niestandardowych

Począwszy od Androida 15 zmienne fonty są renderowane w czasie wykonywania z większą wydajnością i precyzją. W ramach tej aktualizacji dostawcy muszą dodać 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 aktualizacja plików czcionek zainstalowanych na urządzeniu w AOSP (na partycji /system/fonts) lub na partycjach dostawcy (na partycjach /product/fonts lub /system/fonts) wymaga aktualizacji systemu przez OEM. To wymaganie ma znaczący wpływ na zgodność emotikonów. W Androidzie 12 możesz korzystać z usługi systemowej FontManager, aby zarządzać zainstalowanymi plikami czcionek i aktualizować zainstalowane na urządzeniu pliki czcionek bez aktualizacji systemu.

Android 12 umożliwia 3 interakcje z procesem: FontManagerService, Font UpdaterApplication.

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

FontUpdater to wtyczka do aktualizowania czcionek, której zaufała funkcja sprawdzania uprawnień signature|privileged. FontUpdater komunikuje się z FontManagerService, aby pobierać, instalować, usuwać lub aktualizować bieżące ustawienia czcionek systemowych. FontUpdater może przekazywać zawartość nowego pliku czcionki za pomocą mechanizmów komunikacji między procesami (IPC). FontManagerService zapisuje zawartość w dostępnej na świecie lokalizacji pamięci, np. w plikach /data/fonts. Ten magazyn jest strzeżony. Może być napisany tylko przez FontManagerService w ramach zasad SELinux.

Gdy uruchamiana jest klasa Application, przekazuje ona 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 zmiennych czcionek są określone w font_fallback.xmlw 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 lista rozdzielona przecinkami zawierających obsługiwane tagi 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 czcionka statyczna 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 danej wartości grubości i stylu w czasie wykonywania.

Aby uzyskać listę zainstalowanych w systemie plików czcionek, deweloperzy mogą użyć interfejsu android.graphics.fonts.SystemFonts#getAvailableFonts Java API lub interfejsu ASystemFontIterator_open NDK API. 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 wymaga, aby czcionki emotikonów były aktualizowane na urządzeniach. Producenci OEM, którzy nie modyfikują ani nie aktualizują plików czcionek emotikonów, 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 folderu /frameworks/base/data/fonts/fonts.xml. Poniżej znajdziesz 3 sposoby dostosowywania czcionek:

  1. Zastąp plik NotoColorEmoji.ttf czcionką emotikonów marki OEM.
  2. Zmodyfikuj plik NotoColorEmoji.ttf, aby odpowiadał wymaganiom lokalnego rynku.
  3. Zastępowanie lub modyfikowanie innych plików czcionek.

Jeśli nie modyfikujesz czcionek emotikonów w AOSP, nie musisz nic robić. Jeśli chcesz dostosować czcionki emotikonów, skorzystaj z instrukcji podanych w następnych sekcjach.

Zastąp plik NotoColorEmoji.ttf czcionkami emotikonów marki OEM

Aby zastąpić plik NotoColorEmoji.ttf plikiem czcionek emotikonów marki OEM, umieść czcionkę emotikonów tuż przed łańcuchem czcionek:

  1. Umieść własną czcionkę o nazwie OEMCustomEmoji.ttf na partycji /system.
  2. Zmodyfikuj /frameworks/base/data/fonts/fonts.xml (oraz /frameworks/base/data/fonts/font-fallback.xml w przypadku Androida 15 i nowszych wersji) w ten sposób:

    <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ć reklamy do potrzeb lokalnego rynku:

  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 zamiast oryginalnego NotoColorEmoji.ttf będzie widoczny zmodyfikowany glif obsługiwany przez Modified\NotoColorEmoji.ttf. Google zaleca:

  • zawierać tylko potrzebne znaki w danej czcionce.
  • Przypisz niezmodyfikowane glify do oryginalnego pliku NotoColorEmoji.ttf, aby Twoje urządzenia otrzymywały wszelkie poprawki w projektach wprowadzone w przyszłych wersjach emotikonów.

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

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

Utwórz glif tofu: jeśli chcesz użyć glifu tofu, możesz podać jego identyfikator. Jeśli podasz wartość glyphID = 0, powiązana aplikacja zinterpretuje to jako „glif jest niedostępny”. Jeśli na przykład 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, użyj opcji dostosowywania podobnych do tych, które służą do modyfikowania plików TTF pod kątem potrzeb lokalnego rynku. Nieznane pliki czcionek, które są aktualizowane w AOSP w czasie wykonywania, są ignorowane i nie są aktualizowane. Google ignoruje nieznane czcionki na urządzeniu. Obejmuje to pliki 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 dostępny dla wszystkich producentów OEM. Producenci OEM mogą instalować dodatkowe moduły aktualizacji czcionek, wykonując czynności opisane w artykułach Wymagania wstępne, Podpisywanie plików czcionekAktualizowanie czcionek w czasie działania.

Spełnij wymagania wstępne.

Mechanizm aktualizacji czcionek korzysta z funkcji fs-verity jądra Linuksa. Sprawdź, czy Twoje urządzenie jest zgodne z fs-verity, i załącz certyfikat na urządzeniu.

Podpisywanie plików czcionek

Ponieważ pliki czcionek są zasobami obarczonymi ryzykiem, muszą zostać zweryfikowane za pomocą zaufanych kluczy. Uważnie przejrzyj wszystkie pliki czcionek, które mają zostać zaktualizowane, i podpisz je swoim kluczem prywatnym. Podpis musi być zgodny z fs-verity.

Aktualizowanie czcionek w czasie działania

Aplikacja systemowa FontManager wykonuje aktualizacje czcionek. Aplikacja FontManager zapewnia najnowszy stan zainstalowanej czcionki systemowej oraz możliwość aktualizowania plików czcionek z podpisami. Aby wywołać funkcję aktualizacji aplikacji, dodaj uprawnienie UPDATE_FONT signature|privileged do listy dozwolonych aplikacjido pliku manifestu.

Przyznaj uprawnienie UPDATE_FONT signature|privileged funkcji aktualizowania aplikacji.