为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块
2024-01-21 02:02:13发布 浏览589次 信息编号:94044
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块
本文基于微信公众号“侠雾”(),点击此处阅读原文。 这是我第一次写少数派的文章,疏漏在所难免。 希望各位读者多多包涵并指正。
由@开发,以其(无系统修改)的特性成功取代了之前的root神器,成为当前游戏爱好者的必备工具之一。 通过这个我们不仅可以获得root权限,还可以挂载各种模块来实现系统优化或者功能增强。
相关阅读:
对于一些手机美化爱好者来说,更换系统字体是常见的需求。 但不同系统中替换字体的方法有所不同。 例如,MIUI、EMUI等定制ROM可以将字体文件制作成主题包,导入主题替换系统字体; 而没有主题字体功能的手机需要先获得root权限才能手动更改系统字体(因为字体文件一般在系统文件夹/fonts中)。
TWRP等第三方出现后,字体刷机包也出现了,为root更换字体的玩家提供了很多便利。 但这种方法不仅修改了系统文件,而且卸载困难(需要备份原来的字体)。 直到上面提到的出现,才彻底改变了手机上的字体替换体验——借助字体模块,我们可以将收藏的字体和修改的配置文件封装成模块,并替换系统字体通过使用特征安装。 模块化字体也很容易替换和卸载。
字体模块的“得”与“失”
与上面提到的使用主题更改字体的方法相比,字体模块最大的优点是可以实现多权重显示和全局替换。
部分ROM使用主题包更换字体时,只能替换显示一种字体粗细,无法实现全局覆盖(例如MIUI使用主题方法更换字体后,仍显示默认字体)。 有了字体模块,这个问题就可以解决。
左图为MIUI主题商店中某字体的显示效果,右图为某字体模块替换后的显示效果。 可以看到使用模块可以实现全局覆盖和多词权重替换。
不过字体模块的制作比较麻烦:我们需要将一种字体制作成多个字体文件来替换英文和中文字体,还需要修改fonts.xml描述文件来实现多粗细字体的调用。
相比之下,主题包的制作更为简单。 它只需要一个ttf格式的字体和一个可以将字体打包成主题的美化软件。 比字体模块更容易制作(并且主题替换方式不需要root权限)。
那么自然有人会问:
有没有一种更简单的方法可以将您喜欢的 ttf 格式字体转换为模块,而不必等待字体模块作者手动创建它?
为此,我做了一个字体模块模板。 借助该模块,您可以将自己喜欢的ttf字体打包到模块中,实现系统字体的全局替换。
字体模块模板的制作流程
以下是制作TTF转模块模板的基本原理和制作流程。 如果您有兴趣,不妨阅读并了解更多内容。
从fonts.xml开始了解系统字体调用原理
从7.0开始,系统字体由fonts.xml文件(存储在/etc目录中)控制。 该XML文件用于定义系统默认字体以及多语言字体的调用。 系统使用fonts.xml从上到下调用文件中指定的字体。 首先调用默认字体。 如果缺少默认字体,可能会导致系统无法进入。
在fonts.xml中,首先调用的是系统的默认字体。 以下是系统默认无衬线字体的调用语句。
Roboto-Thin.ttf
Roboto-ThinItalic.ttf
Roboto-Light.ttf
Roboto-LightItalic.ttf
Roboto-Regular.ttf
Roboto-Italic.ttf
Roboto-Medium.ttf
Roboto-MediumItalic.ttf
Roboto-Black.ttf
Roboto-BlackItalic.ttf
Roboto-Bold.ttf
Roboto-BoldItalic.ttf
接下来是一些变体(衬线、无衬线等)的调用语句,然后是字体,通常是多语言字体,标签后面有对应的语言。 【以下为中日韩字体(以下简称CJK字体)的调用声明。 ]
NotoSansCJK-Regular.ttc
NotoSerifCJK-Regular.ttc
NotoSansCJK-Regular.ttc
NotoSerifCJK-Regular.ttc
NotoSansCJK-Regular.ttc
NotoSerifCJK-Regular.ttc
NotoSansCJK-Regular.ttc
NotoSerifCJK-Regular.ttc
在坚果Pro 3发布时,坚果推出了方正定制UI字体——T black。 然后我就收到了某位老大分享的OS 7.0字体和配置文件。 在分析OS字体配置时,我发现它的默认字体是这样配置的:
Smartisan_Compact-Thin.otf
Smartisan_Compact-Light.otf
Smartisan_Compact-Regular.otf
Smartisan_Compact-Medium.otf
Smartisan_Compact-Heavy.otf
Smartisan_Compact-Bold.otf
……
Roboto-Thin.ttf
Roboto-ThinItalic.ttf
Roboto-Light.ttf
Roboto-LightItalic.ttf
Roboto-Regular.ttf
Roboto-Italic.ttf
Roboto-Medium.ttf
Roboto-MediumItalic.ttf
Roboto-Black.ttf
Roboto-BlackItalic.ttf
Roboto-Bold.ttf
Roboto-BoldItalic.ttf
也就是说,OS 7.0使用6字T black作为系统调用的默认字体。 与字体一样,T black 缺失的字符被移动到顶部,然后向下移动。 当叫T black时,没有漏字符(估计)。 大多数带有修改字体的自定义 ROM 通常都是这样调用的)。
我受到了启发,得到了将TTF转换为模块的基本思想。
修改fonts.xml调用自定义字体1
受到启发后,我突然想到,如果有一个ttf格式的自定义字体,名字叫“font.ttf”,把它放到系统的字体文件夹/fonts下,然后让系统默认调用这个字体,不就行了吗?你实现TTF字体替换了吗?
所以我对fonts.xml做了以下修改:
修改fonts.xml中调用默认字体的部分:
font.ttf
添加对以下字体部分的调用:
Roboto-Thin.ttf
Roboto-ThinItalic.ttf
Roboto-Light.ttf
Roboto-LightItalic.ttf
Roboto-Regular.ttf
Roboto-Italic.ttf
Roboto-Medium.ttf
Roboto-MediumItalic.ttf
Roboto-Black.ttf
Roboto-BlackItalic.ttf
Roboto-Bold.ttf
Roboto-BoldItalic.ttf
在调用CJK字体的语句前添加如下语句,防止西文调用后直接调用默认的思源:
font.ttf
font.ttf
font.ttf
font.ttf
一些本机 ROM 桌面会调用字体。 为了让它们调用自定义的ttf字体,作者对调用语句做了如下修改:
然后将修改后的fonts.xml打包成一个模块,放入模块中的/etc文件夹中,然后将自定义字体文件重命名为font.ttf放入模块的/fonts文件夹中,然后将模块刷入。
重启后可以看到系统字体已经替换成了自定义字体.ttf。
以从 OPPO 官网下载的 OPPO Sans 为例,使用 TTF 转换模块模板,无需修改系统字体文件即可将系统字体更改为 OPPO Sans。
相应的,如果你不想看到系统强制将单粗细字体渲染成粗体、模糊成一片的效果,可以对所有粗细调用这个font.ttf:2。
font.ttf
font.ttf
font.ttf
font.ttf
font.ttf
font.ttf
使用“防止粗体和模糊”模块后的效果。
如果是多个粗细的字体家族,并且希望系统调用多个粗细,可以这样改(当然,多粗细的字体必须根据粗细命名为“.ttf”~“.ttf”)级别并放置在 /fonts 目录中)。 3
fontw1.ttf
fontw2.ttf
fontw3.ttf
fontw4.ttf
fontw5.ttf
fontw6.ttf
fontw7.ttf
fontw8.ttf
fontw9.ttf
使用多权重模块后的效果,前提是对应的字体文件已经根据权重重命名为指定的文件名。一个新问题
这样可以实现系统字体替换,但是存在一个问题:有些字体在使用模块模板替换字体后,由于自身的测量数据以及某些字符(如思源等)的影响,可能会出现偏移或者行间距过大等问题。恒体/思源宋体,由于某些字符的影响,直接应用该字体会造成严重的偏移)。
直接替换“思源宋体”导致的偏移、错位、行距过大的问题
在字体层面解决这样的问题,不仅要考虑测量,还要考虑是否有太长的字符造成这样的偏移,这是相当麻烦的。
有一天,在极限论坛上,无意中发现极限大神“”(以下简称R大)分享了他关于改变字体偏移量的想法(帖子比较老了,不过6.0以上还是适用的)。
在极限社区分享更换字体的想法
我们简单说一下R的大思路:将系统默认字体的12个字体文件(6个粗细×2个变体)挖空,保留它们的测量数据,做成文件,然后修改fonts.xml,让系统先调用Empty字体文件来控制显示字体的测量参数,然后再往下到自定义字体文件; 然后针对中日韩再次调用自定义字体文件,然后调用系统默认来填补缺失的字符。 如果您有兴趣,可以点击这里查看详细想法。
解决偏移4
因此,作者将R生成的12个“”字体文件添加到模块模板的/fonts目录下,然后修改fonts.xml:
主要在调用默认字体的语句处进行如下修改:
RobotoFake-Thin.ttf
RobotoFake-ThinItalic.ttf
RobotoFake-Light.ttf
RobotoFake-LightItalic.ttf
RobotoFake-Regular.ttf
RobotoFake-Italic.ttf
RobotoFake-Medium.ttf
RobotoFake-MediumItalic.ttf
RobotoFake-Black.ttf
RobotoFake-BlackItalic.ttf
RobotoFake-Bold.ttf
RobotoFake-BoldItalic.ttf
font.ttf
Roboto-Thin.ttf
Roboto-ThinItalic.ttf
Roboto-Light.ttf
Roboto-LightItalic.ttf
Roboto-Regular.ttf
Roboto-Italic.ttf
Roboto-Medium.ttf
Roboto-MediumItalic.ttf
Roboto-Black.ttf
Roboto-BlackItalic.ttf
Roboto-Bold.ttf
Roboto-BoldItalic.ttf
多词权重的修改方法可以参见上一节,这里不再赘述。
经过上述优化后,再次使用相同的字体,偏移问题就解决了。
使用提供的方法后,解决偏移问题。模块模板的获取和使用
模板下载:
|| 驱动|百度云(提取码9ep7)|兰座云(提取码88zx)
它包括2.0和3.0两个版本,分别包括a(单字重印)、b(单字粗细,防止加粗和模糊)、c(多字重印)。 如果您不明白三者的区别,可以返回“字体模块模板制作流程”章节进行详细了解。
单字权重模块模板
将您喜欢的TTF格式文件重命名为“font.ttf”(区分大小写,otf扩展名应更改为ttf),然后将其复制到模块模板中的“/fonts”文件夹中,刷新并重新启动。 效果可见。
提醒:请联系我时一定说明是从星空网上看到的!