Начиная с Android 15, вариативные шрифты отображаются во время выполнения с большей эффективностью и детализацией. С этим обновлением разработчикам необходимо добавлять новые конфигурации вариативных шрифтов в файл font_fallback.xml вместо fonts.xml , поскольку fonts.xml устаревает. Дополнительную информацию см. в разделе «Поддержка вариативных шрифтов» .
В Android 11 и более ранних версиях обновление установленных на устройстве файлов шрифтов в AOSP (в разделе /system/fonts ) или в разделах производителя (в разделах /product/fonts или /system/fonts ) требует обновления системы от OEM-производителя. Это требование существенно влияет на совместимость эмодзи. В Android 12 можно использовать системную службу FontManager для управления установленными файлами шрифтов и обновления установленных на устройстве файлов шрифтов без обновления системы.
В Android 12 реализовано три взаимодействия между процессами: FontManagerService , Font Updater и Application .
FontManagerService — это центральная система управления на системном сервере. FontManagerService хранит последние настройки системных шрифтов для каждого пользователя.
FontUpdater — это подключаемый модуль обновления шрифтов, которому доверяет проверка signature|privileged прав доступа. FontUpdater взаимодействует с FontManagerService для получения, установки, удаления или обновления текущих системных настроек шрифтов. FontUpdater может передавать содержимое новых файлов шрифтов посредством механизмов межпроцессного взаимодействия (IPC). FontManagerService сохраняет содержимое в доступном для чтения всем пользователям хранилище, например, в /data/fonts . Это хранилище защищено. Запись в него может осуществляться только FontManagerService в соответствии с политикой SELinux.
При запуске класса Application он передает системные настройки шрифтов в качестве аргументов методу bindApplication ; затем он инициализирует настройки шрифтов для использования процессом приложения.
Поддержка вариативных шрифтов
Начиная с Android 15, параметры шрифтов задаются в font_fallback.xml в следующем формате:
<family lang="und-Ethi" supportedAxes="wght,ital">
<font>NotoSansEthiopic-VF.ttf</font>
</family>
В этом формате вариативный шрифт обладает всеми атрибутами статического шрифта, а также дополнительным атрибутом supportedAxes . Атрибут supportedAxes представляет собой список поддерживаемых тегов осей, разделенных запятыми. В Android 15 можно указать только оси wght и ital .
Если атрибут supportedAxes не указан, узел font работает как статический шрифт, представляющий собой единственный экземпляр вариативного шрифта, заданного с помощью дочерних элементов axis .
Если указан атрибут supportedAxes , система динамически создает экземпляр шрифта для заданных значений толщины и стиля во время выполнения.
Разработчики могут использовать Java-API android.graphics.fonts.SystemFonts#getAvailableFonts или API NDK ASystemFontIterator_open для получения списка установленных в системе файлов шрифтов. Информацию об API для разработчиков, поддерживающих это обновление, см. в разделах Improved OpenType Variable Font API и buildVariableFamily .
Настроить шрифты
Некоторые производители устанавливают или заменяют файлы шрифтов в AOSP, чтобы отображать свои бренды. Android 12 поддерживает эту функциональность, но добавляет требования к обновлению шрифтов эмодзи на устройствах. Производителям, которые не изменяют и не обновляют файлы шрифтов эмодзи, эта функция не нужна.
Google обновляет файлы шрифтов, особенно файлы NotoColorEmoji , через GMS Core, поэтому не изменяйте и не удаляйте файл NotoColorEmoji.ttf из раздела /system и не удаляйте его из /frameworks/base/data/fonts/fonts.xml . Обратите внимание на следующие три способа настройки шрифтов:
- Замените файл
NotoColorEmoji.ttfшрифтом эмодзи от производителя оборудования. - Измените файл
NotoColorEmoji.ttfв соответствии с потребностями вашего местного рынка. - Замените или измените другие файлы шрифтов.
Если вы не изменяете шрифты эмодзи в AOSP, вам ничего не нужно делать. Если вы хотите настроить шрифты эмодзи, воспользуйтесь инструкциями в следующих разделах.
Замените файл NotoColorEmoji.ttf на фирменные шрифты эмодзи от производителя.
Чтобы заменить файл NotoColorEmoji.ttf файлом шрифтов эмодзи, предоставленным производителем оборудования, поместите шрифт эмодзи непосредственно перед цепочкой резервных шрифтов:
- Поместите свой собственный шрифт под названием
OEMCustomEmoji.ttfв раздел/system. Измените файл
/frameworks/base/data/fonts/fonts.xml(и/frameworks/base/data/fonts/font-fallback.xmlв Android 15 и выше) следующим образом:<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>
Измените файл NotoColorEmoji.ttf в соответствии с потребностями местного рынка.
Выполните следующие шаги, чтобы адаптировать программу под потребности вашего местного рынка:
- Создайте собственный файл
NotoColorEmojiс другим именем; например, назовите егоModified\_NotoColorEmoji.ttf. - Разместите его перед исходным файлом
NotoColorEmoji.ttf.
После выполнения шага 2 вместо оригинального NotoColorEmoji.ttf будет отображаться измененный глиф, поддерживаемый файлом Modified\NotoColorEmoji.ttf . Google рекомендует следующее:
- В этом шрифте должны присутствовать только необходимые символы.
- Перенаправьте неизмененные глифы в исходный файл
NotoColorEmoji.ttf, чтобы ваши устройства получали все исправления дизайна, внесенные в будущих версиях эмодзи.
Удаление глифов: Чтобы удалить глифы из файла NotoColorEmoji.ttf , выполните шаги 1 и 2 и укажите glyph ID = 0 в вашей cmap.
Используйте региональный флаг: если целевой глиф является региональным флагом, укажите идентификатор глифа в виде неизвестного кода страны. (Используйте country code = "ZZ" .)
Создайте глиф тофу: вы можете явно указать идентификатор глифа тофу, если хотите его использовать. Когда вы указываете glyphID = 0 , соответствующее приложение интерпретирует это как «глиф недоступен». Например, при использовании этого атрибута приложение Paint#hasGlyph возвращает false .
Замените или измените другие файлы шрифтов.
Для замены или изменения других шрифтов настройка аналогична изменению файлов TTF под нужды местного рынка. Неизвестные файлы шрифтов, обновляемые в AOSP во время выполнения, игнорируются и не обновляются. Google игнорирует неизвестные шрифты на вашем устройстве. Это включает в себя файлы шрифтов, которые были изменены по сравнению с оригинальными шрифтами в AOSP.
Хотя обновления шрифтов выполняются компанией Google в GMS Core, общий механизм обновления шрифтов открыт для всех OEM-производителей. OEM-производители могут установить дополнительные средства обновления шрифтов, следуя инструкциям в разделах «Выполнение предварительных условий» , «Подписание файлов шрифтов» и «Внесение обновлений шрифтов во время выполнения» .
Соответствовать предварительным требованиям
Механизм обновления шрифтов использует функцию ядра Linux fs-verity . Убедитесь, что ваше устройство соответствует стандарту fs-verity , и включите сертификат в ваше устройство.
файлы шрифтов для вывесок
Поскольку файлы шрифтов представляют собой рискованные ресурсы, их необходимо проверять с помощью доверенных ключей. Тщательно проверьте все файлы шрифтов, которые необходимо обновить, и подпишите их своим закрытым ключом. Подпись должна быть совместима с fs-verity .
Вносите изменения в шрифты во время выполнения.
Системное приложение FontManager выполняет обновление шрифтов. Приложение FontManager предоставляет актуальную информацию о состоянии установленных системных шрифтов и позволяет обновлять файлы шрифтов с помощью цифровых подписей. Для вызова приложений обновления добавьте разрешение UPDATE_FONT signature|privileged в список разрешенных приложений и в манифест .
Предоставьте функции обновления вашего приложения разрешение UPDATE_FONT signature|privileged .