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

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

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

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

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

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

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

Чтобы настроить продукт под нужды вашего местного рынка, выполните следующие действия:

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