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

Начиная с 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 , система динамически создает экземпляр шрифта для заданного веса и стиля во время выполнения.

Разработчики могут использовать API Java android.graphics.fonts.SystemFonts#getAvailableFonts или API ASystemFontIterator_open NDK, чтобы получить список файлов шрифтов, установленных в системе. Информацию об API-интерфейсах разработчиков, поддерживающих это обновление, см. в разделах «Улучшенный API шрифтов переменных OpenType» и buildVariableFamily .

Настройка шрифтов

Некоторые OEM-производители устанавливают или заменяют файлы шрифтов в AOSP, чтобы показать свои бренды. Android 12 поддерживает эту функцию, но добавляет требования по обновлению шрифтов эмодзи на устройствах. OEM-производителям, которые не изменяют и не обновляют файлы шрифтов Emoji, не нужно использовать эту функцию.

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