В 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
; затем он инициализирует настройки шрифта для использования процессом приложения.
Реализация пользовательских шрифтов
Некоторые OEM-производители устанавливают или заменяют файлы шрифтов в AOSP, чтобы показать свои бренды. Android 12 поддерживает эту функцию, но добавляет требования для обновления шрифтов эмодзи на устройствах. OEM-производителям, которые не изменяют и не обновляют файлы шрифтов эмодзи, не нужно использовать эту функцию.
Google обновляет файлы шрифтов, особенно файлы NotoColorEmoji
, через GMS Core, поэтому не изменяйте и не удаляйте файл NotoColorEmoji.ttf
из раздела /system
и не удаляйте его из /system/etc/fonts.xml
. Обратите внимание на следующие три способа настройки шрифтов:
- Замените файл
NotoColorEmoji.ttf
шрифтом эмодзи OEM. - Измените файл
NotoColorEmoji.ttf
в соответствии с потребностями местного рынка. - Замените или измените другие файлы шрифтов.
Если вы не изменяете шрифты эмодзи в AOSP, вам не нужно предпринимать никаких действий. Если вы хотите настроить шрифты эмодзи, воспользуйтесь инструкциями в следующих разделах.
Замена NotoColorEmoji.ttf фирменными шрифтами эмодзи OEM
Чтобы заменить файл NotoColorEmoji.ttf
файлом шрифтов эмодзи OEM-бренда, поместите шрифт эмодзи непосредственно перед резервной цепочкой шрифтов:
- Поместите свой собственный шрифт
OEMCustomEmoji.ttf
в раздел/system
. Измените
/system/etc/fonts.xml
, как показано в следующем коде:<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 измененный глиф, поддерживаемый Modified\NotoColorEmoji.ttf
, отображается вместо исходного NotoColorEmoji.ttf
. Google рекомендует следующее:
- Имейте только необходимый глиф в этом шрифте.
- Делегируйте неизмененные глифы в исходный файл
NotoColorEmoji.ttf
, чтобы ваши устройства получали все исправления дизайна, сделанные в будущих выпусках эмодзи.
Удаление глифов. Чтобы удалить глифы из файла NotoColorEmoji.ttf
, выполните шаги 1 и 2 и укажите glyph ID = 0
в вашей cmap.
Использовать региональный флаг: если целевой глиф является региональным флагом, укажите идентификатор глифа как неизвестный код страны. (Используйте country code = "ZZ"
.)
Создайте глиф тофу: вы можете явно указать идентификатор глифа тофу, если хотите его использовать. Когда вы указываете glyphID = 0
, связанное приложение интерпретирует это как «глиф недоступен». Например, при использовании этого атрибута приложение Paint#hasGlyph
возвращает значение false
.
Замените или измените другие файлы шрифтов
Чтобы заменить или изменить другие шрифты, настройка аналогична настройке файлов tff
для нужд местного рынка. Неизвестные файлы шрифтов, которые обновляются в AOSP во время выполнения, игнорируются и не обновляются. Google игнорирует неизвестные шрифты на вашем устройстве. Сюда входят файлы шрифтов, которые были изменены по сравнению с исходными шрифтами в AOSP.
Хотя обновления шрифтов выполняются Google в GMS Core, общий механизм обновления шрифтов открыт для всех OEM-производителей. OEM-производители могут установить дополнительные средства обновления шрифтов, выполнив действия, описанные в разделах Требования к выполнению требований , Подписание файлов шрифтов и Создание обновлений шрифтов во время выполнения .
Соблюдение предварительных условий
Механизм обновления шрифтов использует функцию ядра Linux fs-verity
. Убедитесь, что ваше устройство совместимо с fs-verity
и включите сертификат в свое устройство.
Подписание файлов шрифтов
Поскольку файлы шрифтов являются рискованными ресурсами, они должны быть проверены с помощью доверенных ключей. Внимательно просмотрите все файлы шрифтов, которые необходимо обновить, и подпишите их своим закрытым ключом. Подпись должна быть совместима с fs-verity
.
Выполнение обновлений шрифтов во время выполнения
Системное приложение FontManger
выполняет обновления шрифтов. Приложение FontManager
предоставляет статус последнего установленного системного шрифта и возможность обновлять файлы шрифтов с помощью подписей. Чтобы вызывать приложения обновления, добавьте UPDATE_FONT signature|privileged
разрешение в список разрешенных приложений и в манифест .
Предоставьте UPDATE_FONT signature|privileged
разрешение функции обновления вашего приложения.