在 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 会通过 GMS Core 更新字体文件,尤其是NotoColorEmoji
文件,因此请勿从/system
分区修改或删除NotoColorEmoji.ttf
文件,也不要将其从/system/etc/fonts.xml
中删除。请注意以下三种自定义字体的方法:
- 将
NotoColorEmoji.ttf
文件替换为 OEM 品牌的表情符号字体。 - 根据您当地的市场需求修改
NotoColorEmoji.ttf
文件。 - 替换或修改其他字体文件。
如果您没有在 AOSP 中修改表情符号字体,则无需采取任何措施。如果要自定义表情符号字体,请使用以下部分中的说明。
用 OEM 品牌的表情符号字体替换 NotoColorEmoji.ttf
要将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
。谷歌建议如下:
- 仅在此字体中具有必要的字形。
- 将未修改的字形委托给原始
NotoColorEmoji.ttf
文件,以便您的设备接收在未来表情符号版本中所做的任何设计修复。
删除字形:要从NotoColorEmoji.ttf
文件中删除字形,请按照步骤 1 和 2,并在 cmap 中指定glyph ID = 0
。
使用区旗:如果目标字形是区旗,则将字形 ID 指定为未知国家代码。 (使用country code = "ZZ"
。)
制作豆腐字形:如果要使用豆腐字形 ID,可以显式指定。当您指定glyphID = 0
时,相关应用程序会将其解释为“字形不可用”。例如,当您使用此属性时, Paint#hasGlyph
应用程序会返回false
。
替换或修改其他字体文件
替换或修改其他字体的自定义方式与根据当地市场需求修改tff
文件类似。运行时在 AOSP 中更新的未知字体文件将被忽略,并且不会更新。 Google 会忽略您设备中的未知字体。这包括从 AOSP 中的原始字体修改的字体文件。
尽管 GMS Core 中的字体更新由 Google 完成,但一般字体更新机制对所有 OEM 都是开放的。 OEM 可以使用满足先决条件、签署字体文件和进行运行时字体更新中的步骤安装其他字体更新程序。
满足先决条件
字体更新机制使用fs-verity
Linux 内核特性。验证您的设备是否符合fs-verity
标准并将证书包含在您的设备中。
签署字体文件
由于字体文件是有风险的资源,因此必须使用受信任的密钥对其进行验证。仔细检查所有要更新的字体文件,并使用您的私钥签名。签名必须与fs-verity
兼容。
进行运行时字体更新
FontManger
System 应用程序执行字体更新。 FontManager
应用程序提供最新安装的系统字体状态以及使用签名更新字体文件的能力。要调用更新应用程序,请将UPDATE_FONT signature|privileged
权限添加到您的应用程序许可名单和清单中。
为您的应用的更新程序功能提供UPDATE_FONT signature|privileged
。