В 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 разрешение функции обновления вашего приложения.
