今天拖了份 Android 5.0 的正式版镜像回来拆开看了看,发现 Noto Sans CJK 正式成为 Android 5.0 的 CJK fallback 字体,比较可惜的是只有 Regular 一个字重。于是自己折腾一套 Regular & Bold 两套字重的来用,分享一下折腾的过程,也算给自己写个备忘。我会尽量写的详细,避免有同样需求的同学走弯路。有什么问题可以在下面跟帖提问,能回答的我会尽量回答。要修改系统分区肯定先得 Root,这个我就不说了。刚开始我选取的是 Noto Sans CJK 1.001,但是实际把 NotoSansCJKsc-Regular.otf 放到手机上用了一下发现很多字莫名失踪,装在 Win 7 里用没发现有这个问题,谁知道是什么原因麻烦告诉我一下。于是改用 Adobe 发布的版本 Source Han Sans 1.001
我曾经自己拖了一份源码回来编译,由于一些众所周知的原因我国网络拖源码是一种极其痛苦的事情……经历几次失败终于拖回来,这次不想在这么麻烦了。查了一下发现 ttx 可以很方便的提取 OpenType 字体的全部/指定表并重新编译回去,在 Adobe 提供的字体开发套件 AFDKO 中有包含。
准备工作
思源黑体 (Source Han Sans)
下载好后解压,我只用到了其中 6 个字体(注意目录加粗的部分):
source-han-sans-1.001R\SubsetOTF\CN\SourceHanSansCN-Regular.otf
source-han-sans-1.001R\SubsetOTF\CN\SourceHanSansCN-Bold.otf
source-han-sans-1.001R\SubsetOTF\TW\SourceHanSansTW-Regular.otf
source-han-sans-1.001R\SubsetOTF\TW\SourceHanSansTW-Bold.otf
source-han-sans-1.001R\SubsetOTF\JP\SourceHanSansJP-Regular.otf
source-han-sans-1.001R\SubsetOTF\JP\SourceHanSansJP-Bold.otf
(因为很重要所以重复了 6 遍)
分别对应我平时用得到的简、繁体中文和日文。
韩文自己用不上所以就忽略了,说实话现在韩国日常中有出现汉字的地方么?
Adobe Font Development Kit for OpenType (AFDKO)
下载好后解压到任意不含空格不含中文的目录,比如我放在 C:\PortableApps\FDK
右键点击 FinishInstallWindows.cmd 以管理员身份运行设置环境变量,之后注销重新登录或者重启电脑生效。
Regular 字重的处理(以 SourceHanSansCN-Regular.otf 做例子,繁体中文和日文相同)
Regular 字重处理起来是比较简单的,只需要修改 name 表去掉多余的 Regular 即可。注意不是所有的 Regular 都是多余的!
1. 在解压好字体的目录打开命令提示符窗口(按住 shift 右键点击空白位置,在此处打开命令窗口)
2. 用 ttx 把要修改的 name 表提取出来:
[ ttx -t name SourceHanSansCN-Regular.otf ](命令不含外侧方括号,下同)
得到一个 SourceHanSansCN-Regular.ttx 文件,这是个纯文本的 XML,可以用文本编辑器打开(我个人用 Notepad2-Mod)
3. 多余的 Regular 有三处,每处都紧跟着一个独立的 Regular,其他的不要删多了。修改好之后保存。
即删去「nameID="1"」项内的 Regular,保留其他项内的 Regular。
4. 再用 ttx 把修改好的 name 表合并进去:
[ md output ](ttx 要求指定输出的目录必须先存在)
[ ttx -d output -m SourceHanSansCN-Regular.otf SourceHanSansCN-Regular.ttx ]
注意 .otf 在前 .ttx 在后
5. 在 output 文件夹下得到 SourceHanSansCN-Regular.otf,这就是我们修改好的字体了。
Bold 字重的处理(以 SourceHanSansCN-Bold.otf 做例子,繁体中文和日文相同)
Bold 字重一开始我也是只处理了 name 表,发现是不够的,依然存在默认显示粗体的问题,继续研究发现还需要修改 head 表和 OS/2 表。
1. 用 ttx 把要修改的 name 表,head 表以及 OS/2 表提取出来:
[ ttx -t name -t head -t OS/2 SourceHanSansCN-Bold.otf ]
注意 OS/2 要大写
2. 打开 ttx 文件,编辑 name 表,将 Regular 修改为 Bold 并删除多余的 Bold。
Bold 字重修改起来比 Regular 字重容易多了。只要搜索“Regular”,一共会找到三处,把它们统统改成 Bold 并把上一项中的 Bold 删去即可。
即删去「nameID="1"」项内的 Bold,保留其他项内的 Bold。
3. 向下滚动,编辑 head 表,将其中 macStyle 一项的第二组最后一位修改为 1,即:
原内容:<macStyle value="00000000 00000000"/>
修改为:<macStyle value="00000000 00000001"/>
4. 继续向下滚动,编辑 OS/2 表,将其中 fsSelection 一项的
第二组第三位(代表 BOLD,对应上面的 macStyle 最后一位)修改为 1,
同时将第二组第二位(代表 REGULAR,无 macStyle 对应项)修改为 0,即:
原内容:<fsSelection value="00000001 10000000"/>
修改为:<fsSelection value="00000001 10100000"/>
5. 至此 ttx 编辑完毕,保存文件并合并进字体:
[ ttx -d output -m SourceHanSansCN-Bold.otf SourceHanSansCN-Bold.ttx ]
6. 在 output 文件夹下得到 SourceHanSansCN-Bold.otf,这就是我们修改好的字体了。
Android 端 fallback_fonts.xml 的编辑
前面说过我拖了一份 Android 5.0 正式版的系统镜像回来,这里就完全按照 Android 5.0 的方式来添加好了。
打开 fallback_fonts.xml,找到:在其上插入:因为我主要是使用简体中文的,所以把简体中文排在了最上面。像我这样系统语言设置为英语时,靠上的字体会优先显示。
修改好之后将上述六个字体复制到 /system/fonts 下,重启手机即可(注意备份,注意权限。本帖主要讲修改字体文件而不是修改 Android 系统字体,我就不太细说了。)