下你所需,载你所想!
IT技术源码资料下载网站

APK编辑器替换APK原来的字体方法

:手机软件 2019-11-12 18:31:08

使用APK编辑器替换APK原来的字体方法

本文就是使用了最简单的方法来偷天换日,
我首先使用APK编辑器查看了Juicessh的目录结构,
我敏锐的发现
目录:assets/fonts/DroidSansMono.ttf
存放了字体,
于是我大胆的实验直接找一个别的字体改个名,
用APK编辑器的简单编辑功能替换来试一试,
果然可行。
使用APK编辑器替换APK原来的字体方法
经过几十种字体的替换,
推荐字体有iosevka、hack、文泉驿等宽微米黑。
我又发现了几个问题点,
大部分中文字体显示都十分异常,
经过一番查证,发现了一些字体相关的点。

举个例子说明一下。
比如有一个符号,是个横杠。-
这个横杠,在有些国家和地区,它的宽度是一个 ASCII 字符宽度(我们只讨论等款字体的渲染效果),但是在有些国家和地区,它的宽度是两个 ASCII 字符宽度。
这里面有很多原因,因为大家都知道,语言、文字,是一个国家主权的体现。所以每个国家(或地区)对自己国家的语言文字都有相应的规范。你们找本小学生新华字典翻翻附录就知道我们汉字的规范了。
但是这些字符的含义却是一致的。
所以在编码处理的时候,就有两种处理方式:
1,把它们当成两个字符
2,把它们当成一个字符
如果当成两个字符,那么你想要一个字符宽度的时候,你就用一个字符宽度的那个版本,你想用两个字符宽度的时候,你就用两个字符宽度的版本。
大家肯定猜到了,这就是「全角」和「半角」说法的来历。
这个方案的好处是,字符本身就明确了宽度,你想用全角,就用全角,想用半角,就用半角。
但是缺点也很明显:
1,浪费编码空间
2,带来不必要的全半角转换工作
比方说,引号有两个版本,一个全角,一个半角,那你替换的时候就得把两种都处理一遍,不然会有遗漏。而且很多人还经常用错,用混,都很麻烦。
所以就有了另一个方案:单字符宽度和双字符宽度,都用同一个编码,但是在显示渲染的时候,再决定如何渲染。
那么显示的时候到底该怎么渲染呢?有几种方案:
1,始终渲染为双字符宽度
2,始终渲染为单字符宽度
3,渲染为单字符宽度,但是后面加一个空格,这样占位仍然是两个字符宽度,不会引起纵向的错位
4,根据上下文自动渲染

使用同样字体进行比对,
发现juicessh采用了方案2,termux采用了方案1。
使用apk编辑器查看smali,
也能找到该字体的一些相关,
由于我不熟悉,就采用了最简单的替换方案。
实际上也并不完美,只是算得上能用。