而对一些手机美化爱好者来说,更换系统字体是一种常见的需求。但不同系统下替换字体的方式也不尽相同,比如MIUI、EMUI等定制ROM可以通过将字体文件做成主题包,通过导入主题的方式实现系统字体更换;而没有主题字体功能的手机则需要先获取root权限,然后才能手动对系统字体进行更换(因为字体文件一般在系统文件夹system/fonts里)。
在TWRP等第三方recovery出现后,字体卡刷包也出现了,它们为root替换字体的玩家们提供了不少便利。但这种方法不但修改了系统的文件,而且不易卸载(需要对原机字体进行备份),直到上面提到的Magisk的出现,才彻底改变了Android手机的字体更换体验——借助Magisk字体模块,我们可以将喜爱的字体和修改后的配置文件打包成模块,利用Magisk的systemless特性挂载达到更换系统字体的目的。模块化的字体也易于更换和卸载。
和上面提到的利用主题更换字体的方法相比,Magisk字体模块最大的优势在于可以实现多字重显示和全局替换。
某些ROM利用主题包更换字体时,只能替换和显示一个字重且无法实现全局覆盖(如MIUI使用主题方法更换字体之后,Webview还是显示为默认字体)。而用Magisk字体模块,这个问题就能得到解决。
但Magisk字体模块在制作上比较麻烦:我们需要将一款字体制作成多个字体文件用来替换英文、中文字体,还要修改fonts.xml描述文件来实现对多字重字体的调用。
相比而言主题包的制作更加简单,只需要一个ttf格式的字体和一个可以将字体打包成主题的美化软件,比Magisk字体模块更容易制作(而且主题替换方法无需root权限)。
因此自然会有人问:
有没有更简单的方法,可以将自己喜欢的ttf格式字体转换成Magisk模块,不用苦等字体模块作者手动制作吗?
为此我制作了一个字体模块模板,借助这个模块,你可以将自己喜爱的ttf字体打包成Magisk模块,实现系统字体全局替换。
以下是制作TTF转Magisk模块模板的基本原理和制作过程,如果你感兴趣的话不妨阅读了解一下。
从Android7.0开始,Android系统的字体就由一个fonts.xml文件(在system/etc目录下存放)来控制。这个XML文件用来定义系统的默认字体,以及多语种字体的调用情况。系统利用fonts.xml从上往下调用文件里面指定的字体,最先调用的就是默认字体,如果默认字体缺失,可能会导致无法进入系统。
在fonts.xml里,最先被调用的就是系统的默认字体Roboto了。下面是系统默认sans-serif字体Roboto的调用语句。
再往下就是一些变体(serif、sans-serifcondensed、monospace等)的调用语句,然后就是fallback字体了,一般是多语种字体,family标签后面都有所对应的语言。[下面是中日韩文字体(下称CJK字体)的调用语句。]
……
也就是说,SmartisanOS7.0把6字重的SmartisanT黑作为系统默认调用的字体,把Roboto作为fallback字体,使SmartisanT黑缺字部分fallback到Roboto上,然后再往下fallback,在调用T黑的同时保证不缺字(估计大多数魔改过字体的定制ROM一般都是这么调用的)。
我从中受到了启发,得到了TTF转Magisk模块的基本思路。
在受到启发之后我突发奇想,假如有一个自定义的ttf格式的字体名叫「font.ttf」,将其放在系统的字体文件夹system/fonts下,然后让系统默认调用这个字体,不就实现TTF字体更换了吗?
于是我对fonts.xml进行了如下修改:
然后把修改之后的fonts.xml打包成Magisk模块,将其放入模块里的system/etc文件夹内,再将自定义的字体文件重命名为font.ttf放入模块的system/fonts文件夹内,然后将该模块刷入。
重启,就可以看到系统字体已经被替换成自定义的font.ttf了。
相应地,单字重字体如果不想看到系统强制渲染加粗糊成一块的效果,可以让所有字重都调用这个font.ttf:2
如果是一有多个字重的字体家族,想让系统调用多个字重,可以这么改(当然必须将多字重字体按照字重等级命名为「fontw1.ttf」~「fontw9.ttf」放到system/fonts目录下)。3
这样是能实现系统字体更换了,但是有个问题:有些字体由于自身的度量数据,以及一些字符的影响,在使用模块模板更换字体之后,可能会有偏移或者行距过大等问题(比如思源黑体/思源宋体,因为某些字符的影响,直接应用该字体会导致偏移严重)。
从字体层面上解决这样的问题,不仅要考虑度量,还要考虑是否有过长的字符造成这样的偏移,比较麻烦。
于是,作者在模块模板的system/fonts目录里面加入了R大制作的12个「RobotoFake」字体文件,然后对fonts.xml进行了修改:
主要是在调用默认字体的语句处做如下修改:
多字重的修改方法可见上上一节,这里不再赘述。
经过上述优化之后,再用同样的字体,偏移问题得到了解决。
模板下载:
包括2.0和3.0两个版本,分别包含a(单字重版)、b(单字重防止加粗变糊版)、c(多字重版)。不懂三者区别的可返回到「字体模块模板的制作历程」一章进行了解。
将自己喜爱的TTF格式文件重命名为「font.ttf」(区分大小写,otf扩展名要改成ttf),然后复制到模块模板里的「system/fonts」文件夹内,刷入,重启,即可看到效果。
将自己喜爱的字体家族按照字重等级重命名为「fontw#.ttf」(#号表示1~9的阿拉伯数字,从1到9分别对应Extralight、Thin、Light、Regular、Medium、Semibold、Bold、Heavy、Black由细到粗9个字重,区分大小写,otf扩展名要改成ttf),然后复制到模块模板里的「system/fonts」文件夹内,刷入,重启,即可看到效果。
可以通过修改模块里的「module.prop」修改模块信息。
id=lxgwttf2magisk#模块的ID,只支持半角英文和数字,不能以纯数字开头
name=TTF转Magisk模块模版#模块的名称,模块刷入后,此名称会在MagiskManager里显示
version=3.0#模块的版本
versionCode=5#模块的版本代号
author=落霞孤鹜[lxgwshare]#模块的作者
description=#这里填写模块描述,模块刷入后会在MagiskManager里显示
minMagisk=17000#支持此模块的最低Magisk版本
本文介绍了TTF转Magisk模块模板的制作原理以及使用方法,使用这个模块模板,可以使系统字体的更换变得更加方便快捷。