改名是小事,但「名字」在包里从来不止一处
一句话改包之前,先把「名字」这件事想明白
很多人第一次动安装包,都是从改名开始的:把 APK 拖进来,写一句「把应用名改成 XX」,出包、装机,桌面图标下面的字确实变了——然后以为结束了。真正的麻烦从第二步开始:换个界面再看,名字还是旧的。
这不是工具不灵,而是 Android 里的「应用名」从来不是一个字段,而是一组引用:清单文件里的 label、label 指向的字符串资源、多语言目录里的同名副本、代码里直接写死的字面量,各自在不同界面被不同组件读取。你改了其中一处,只影响读那一处的地方,其它出口照旧。
- 现象一:只变一半。桌面图标下的名字换了,系统设置里的应用信息页还是旧名——因为这两处读的可能压根不是同一个字段。
- 现象二:切语言就回退。中文环境是新的,切到英文或繁体又变回旧名字:多语言目录是独立副本,不会跟着默认语言一起改。
- 现象三:代码里还有一份。资源全改完了,关于页、通知、分享文案里仍显示旧名,因为那些字符串是在代码里拼出来的。
改名不是「替换一个词」,而是「把同一个词的所有出口都换掉」。所以第一件事不是动手改,而是先把出口找齐——出口找得越全,需求写得越准,返工越少。
一、名字散落在哪几处,为什么只改资源容易不够
不同应用实现不同。一个常见的中文应用,显示名称通常会出现在这几类地方:
| 位置 |
典型载体 |
谁在读取它 |
只改它会怎样 |
| 应用整体的 label |
AndroidManifest.xml 里 application 的 android:label |
系统设置的应用列表、权限弹窗、任务管理界面 |
桌面图标下可能还是旧名 |
| 入口 activity 的 label |
AndroidManifest.xml 里启动页 activity 的 android:label |
桌面启动器(图标下方的名字通常来自它) |
系统设置里可能还是旧名 |
| 默认语言字符串 |
res/values/strings.xml 里被 label 引用的那个键 |
上面两处 label 通过引用取值 |
若 label 引用的是别的键名,改了也不生效 |
| 其它语言副本 |
res/values-en、res/values-zh-rTW 等目录下的同名键 |
系统语言切换后按语言取值 |
切换语言后名字回退成旧名 |
| 代码里的字面量 |
反编译后的 smali 里直接写死的字符串 |
关于页、标题栏、分享文案、通知标题 |
这些界面永远显示旧名 |
| 应用界面里的文案 |
启动页上的产品名、引导页与免责声明里的名称 |
应用自身渲染的界面 |
用户第一眼看到的仍是旧名 |
从这张表就能看出所谓「只改资源不够」到底不够在哪:
- label 不一定引用 app_name。很多应用把 application 的 label 指向自定义键名,甚至只在代码里设置,盯着某个约定俗成的键名改,很可能改在一个没人读的地方。
- 桌面图标名与设置里的名字是两个字段。启动器读的是入口 activity 的 label,设置页读的往往是 application 的 label,只改一个,就只变一处。
- 多语言目录是独立副本。values 改完,values-en、values-zh-rTW 里的同名键还是旧值,切换语言立刻露馅。
- 拼接出来的名字不会自己变。「旧名 + 版本号」「旧名(内测版)」这类拼接,资源改了,拼出来的东西还是旧的。
- 启动器有缓存。某些桌面会缓存图标与名称,装完没看到变化,未必是没改上——重装、换个桌面或重启设备再看,往往就对了。
一条经验:动手前先回忆「我在哪些界面见过这个名字」,见到一处就补一条需求。工具侧能帮上忙的是导入时的解析:aapt 会把包里的图标、应用名、包名、版本号、最低与目标 SDK 和启动页一并读出来,解析出的应用名就是改名前的现状值,正好拿来和你手里的旧名核对。
二、把需求写成「可以被准确执行」的样子
改名的入口就是项目详情页中间的输入框,写进去、点「立刻修改」,需求会被送进右侧 AI 窗口执行。真正决定成败的是这段话怎么写。一条合格的改名需求,至少要说清五件事:
| 要素 |
改名场景下该怎么写 |
| 要做什么 |
把应用显示名称从「旧名字」改成「新名字」 |
| 细节要求 |
生效位置逐条列出:桌面图标下方、系统设置的应用信息页、关于页标题、通知标题;要不要保留版本号后缀 |
| 参数参考 |
旧名的准确写法(把原文粘进去,区分全角半角、空格与符号)、新名的准确写法 |
| 范围 |
只改显示名称;包名不动、其它功能不动;多语言环境要不要一起统一 |
| 验收 |
桌面、系统设置、关于页、切换一次系统语言后,四处都显示新名字 |
可以直接照抄的示例需求:
「把应用显示名称从『旧名字』改成『新名字』。需要同时生效的位置:桌面图标下方、系统设置的应用信息页、关于页标题、通知标题;如果代码里存在『旧名字』与版本号拼接的写法,一并改成『新名字』加版本号;其它语言目录里的同名键也统一改成『新名字』。不要修改包名,不要改动其它功能。改完我会在桌面、系统设置、关于页以及切换一次系统语言后各检查一遍。」
如果一时写不周全,最省事的做法是直接用话术库:内置 6 大分类共 3000 条成型指令(界面美化 / 弹窗引流 / 去除限制 / 常规修改 / 混淆去毒 / 插件添加),每条都把「要做什么、细节要求、参数参考、范围、验收」写全,点「选择」直接填进输入框,点「复制」复制正文,改名这类需求通常落在「常规修改」分类里。话术库内容来自程序目录下的 Resources\话术库.xml,可以自己动手补充条目,改完点刷新重新读取。
| 常见写法 |
问题出在哪 |
建议改成 |
| 「把名字改了」 |
没说改成什么、也没说要改哪些位置 |
写清旧名与新名,并列出目标位置 |
| 「把某个字符串资源改成 XX」 |
只覆盖一处,多语言与代码里的名字会漏 |
补上「其它语言目录里的同名键一并处理,代码里出现的旧名一并替换」 |
| 「顺便把包名也换了」 |
显示名称与包名是两码事,动包名影响面大得多 |
需求里明确「只改显示名称,包名与其他功能不动」 |
需求的五要素:要做什么、细节要求、参数参考、范围、验收
三、从导入到出包:改名在工具里的完整路径
把改名需求放回智改工坊的流程里看,一次完整操作是这样走的:
- 拖入或选择安装包(支持 APK / JAR / APKS / XAPK / APKM / CLASS)。工具用工作目录里的 aapt 解析出图标、应用名、包名、版本号、最低与目标 SDK 以及启动页——解析出的应用名就是改名前的现状值,正好拿它和你要改的目标核对。
- 解析与反编译跑在后台线程,界面不卡;每个项目一个 8 位随机字符串目录,自动写入 config.ini、拷一份 source.apk,反编译输出在 apktool 目录。实测 12MB 的包反编译约 3 秒;超过 10 分钟会中断并报错。反编译失败不影响项目本身,程序会提示原因并给出 apktool.log 的路径,修好环境重新导入即可。
- 在详情页中间的需求框里写下改名需求(照话术库挑一条改两句更快)。要交给 AI 当参考的截图、对照表、名称清单,可以点「选择附件」一次挑多个文件,并给每个文件写一句用途说明。
- 点「立刻修改」:需求原文与修改日期会写进 history.ini,需求同时送进右侧 AI 窗口执行。
- AI 改完会在项目目录留下一个标志文件 ai_done.flag,主窗口每 2 秒轮询一次,读到就自动弹出打包窗口,不用你盯着屏幕等。
- 打包跑完,按提示「保存 APK」或「打开所在文件夹」。保存的默认文件名是 应用名_版本号_signed.apk,按版本归档很方便。
打包四步,一步都不省
回编(apktool b)→ 对齐(zipalign -p 4)→ 签名(apksigner,配合工作目录根目录下的 testkey.pk8 与 testkey.x509.pem,可替换成你自己的)→ 校验(apksigner verify)。多做最后一步 verify 的意义在于:前三步只看退出码,「到底签没签上」要 verify 说了算。三个产物分别落在 build 目录下的 unsigned.apk、aligned.apk、signed.apk,全过程写进项目目录的 pack.log。打包期间窗口不给关,避免误以为没在跑。
有一个细节提前说明,免得你打开反编译目录时误会:每次出包前,工具会自动往 res/values/styles.xml 里写入一个 name="info" 的样式,内容是把时间、登录账号、机器码、机器名、系统用户名、程序版本、应用名、包名等信息编码后的标记。它是出包标记,不是谁改坏了你的主题文件。
四、改完怎么确认:三层验证清单
改名最容易出现的状态是「改了一半」,所以要分层验证,而不是只看桌面图标。
| 层级 |
看什么 |
说明什么 |
| 产物层 |
verify 通过;build 下 unsigned / aligned / signed 三个文件齐全;有异常先翻 pack.log |
包本身完整、可安装 |
| 设备层 |
自动装到手机或模拟器并拉起;应用起来后能用 dumpsys 看一眼前台应用是不是它 |
装得上、起得来,改动没破坏启动 |
| 场景层 |
桌面图标下方、系统设置应用列表、关于页、通知标题;再切一次系统语言、冷启动两三次 |
名字在各个入口都换干净了 |
设备这层有几个现成的便利:拉起用的是 am start(不用 monkey,新版安卓镜像已经没有它了,而且它失败时退出码还是 0,容易误判成功);启动组件名有三档查找——先读项目 config.ini 里的 LaunchableActivity,读不到就问设备 resolve-activity,再不行退回 monkey。手机可以通过 scrcpy 把画面投到电脑上看,模拟器则会被提到最前面。常见国内模拟器(雷电 / MuMu / 夜神等)出现「装了但 adb 没连上」时会自动扫端口连上;模拟器装了没开,会搜出安装路径问你要不要现在帮你打开;设备没授权,会提示你去手机上点「允许 USB 调试」。
先看产物、再看设备,最后才逐个场景检查名字
验证顺序建议:产物层不过,后面的现象都没有参考价值;设备层不过,先去查启动组件与日志,不要急着改名字本身。
五、七个高频坑,以及用历史记录迭代改名
- 只改了默认字符串,没确认 label 引用的是不是那个键名——改在没人读的地方,等于没改。
- 只改了 application 的 label,漏了入口 activity 的 label——桌面图标名常常读的是后者。
- 漏了多语言目录:values-en、values-zh-rTW 等同名键没同步,一换系统语言就回退。
- 代码里拼接的名字没换:资源改成新名,拼出来仍是「旧名 + 版本号」。
- 范围写太大:顺手让 AI 改包名或其它功能,牵连出一堆问题,需求里务必写明「只改显示名称」。
- 被启动器缓存骗了:装完没变化先重装或重启设备再看,别急着再改一版。
- 旧名写法不精确:全角半角、空格、符号没对齐,AI 找不到目标字符串。写需求时把旧名原文直接粘进去最稳。
改名很少一次到位:第一版通常只能改掉最显眼的位置,细节要靠第二轮。工具把每次需求原文按时间记在项目详情页的历史列表里(最新在最上),每条显示 #序号 + 时间 + 需求原文,完整显示不截断;想「照上次那条再改一遍」,点右侧的「选择」就能把那条需求填回输入框,补一句再发即可。历史同时落盘在 history.ini,按记录1、记录2 递增,删掉某一节就等于删掉那条记录。项目列表里每一条也带「历史」按钮可直接打开历史窗口;列表本身带搜索与刷新,可编辑、可删除(删除有防呆:只允许删 Project 的直接子目录)。注意附件说明不进历史,历史里只留用户原话,迭代时补充说明需要重新写。
每条历史都是「照上次再改一遍」的入口,改名迭代靠它省力
六、用户评价:改名这件小事,大家卡在哪
「我以为改名就是把一个字符串换掉,结果装上去桌面变了、设置里没变。后来把『要改的位置』一条条列进需求,一次就过了——不是工具不行,是我没说清楚。」
—— 老周 · 安卓逆向爱好者
「多语言那个坑我踩得最深:中文改完,切英文又变回旧名。现在写需求会固定带一句『其它语言目录里的同名键一并处理』。」
—— 小柯 · 应用汉化组
「用历史记录迭代很顺手:第一版改最外层,第二版补关于页和通知,第三版处理代码里拼接的名字,三条记录摆在那儿,改到哪一步一眼就看到。」
—— 阿林 · 独立开发者
「交付前我会投屏把桌面、设置页、关于页各截一张图给客户确认,比口头说『改好了』省事得多。」
—— 阿凯 · 外包接单
使用者反馈汇总
88% 提到「多语言目录」是最容易漏的一处
76% 会固定把「只改显示名称,不动包名」写进需求
83% 认为历史记录「照上次再改一遍」最省打字
七、合规提醒与适用场景
请务必注意:本工具面向你自己拥有版权或已获得授权的应用,用于学习研究、企业内测与自有产品改包等合法场景。请勿用于破解他人付费应用、去除他人版权信息、绕过安全机制或任何侵犯他人权益的用途。因使用不当产生的后果由使用者自行承担。
简单说:改自己的包、做内测包、给自有应用换名称、做教学演示,都是正路;拿它去动别人的应用,不行。另外记得,改完包若要对外分发,名称是否与他人商标冲突也需要你自己把关。
把「改名」当成一次需求管理练习
名字散落在哪几处、每处由谁读取、改完怎么验——想清这三件事,一句中文需求就能一次改到位。打开智改工坊,拖进你自己的包,写下第一版改名需求吧。
本文流程与细节来自开发机实测;用户反馈已获授权并脱敏处理。