只需说话,就能让应用变成你想要的样子
安卓修改大师智改工坊 · 把改包这件事说清楚
同一段文字两种字体
换字体看着只是换个文件,实际上有三条不同的路径

换字体是改包里最容易被低估的一件事。看起来只是「换一个文件」,实际交付出去,反馈常常是「大部分变了,但有几个地方没变」「字变了但粗细怪怪的」「有几个名字变成了方块」。

这三个反馈分别指向三个不同的层面:设置没覆盖到、字重不全、字库不全。它们不在一处,也不该用同一种办法解决。而绝大多数返工,都是从「以为是同一个问题」开始的。

这一篇把字体这件事拆开讲:字体文件在包里住哪、一条声明怎么走完全局、哪三类文字永远换不到、字重和字库各自会怎么坑人,最后给一张验收清单。所有操作都只需要说一句话,产品官网是 www.apkeditor.cn。

一、换字体最常见的三种「没换干净」

给应用换一套品牌字体,是改包里看起来最简单的一件事:找一个字体文件,塞进去,指定一下。但真正交付出去之后,反馈往往是这三种。

第一种,大部分变了,个别页面没变。列表、详情、设置都换了,唯独某个功能页还是原来的字体。这种通常是那个页面自己设了字体,没走统一的那套。

第二种,字变了,但粗细不对。明明装的是标准体,显示出来却是粗的,或者该粗的地方没粗起来。这种多半是遇到了「合成加粗」——系统在找不到对应字重时,会把现有的字往旁边再描一遍假装加粗。

第三种,个别字变成了方块或问号。常用字都对,某几个人名、地名、生僻字、特殊符号变成了豆腐块。这种是字体文件本身不全,跟设置没关系。

三种现象,对应三个完全不同的层面:第一种是「设置没覆盖到」,第二种是「字重不全」,第三种是「字库不全」。混在一起改,最常见的结果是改完一个又冒出另一个。

二、字体在包里是「一个文件加一处声明」

要换字体,先得知道它现在是怎么来的。整个机制其实只有两件事:文件放在哪,以及谁在引用它。

文件通常在两个地方。一个是在资源目录下的字体文件夹里,这类文件有编号、能被资源系统按名字找到;另一个是在资产目录里,这类文件没有编号,只能按路径去读。放在哪决定了它能被谁引用,这一点后面会反复用到。

声明的方式有三种。第一种是在主题层统一声明,整个应用默认就用它,这是最省事也最不容易漏的做法。第二种是在具体控件上单独指定,这种做法灵活但散,散到一定程度就没人说得清哪个控件用的是什么。第三种是在代码里动态设置,只在特殊场景用,比如金额、标题、数字表格。

三种声明方式对应三种「换不到」。主题层改不到单独指定的控件;单独指定改不到代码里动态设的;代码里动态设又改不到网页里渲染的文字。所以「换不干净」不是执行不力,是结构决定的。

一个判断方法:换完之后没变的那些地方,看它是「整页没变」还是「某个控件没变」。整页没变说明那一页有自己的主题;某个控件没变说明它被单独指定过。这两种情况找的地方完全不同。

三、主题层统一,是唯一值得推荐的做法

三种声明方式里,只有主题层统一是能长期维护的,其余两种都应该当成例外来处理。

为什么?因为主题层改一处,全应用生效;控件层和代码层是「谁设谁负责」,界面越多、人越多,越容易漏。而漏掉的那一处,往往就是用户天天看的那个页面。

主题层的做法本身不复杂:在主题里指定字体族,所有没单独表态的控件都会继承它。关键在「没单独表态」这四个字——只要有一个控件自己设了,它就不听了。

所以真正的工作量不在「设」,在「清」。把散落在各处的单独指定清掉,让它们回到继承状态,主题层的统一才会真正生效。这一步和深色模式那次要扫写死颜色是同一件事:先清例外,再谈统一。

如果清不掉怎么办?有些第三方控件、有些历史页面改动风险太大,那就接受它们不清,但要列一张例外清单:哪几处没跟着换、为什么、什么时候处理。例外被写下来就是可控的,没写下来就会在交付后变成投诉。

四、为什么自绘的文字永远换不到

有一种文字,你把所有能设的地方都设了,它还是不变。因为它不是「控件」,是「画上去的」。

什么叫画上去的?有些界面不用文字控件,而是自己拿一块画布,用一个画笔对象,把字一个一个画上去。这种文字只认画笔上设置的字体,不认主题、不认控件属性、也不认全局默认值。

哪些地方会这么干?图表里的坐标轴标签、进度环中间的数字、印章与水印、自定义的表盘、还有为了精确对齐而自绘的金额显示。它们共同的特点是「位置和形状需要精确控制」,所以干脆自己画。

这类地方的排查办法是看现象:如果某个数字或标签,字体、字号、甚至颜色都不跟着变,而周围的文字都变了,那它八成是自绘的。它的修改点不在界面文件里,在代码里找到那支画笔然后重设。

顺带说一句:自绘文字也是深色模式的重灾区。因为它连颜色都不走主题,切深色之后经常是深底深字。凡是「画上去的东西」,都要单独当成一处来查——文字、图形、分隔线都一样。

五、网页里的文字是另一套系统

应用里嵌了网页,那部分文字和安装包里的字体没有关系,除非你专门做了处理。

原因和上一节的自绘文字类似:网页由另一套渲染引擎绘制,它只认网页自己的样式表。你改了安装包里的字体声明,网页完全不知道。

想让网页用上品牌字体,有三条路。第一条,网页样式里直接引用字体文件(可以打包进网页资源里),这条路最干净。第二条,网页引用应用提供的本地文件,需要应用做一层文件映射,配置稍复杂但可行。第三条,让网页用系统字体,放弃统一——这条最省事,但视觉上会明显「不像一个应用」。

怎么选取决于网页是谁的。自家网页走第一条;第三方网页基本只能走第三条,硬塞字体进去风险很大,因为对方随时可能改版。而「不统一」这件事只要提前说清楚,通常是可以接受的。

还有一个折中办法:把网页里的字号、行高、边距调成和原生界面接近,视觉上就不那么突兀。字体不同但节奏相同,比字体相同但节奏错乱要好得多。

六、字重这件事:粗体往往是「描」出来的

字体文件不是一个。一个字体家族通常包含好几个文件,每个文件对应一种粗细:细、常规、中黑、粗、特粗。系统显示粗体时,会去找「粗」那个文件;找不到,就自己想办法。

它想的办法叫合成加粗:把常规体往右偏一点点再画一遍,两遍叠起来看着就粗了。这个办法不需要额外文件,代价是很难看——字的笔画会糊、边缘会毛、标点会变形,字号越小越明显。

所以「换了字体但粗细不对」,八成是只装了一个常规体。界面里所有该粗的地方——标题、按钮、金额、强调——全都靠描,看上去一片发虚。用户说不清哪里不对,只会觉得「不如原来清楚」。

正确做法是按用到的字重各装一份。但要注意成本:中文字体一个文件动辄几兆到十几兆,装三档字重,包就大了一圈。所以实际做法通常是「常规 + 一档粗」,够用即可,不做全套。

还有一个反向的坑:字体家族里已经带了粗体文件,但声明的时候只写了家族名、没让系统去匹配字重,结果该粗的地方还是描的。这种情况改法不是加文件,是改声明。判断方法很简单:把字号放大到很大,看笔画边缘是否干净——描出来的粗体,放大后一定毛。

合成加粗与真粗体对比
描出来的粗体放大后边缘会毛,真粗体边缘干净

七、字库不全:那几个方块是怎么来的

第三种反馈最扎心:整个应用都换了,就某几个人名显示成方块。这不是设置问题,是那个字体文件里根本没有那个字。

为什么会有字体不全?中文字库非常大,全量往往有几千到上万个字。为了控制体积,很多字体在打包时会做「子集化」——只保留常用字。子集化本身没问题,问题在于「常用」是谁定义的。

被漏掉的通常是这些:生僻的人名地名、古籍与专业术语用字、少数民族文字、特殊符号与数学符号、还有某些标点变体。它们平时不出现,一出现就是关键位置——客户姓名、地址、商品名。

怎么提前发现?不要靠浏览界面,要靠「把字喂进去」。准备一份测试清单:常见姓氏里的生僻字、几个少数民族姓名、几个专业词、几个符号(含货币、温度、箭头、勾叉),输进搜索框和一个能自由输入的页面,看会不会变方块。

变方块了怎么办?换一份更全的字体文件,或者把缺的字补进去。不建议的做法是「换回系统字体」——那等于放弃整件事,而且往往只为了两三个字。更务实的做法是:主字体用全量版,只在标题等少量位置用体积小的品牌字体。

顺便算一笔体积账:一份全量中文字体通常在几兆到十几兆,子集化后可能只有几百 K。差出来的这十几兆,对一个几万次下载的应用来说是实打实的。所以子集化不是错,错在子集化之后没有做字形覆盖测试。

字体文件与声明
文件放哪决定谁能引用它,声明写哪决定谁跟着变

八、第一个实例:会员端换了字体,金额数字没变

自家一个会员管理应用,要统一换成品牌字体。首页、会员卡、订单列表都换过来了,看着挺整齐。

问题出在收银台那个页面。那里有一行很大的合计金额,是页面的视觉中心。字体换了之后,它还是原来那副样子——同样的数字,但气质完全不一样,一眼能看出不属于同一套。而这一行恰好是用户盯得最久的一行。

查下来原因很典型:那个金额不是文字控件,是为了精确对齐而自绘的。它用画布把每个数字按固定宽度画上去,好让小数点上下对齐。自绘的东西不认主题,所以它成了整个页面唯一没换的地方。

以前的做法:得进代码里找到那支画笔,重新设一次字体,还要重新量一遍字宽——因为换了字体,每个数字的宽度变了,原来的对齐参数会错位。改一处花了半天,而且改完还得重新核一遍小数点是否还齐。

现在一句话:把这个页面里自绘金额的画笔字体换成品牌字体,同时按新字体的数字宽度重算对齐;如果新字体有等宽数字,优先用等宽数字。

验证方法也很直接:把金额从三位数改成带小数的五位数,看小数点是否仍然上下对齐、有没有被截断;再把系统字体大小调大一档看一遍。自绘的文字最容易在「数字变长」和「字号变大」这两件事上翻车。

九、第二个实例:巡检端换字体,三个人名变成方块

第二个例子更惊险,因为它差点带着问题交付。

这个巡检应用要换成一套定制字体,文件是从品牌方那里拿的,看着挺正规。换完自己测了一遍:列表、详情、表单、报表,全都正常。交付前一天,测试同事随手在客户名称里输了一个不常见的姓,那块地方立刻变成了两个方块。

原因是那份字体做过子集化,只保留了常用三千多字。常用字都齐,所以正常路径测不出问题;但这个应用的客户名称是自由输入的,里面会出现各种姓氏、地名、编号里的特殊符号。

更麻烦的是它的影响面:那几个方块不只在列表里出现,还会带到导出的报表、打印的单据、分享出去的图片上。等于说一个字形缺失,会跟着数据流到四个地方。

改法分两步。第一步,换一份覆盖更全的字体文件,先把已经发现的缺字补上;第二步,做一份覆盖测试——把几十个生僻姓氏、几个少数民族姓名、几类特殊符号一次性输进去,看还有没有漏的。

这件事真正的教训不是「要选全量字体」,而是「必须有用例」。我们后来把这个应用的字形覆盖测试固定成了一个动作:每次换字体、每次改字体版本,都把那份清单跑一遍。清单只有几十个字符,但它挡住的是一类只在客户现场才会暴露的问题。

顺带说一句成本对比:换成全量字体,包大约大了十几兆;而如果带着方块交付,返工一次要重新出包、重新分发、重新让几十台设备更新。这十几兆,是这件事里最便宜的一笔支出。

十、换了字体,行高也会跟着变

这一条几乎每次都有人踩:字体换了,字没变多也没变少,但有两行字被截掉了半截。

原因是每个字体的「字框」不一样。同样写「字号十六」,不同字体实际占的高度不同:有的字上下的留白多,有的几乎贴边。而界面的行高往往写的是固定值,字体一换,字变高了,固定行高就装不下。

现象有三种,越往后越难发现。最明显的是文字被上下切掉一点;其次是文字挨得太紧,看着发闷;最隐蔽的是多行文字最后一行被容器裁掉半行——而它只在最长的那个词条上出现。

怎么改?把固定行高改成「按字体倍数」来算,让行高跟着字号和字体走,而不是钉死一个像素值。这样换字体、换字号、用户放大系统字体,三件事都不会再撞。

如果容器高度也是固定的,还要一起改。我们见过一个卡片,行高放开了,但卡片本身写死了高度,结果文字把卡片撑破了。凡是「装文字」的容器,高度都建议跟着内容走,不要钉死。

行高这件事还有一个连带影响:它会让原本「看起来很稳」的列表变得不稳。同一列条目里,长标题换行、短标题一行,高度本来就不一致;字体一换,行高变化不均匀,列表就开始跳。所以换字体之后,值得专门滚一遍最长的那个列表,看有没有哪几条突然变高或变矮。

验证办法:找一个最长的标题、一条最长的地址、一句带标点的多行描述,三处各看一遍;再把系统字体调到最大档再看一遍。固定的高度,一定会在其中某一种情况下露出来。

十一、数字要不要单独排:金额对齐这件小事

换字体时容易被忽略的一类元素是数字,尤其是金额、数量、日期这些会成列出现的数字。

原因很简单:多数中文字体里的数字不是等宽的。「1」比「8」窄,于是同样五位数,每一行的宽度都不一样。竖着看一列金额,小数点参差不齐,显得很不专业。

解决办法有两个。第一,选一个数字等宽的字体——很多字体家族会额外带一组等宽数字,或者提供一个「表格数字」的变体。第二,不动字体,把金额单独用一套等宽字体渲染,只用于数字列。

第一种更省事,前提是字体本身支持。换字体的时候顺手确认一句「这个字体的数字是不是等宽」,能省掉后面专门为数字再配一套的麻烦。而这件事只有在「一列数字排在一起」的时候才看得出来,单个数字永远看不出。

第二种更稳,代价是多一个字体文件。如果金额、报表、对账单是应用的核心界面,这个代价值得付——因为它直接决定了表格看起来是不是「能对上」。

还有一招几乎零成本:给数字列加一点字符间距,或者干脆让数字右对齐。这两种做法都能让参差变得不那么明显,虽然治不了根,但在没法换字体的场合很实用。

还有一个细节:小数点和货币符号。有些字体的货币符号是全角宽度,混在数字里会突然多出一段空白。验收时专门看一眼「带货币符号的金额」和「带负号的金额」,这两种最容易露馅。

十二、用户把系统字体调大之后

字体这件事还有一半在用户手里:系统字体大小是可以调的,而且不少人真的会调。

换字体时如果不考虑这一点,会得到两种结果。一种是字变大了但布局没变,文字挤出容器、按钮文字折成两行;另一种是应用自己锁死了字号,用户调了没用,这在无障碍上是很糟糕的体验。

正确的做法是:字号用相对单位,容器高度跟着内容走。说起来简单,做起来要检查每一处写死的高度和小到离谱的边距。尤其是那些「刚好放得下四个字」的按钮,字体一放大就崩。

换字体恰好是最好的检查时机。因为换字体本身就会让文字尺寸发生变化,等于提前把「尺寸敏感」的地方全暴露了一遍。把这一遍当成为无障碍做体检,比专门安排一次要省事得多。

验收动作:把系统字体调到最大档,然后过五个界面——首页、列表、表单、弹窗、带按钮的底部条。能过这五处,基本就没有硬伤。

还有一处很隐蔽:换字体之后,原来「刚好一行放得下」的文案可能变成两行,于是卡片高度变了、列表跳动、按钮上的字挤成两行。这类问题不会报错,只会让界面看起来「有点乱」。检查办法是找边界长度的文案——刚好一行、刚好两行的那几条,逐个放大字号看它们会不会翻行。

顺带一句:有些自绘文字会忽略系统字号,永远用固定值画。这类地方在放大字号后显得特别小,而它往往在图表或金额上,是信息最关键的位置。

十三、七个问题,都是换字体时真被问过的

1. 字体文件放资源目录还是资产目录?要能被主题和控件按名字引用,放资源目录;只打算在代码里按路径读,放资产目录。想省事就放资源目录,它支持的引用方式更多。

2. 换了字体,包会大多少?看字库覆盖范围。全量中文字体通常几兆到十几兆,只保留常用字可以压到几百 K。这是体积和覆盖率之间的取舍,没有标准答案。

3. 能不能只换标题、正文不动?能,而且很常见。标题用品牌字体建立识别,正文用系统字体保证可读性和体积。这是一种被低估的折中方案。

4. 换了字体之后,行距要不要一起调?要。字体换了字框就变了,原来的行距往往偏紧或偏松。先把行高改成按倍数算,再目视微调一档。

5. 图标字体算不算字体?算,但它更脆弱:图标字体是用字符编码画图,缺一个字符就是一个方块。换字体时千万别把图标字体那份覆盖掉,否则整个界面的图标会集体变成方块。

6. 字体有版权问题吗?有,而且这是硬门槛。用于商业应用必须确认字体的授权范围,很多免费字体只授权个人使用。这一点不能靠猜,要拿到明确的授权说明。

7. 别人给我一个字体文件,能直接用吗?先确认来源与授权。文件名叫「免费」不代表能商用,也不代表能嵌进应用里分发。这一步省不掉。

这七个问题里,第五和第六是真正会出事的。第五个会让界面瞬间崩坏,第六个会让整个应用下架。它们都不属于「技术难度」,属于「有没有想到」。

逐项验收换字体后的界面
验收要喂生僻字、要对齐看数字、要调大字号

十四、验收清单:八处看完才算换完

最后还有一处值得加进清单:把应用退到后台再切回来,看有没有哪块文字「重新排版」了。有些界面在恢复时重新测量尺寸,如果字体和布局的时间点没对上,会出现短暂的一行变两行、再跳回来。它只闪一下,但用户的眼睛对跳动比对颜色更敏感。

换字体几乎不会报错,只会「看着不对」。所以验收必须逐项过。

看哪里怎么触发不对长什么样常见原因
首屏与列表换完直接看个别标题还是老字体单独指定
按钮与标签看粗细是否干净一片发虚、边缘发毛只装常规体
自由输入框输入几十个生僻字与符号出现方块或问号字库不全
金额与报表一列数字上下对齐看小数点参差、货币符号多空数字非等宽
最长的文案找最长的标题与地址文字被切掉半截固定行高
系统字号最大档调大后过五个界面折行、溢出、按钮撑破写死高度
图表与自绘文字看坐标轴与中心数字字体没变、颜色没变自绘
内嵌网页打开帮助页还是系统字体另一套渲染

八项里,有四项目视就能完成,四项必须主动触发。生僻字要喂、数字要对齐看、字号要调大、网页要跳过去。只看首页和列表,能发现的问题不到一半。

再补一条:换字体和换图标一样,都要在两台设备上看。不同系统的默认字体渲染、字号档位、甚至字重匹配规则都有差别。在一台设备上「看着挺正常」,另一台可能就是发虚的粗体。

十五、什么情况下不该换字体

换字体有明确收益,也有明确成本。有些场合,不动才是对的。

第一种,正文很长、以阅读为主的应用。长文本最讲究的是可读性,而系统默认字体是经过大量设备验证的。换成一套笔画更细、字面更小的品牌字体,阅读体验往往变差。

第二种,界面里数字和表格占主导。报表、对账、库存这类界面,等宽数字比「好看的字形」重要得多。如果品牌字体没有等宽数字,换过去反而更难读。

第三种,多语言版本。一套中文字体通常不含日文、韩文、阿拉伯文的完整字形。一换就可能出现整页回落到系统字体,比不换更花。除非每个语种都单独配一套,否则不要全局换。

第四种,字体授权不清楚。这是硬条件:授权不明确,就不要用。宁可这一版不换,也不要带着风险发出去——撤版的代价远大于改版。

那什么情况下值得换?我们的判断是三条:品牌识别确实需要、界面以短文本为主、能拿到明确授权。三条都成立,才值得投入这一轮;缺一条,就先只换标题,正文不动。

只换标题,是个成本极低的做法。一个字体文件只用于几十个标题,可以放心子集化到很小,包几乎不变大,识别度却立住了。很多时候,我们需要的不是「全部换掉」,而是「在最显眼的地方看起来是新的」。

只换标题:一个成本极低的折中

如果全局换字体的代价太高——包会大、行高要重排、数字要重新对齐——还有一个折中方案:只把标题换成品牌字体,正文全部保持系统字体。

它的好处很直接。标题只用到几十个字符,字体文件可以放心子集化到很小,包几乎不变大;标题字数少、不涉及长文本排版,行高和折行的风险也小;而用户的视觉记忆恰恰集中在标题上。换句话说,投入最小的地方,正好是感知最强的地方。

它的边界也要说清楚。只换标题意味着界面里两种字体并存,如果这两个字体气质差得太远,会显得像是没改完。所以要么选一个风格接近的字体,要么把标题的字号、字重、字距一起调整,让「不同」看起来是有意的。

怎么落地?把范围说清楚就够了:只换标题类样式(一般对应几个固定的字号档),正文、按钮、输入框、表格一律不动;同时说明不要动图标字体。范围写得越窄,执行越准,返工越少。

还有一个变体:只换阿拉伯数字。有些品牌会把金额、编号里的数字换成一套更现代的数字字体,而中文仍用系统字体。这种做法更轻,但要求那套数字字体是等宽的,否则前面说的对齐问题会立刻找上门。

说到底,换字体不是一场「全有或全无」的选择。把范围切小、把风险切开、把验收做足,比一次全部换掉更容易得到能用的结果。

十六、图标字体:换字体时最危险的一份

有一种字体不显示文字,显示的是图标。它和普通字体长得很像,混在一起,最容易在批量替换时被误伤。

它的原理很朴素:把每个图标做成一个字符,界面里写的是一串特殊字符,渲染出来就是图标。好处是图标能像文字一样改颜色、改大小;坏处是它完全依赖那个字体文件。

一旦那份文件被换掉或者被删掉,所有用到它的地方会同时变成方块。不是一两个,是整个界面的图标——底部导航、按钮、列表项、状态标记。这是改包里最惨的一种翻车,因为它一眼就能看出来,而且没法解释。

怎么避免?换之前先确认:包里有没有这类图标字体。判断方法很简单——找那些看起来像私用区编码的字符引用,或者看有没有一个体积不大、但界面图标全靠它的字体文件。确认之后,替换时明确排除它。

如果确实要换图标字体,就当成一次独立任务来做:新字体必须包含旧字体用到的全部字符编码,一个都不能少。这一条只能靠对照清单核,不能靠「看着差不多」。

顺带说一句:改成矢量图标是更稳的长期方案,但工作量不小,不适合顺手做。如果这一轮只是换文字字体,就明确绕开图标字体——这是最省事也最安全的边界。

十七、一次返工的账:字体换了三轮才对

把前面两个实例连起来,这一轮换字体前后花了四天,其中两天在返工。

第一天,全局替换。把字体文件放进去,主题层声明一次,界面整体变了,看着很成功。当时的判断是「一天能干完」。

第二天,收银台。发现自绘金额没变,进代码改画笔、重算对齐,花掉半天。同一天下午发现两个卡片的文字被切掉了半截,原因是行高写死。

第三天,字形覆盖。测试同事输入一个生僻姓,出现方块。换字体文件、补覆盖测试清单,又把导出报表和打印单据各看了一遍——因为方块会跟着数据流出去。

第四天,收尾。调行距、核金额对齐、把系统字体调到最大档过一遍五个界面,顺手记了一张例外清单:哪两处第三方控件没跟着换、为什么。这一天最短,但没有它不敢交付。

复盘下来,真正的教训只有一句:换字体的工作量不在「换」,在「找」。四天里有两天半在找哪儿没换对、哪儿会崩。而找的效率取决于一件事——有没有一份清单,事先就知道该找哪几处。

如果重来一次:第一天就把八项验收表列出来,边换边过,前面三处(自绘、行高、字形覆盖)大概能在同一天内发现。省下的不是技术能力,是「知道要查什么」。

十八、这条规矩和前几篇讲的是同一套

把换字体放在整个改包的框架里看,会发现它和换图标、改深色、换图片遵循同一条规矩:资源靠名字被找到,例外永远藏在边角。

换图标时,一个名字对应五份不同密度的图,漏换一份就在某类屏幕上演砸;改深色时,一份颜色对应两套值,写死一处就在某个控件上发白;换字体时,一条声明覆盖全局,单独设一处就在某个页面保留旧貌。三件事的失败模式几乎一模一样。

所以那套做法也可以通用:先确定「谁在决定这件事」,再扫「哪些地方自己另设了」,最后按清单验收。顺序永远是「统一 → 清例外 → 验收」,反过来做一定返工。

这也是为什么我们总强调「先看一眼包里怎么组织的」。不知道资源怎么被引用,就只能靠试;知道之后,漏点在哪是可以推出来的。改包这件事,靠的不是手快,是对结构的熟悉。

也正是这条规矩,让「一句话改包」这件事变得可行:你只需要说清要什么、不要什么,工具负责把结构上的漏点全找出来。在安卓修改大师智改工坊里换字体,我们通常就是把范围、例外和验收三件事写成一段话——换哪个字体、哪些地方不动、按哪几处验——它去落文件、改声明、回编、对齐签名。产品介绍页在 https://www.apkeditor.cn/ai-version.aspx。

而在这之前,同一个改动我们是用手工做的:解包、翻目录、找引用、改一处回编一次、装上去看。那时候最大的浪费不是改,是「改完才发现还有第七处」。所以现在回头看,最值钱的不是工具,而是那份「该看哪八处」的清单——清单在手,用什么工具都能做对。

顺带说一句工具的价值:当你知道要找什么,一句话就能让它把那些地方全列出来、全换掉;当你不知道要找什么,再强的工具也只能跟着你的描述走。所以本文写的其实不是操作,是「该看哪几处」。

十九、附:一页速查

换字体之前对着这张表过一遍。

这张表建议直接贴在需求里。它一共八行,看起来很短,但真正照做之后你会发现,能挡掉的返工往往不止八次。

主题关键做法一句话提醒
字体住哪资源目录(可按名字引用)/ 资产目录(按路径读)优先资源目录
谁跟着变主题层声明 > 控件单独指定 > 代码动态设主题层最省事
换不到的三类自绘文字 / 网页 / 图标字体要单独处理
粗细不对缺字重,系统合成加粗常规 + 一档粗
方块缺字字库子集化漏字做覆盖测试
文字被切行高与容器写死改成按倍数、跟内容
数字不齐字体数字非等宽选等宽数字
验收八项首屏 按钮 输入框 金额 长文案 大字号 图表 网页主动触发

二十、三句话说完这件事

第一句:字体是一份文件加一处声明,换不到的地方都是「自己另设了」。所以先统一,再清例外。

第二句:粗细不对是缺字重,方块缺字是缺字形,两件事别混。前者加文件或改声明,后者换字库或补字。

第三句:验收要喂生僻字、要对齐看数字、要调大字号。这三件事只看首页永远发现不了。

再补一句:别碰图标字体。它不是文字,是整个界面的图标来源。批量替换时把它排除掉,能省掉一次全界面变方块的灾难。

还有一个反直觉的观察:换字体之后,最先被发现的往往是「字变小了」或者「字变挤了」,而不是「字体换了」。因为人对字形的记忆很模糊,对大小和疏密的感受却很准。所以调字体时,字号和行距的微调比字体本身更影响第一印象——把这两样调对,同样一套字体能少一半争议。

换字体这件事真正难的地方,是它太像「换个文件」。越像小事的事,越没有人愿意先花半小时看清楚结构——而那半小时,恰好能省掉后面两天。

二十一、用过的人怎么说

收银台那行金额换完没变,我一开始以为是缓存。后来才知道是自绘的。现在会先问一句「这个包里有没有自绘的文字」,能省半天。

—— 阿凯 · 会员系统维护

方块那次太吓人了,客户名字打出来是两个方格,第二天就要交付。后来做了一份生僻字清单,每次换字体都跑一遍,再没出过。

—— 周工 · 巡检系统交付

最有用的是「粗体是描出来的」这句。以前总觉得换完字体有点糊,说不出为什么,现在知道是只装了一个常规体。

—— Yuki · 界面设计

行高被截那一条我踩过两次。第一次以为是文字太长,第二次才反应过来是字体换行高变了。现在都改成按倍数算。

—— 老陈 · 独立开发

图标字体差点被我一起换掉。看到这篇才知道那也是一份字体文件,换掉就是全界面变方块。

—— 小满 · 外包改包

金额不对齐这个细节,客户提过一次,说「你们这个报表看起来很业余」。当时没懂,现在明白了是数字不等宽。

—— 阿泽 · 门店系统运维

这篇里的两个实例都来自我们自己维护的应用——会员端和巡检端,还有几个内部工具。写下来的目的不是展示能力,是把「换完总有两三处不对」这件事讲成一份可以照做的清单,让下一次换字体的人少走两天。

合规提醒:本文所有实例均针对自有版权或已获授权的应用,用于企业内部维护、品牌统一与合法定制。所用字体须取得明确的商用与嵌入授权,请勿使用来源不明或授权不清的字体文件。请勿将改包能力用于破解他人付费应用、绕过安全机制或规避授权校验。

字体这件事,说到最后其实是一个朴素的问题:你希望用户在哪个瞬间感觉到「这是你们家的东西」。那个瞬间可能只是一行标题、一个金额、一个按钮上的四个字。找到那个瞬间,把它换对,比把整页全换一遍更有用。安卓修改大师智改工坊做的就是让「换对」这件事少绕几圈——你说清换哪里、不想动哪里,剩下的它去落文件、去回编、去对齐签名。说清楚,就够了。

只需说话,就能让应用变成你想要的样子

安卓修改大师智改工坊 · 字体替换、图标、配色、文案,一句话就改

自动回编 · 对齐签名 · 真机预览 · 每一处改动可追溯

立即下载智改工坊(AI 版)

Windows 7 SP1 及以上 · 产品介绍页 https://www.apkeditor.cn/ai-version.aspx