Начиная с 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
, система динамически создает экземпляр шрифта для заданного значения насыщенности и стиля во время выполнения.
Разработчики могут использовать android.graphics.fonts.SystemFonts#getAvailableFonts
Java API или ASystemFontIterator_open
NDK API для получения списка установленных в системе файлов шрифтов. Информацию об API разработчиков, которые поддерживают это обновление, см. в Improved OpenType Variable Font API и buildVariableFamily
.
Настроить шрифты
Некоторые OEM-производители устанавливают или заменяют файлы шрифтов в AOSP, чтобы показать свои бренды. Android 12 поддерживает эту функцию, но добавляет требования для обновления шрифтов эмодзи на устройствах. OEM-производителям, которые не изменяют и не обновляют файлы шрифтов эмодзи, не нужно использовать эту функцию.
Google обновляет файлы шрифтов, особенно файлы NotoColorEmoji
через GMS Core, поэтому не изменяйте и не удаляйте файл NotoColorEmoji.ttf
из раздела /system
и не удаляйте его из /frameworks/base/data/fonts/fonts.xml
. Обратите внимание на следующие три способа настройки шрифтов:
- Замените файл
NotoColorEmoji.ttf
шрифтом эмодзи от OEM-производителя. - Измените файл
NotoColorEmoji.ttf
в соответствии с потребностями вашего локального рынка. - Замените или измените другие файлы шрифтов.
Если вы не изменяете шрифты эмодзи в AOSP, вам не нужно предпринимать никаких действий. Если вы хотите настроить шрифты эмодзи, воспользуйтесь инструкциями в следующих разделах.
Замените NotoColorEmoji.ttf шрифтами эмодзи OEM-бренда
Чтобы заменить файл NotoColorEmoji.ttf
файлом шрифтов эмодзи вашего OEM-производителя, поместите шрифт эмодзи непосредственно перед цепочкой резервных шрифтов:
- Поместите свой собственный шрифт, называемый
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
разрешение для функции обновления вашего приложения.