Реализация резервного варианта пользовательского шрифта

В 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 . Обратите внимание на следующие три способа настройки шрифтов:

  1. Замените файл NotoColorEmoji.ttf шрифтом эмодзи OEM.
  2. Измените файл NotoColorEmoji.ttf в соответствии с потребностями местного рынка.
  3. Замените или измените другие файлы шрифтов.

Если вы не изменяете шрифты эмодзи в AOSP, вам не нужно предпринимать никаких действий. Если вы хотите настроить шрифты эмодзи, воспользуйтесь инструкциями в следующих разделах.

Замена NotoColorEmoji.ttf фирменными шрифтами эмодзи OEM

Чтобы заменить файл NotoColorEmoji.ttf файлом шрифтов эмодзи OEM-бренда, поместите шрифт эмодзи непосредственно перед резервной цепочкой шрифтов:

  1. Поместите свой собственный шрифт OEMCustomEmoji.ttf в раздел /system .
  2. Измените /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 для нужд местного рынка

Выполните следующие действия для настройки в соответствии с потребностями местного рынка:

  1. Создайте свой собственный файл NotoColorEmoji с другим именем; например, назовите его Modified\_NotoColorEmoji.ttf .
  2. Поместите его перед исходным файлом 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 разрешение функции обновления вашего приложения.