Chazeon Talk

Android N 升级与 CJK 字体

Android N 发布已经一月有余,今天终于升级换上。用了一天,一切顺利,此前预览版中的问题没有碰到,就我而言已经可以当作主力系统使用。截至发稿时,适用于 Android N 的 SuperSU 刷机包已经释出,TWRP Recovery 也已可用。

本次升级最令人开心的一点,就是在初次启动进行初次设定的过程中,允许不联网进行设置了。这就免除了此前由于大陆网络原因无法连接 Google 的服务器,不拔卡或连上 Wi-Fi 后会卡在 Google 账户登录步骤上的问题。虽然并不是常用的功能,但的确免除了太多的麻烦,是我最喜欢的细节了。

其他关于 Android N 中与前代 Android 的各项差异,已经有无数的文章加以赘述,在此不再赘述。本文主要讨论一下关于内置中日韩字体 Noto Sans 的最新状况与个人根据需求的改进。

内置中日韩字体 Noto Sans CJK 方式的改变

从 Android L 开始,随着思源黑体(Source Han Sans)的发布,Android 便开始使用 Noto CJK 作为随机中日韩字体。

为了适配不同的使用需求,Noto Sans 很早就在自己的 Github 仓库中释出了采用不同打包方式的多个版本,具体信息可参见 Noto Sans CJK 的版本的介绍和选择指导。在 Android N 以前的系统中,随机附带的字体均为「Region specific OTF subsets」,而 Android N 开始,采用了「CJK OTC fonts (Thin, Light, DemiLight, Regular, Medium, Bold, Black)」的模式。如果从字体文件名上来看,就是从

NotoSans{JP, KR, SC, TC}-[weight].otf

变成了

NotoSansCJK-[weight].ttc

而没变的是,随机附带的仅有 Regular 字重。不过日文、韩文、正体中文、简体中文被打包在一起。

当然,相应的配置文件(仍是位于 /system/etc/font.xml)也发生了变化,关于中日韩字体的描述部分由类似

<family lang="zh-Hans">
    <font weight="400" style="normal">NotoSansSC-Regular.otf</font>
</family>

变成了

<family lang="zh-Hans">
    <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font>
</family>

这样的形式,可以看到为了支持 OTC(OpenType Collection,后缀为 .ttc)而而增加的 index 属性。

一如往常,若是需要增加相应的字体的话,只需将字体文件拷贝到 /system/fonts/ 目录下,并在配置文件相应的行即可。具体可参见附录部分。

另外,拷贝之后需要格外注意的一点,拷贝过去的字体的文件的的权限需要为 -rw-r--r--(644),否则系统可能不能正常读取这些字体。

比较难过的是系统等宽字体默认还在使用 Droid Sans Mono,我还是手动把他们替换成 Roboto Mono 了(Github)。

虽然能够手动操作,但默认中日韩字体只采用单一字重、仍然没有用上「CJK OTF fonts with different default language」还是挺令人难过的,但对于 OTC 方式的支持,而且介绍页面有了它们的下载链接,不再需要去仓库里一大堆文件总还是方便了一些的。

附录:个人配置文件需要修改的部分

Noto Sans CJK 的多字重支持(采用「CJK OTC fonts」)

    <family lang="zh-Hant">
        <font weight="100" style="normal" index="3">NotoSansCJK-Thin.ttc</font>
        <font weight="300" style="normal" index="3">NotoSansCJK-Light.ttc</font>
        <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font>
        <font weight="500" style="normal" index="3">NotoSansCJK-Medium.ttc</font>
        <font weight="700" style="normal" index="3">NotoSansCJK-Bold.ttc</font>
        <font weight="900" style="normal" index="3">NotoSansCJK-Black.ttc</font>
    </family>
    <family lang="ja">
        <font weight="100" style="normal" index="0">NotoSansCJK-Thin.ttc</font>
        <font weight="300" style="normal" index="0">NotoSansCJK-Light.ttc</font>
        <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font>
        <font weight="500" style="normal" index="0">NotoSansCJK-Medium.ttc</font>
        <font weight="700" style="normal" index="0">NotoSansCJK-Bold.ttc</font>
        <font weight="900" style="normal" index="0">NotoSansCJK-Black.ttc</font>
    </family>
    <family lang="ko">
        <font weight="100" style="normal" index="1">NotoSansCJK-Thin.ttc</font>
        <font weight="300" style="normal" index="1">NotoSansCJK-Light.ttc</font>
        <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
        <font weight="500" style="normal" index="1">NotoSansCJK-Medium.ttc</font>
        <font weight="700" style="normal" index="1">NotoSansCJK-Bold.ttc</font>
        <font weight="900" style="normal" index="1">NotoSansCJK-Black.ttc</font>
        <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
    </family>

Roboto Mono 的添加

    <family name="monospace">
        <font weight="100" style="normal">RobotoMono-Thin.ttf</font>
        <font weight="100" style="italic">RobotoMono-ThinItalic.ttf</font>
        <font weight="300" style="normal">RobotoMono-Light.ttf</font>
        <font weight="300" style="italic">RobotoMono-LightItalic.ttf</font>
        <font weight="400" style="normal">RobotoMono-Regular.ttf</font>
        <font weight="400" style="italic">RobotoMono-Italic.ttf</font>
        <font weight="500" style="normal">RobotoMono-Medium.ttf</font>
        <font weight="500" style="italic">RobotoMono-MediumItalic.ttf</font>
        <font weight="700" style="normal">RobotoMono-Bold.ttf</font>
        <font weight="700" style="italic">RobotoMono-BoldItalic.ttf</font>
    </family>