我这人有个毛病,就是看不得好东西被语言墙给挡着。这个《家庭生活大帝国》,听说故事和系统都挺扎实,但是官方一直没有中文,网络上的汉化补丁也多是基于PC版的,安卓那一块儿,质量参差不齐,好多都是机翻,玩着实在膈应人。
第一次扒拉:找文本,挖资源
我想着既然网上没有靠谱的,那就自己动手。说干就干,我先去把原版的安卓安装包,就是那个APK文件,给弄到了手。第一步自然是拆包。很多人以为APK就是个压缩文件,也差不多,我用常用的解压工具一把就把它给扒开了。一堆文件结构就这么摊在面前,跟迷宫似的。
摸索的过程是最磨人的。
- 我怀疑是标准的安卓资源文件,那些XML文件,结果一通翻下来,只找到界面布局的文本,对话内容一个字都没有。
- 我又转向了Assets或者Data文件夹,这种小作坊游戏,资源一般都藏在这里。
- 终于在深处找到了几个扩展名奇奇怪怪的文件,打开一看,里面夹杂着大量的日文和各种游戏脚本。
我试着用文本编辑器打开,发现字符编码不对,一堆乱码。来来回回倒腾了半天,才确定是用了Shift-JIS编码,得用工具转成UTF-8才能看清楚。这个过程,光是找到正确的编码和工具,就花了快两天时间,差点没把我弄吐。
汉化与回填:编码和文件格式的战斗
资源文件是找到了,接下来就是汉化。我把所有日文文本都抽了出来,扔进一个大表格里,对着字典,对着语境,一点点地翻译和润色。这游戏内容量真不小,我估摸着得有几十万字,一个人搞简直就是给自己找不自在。
文本处理完毕后,我需要把这些汉化后的内容,准确无误地“塞”回原来的脚本文件里。这个回填过程,又是一场噩梦。
- 是格式问题,脚本里有很多特殊的控制符,比如控制人物表情、显示速度的标签,你得小心翼翼地保留这些标签,同时把中文插进去,多一个少一个都不行。
- 是长度限制。虽然都是文本,但是中文一个字占的位置跟日文不一样,如果我翻译的句子太长,超出了程序预设的显示框大小,游戏就会报错,或者直接闪退。我不得不把好多句子再三精简,搞得翻译都略显生硬了。
- 是编码再次确认。虽然我们是UTF-8,但为了让游戏读取不乱码,还得确保替换回去的文件,文件头和尾部的编码标记都是正确的,稍微搞错,游戏就会显示成方块字。
等到我把所有文本文件都换完,我长舒一口气,想着这下总该成了?我把修改好的文件,重新扔回原来的APK包里,压缩,然后扔到手机上,准备安装。
的拦路虎:安卓签名和对齐
结果,手机系统直接给我弹了个提示:“应用安装失败,证书不一致。”
我当时就愣住了,我没动程序,只是换了几个文本文件,怎么就证书不一致了?我赶紧上网查,才知道安卓系统为了安全,对每一个安装包都有数字签名。你只要动了安装包里的任何一个字节,这个签名就会失效,系统就会拒绝安装。
要安装修改过的APK,你就必须重新签名。这可不是随便点点鼠标就能搞定的。我得先搞到Java环境,然后学着用命令行工具,什么jarsigner,什么zipalign。
那几天简直是在跟命令行搏斗:
- 我得先用
keytool生成我自己的签名文件(keystore)。 - 接着用
jarsigner命令,对着我修改过的APK,用我自己的私钥重新签名。参数写错了多少次我已经记不清了,每次都要重新跑一遍。 - 最容易被忽略但最关键的一步,对齐优化(zipalign)。这个是为了让安卓系统更快地读取应用资源,虽然签名成功了,但不对齐,性能会很差,甚至有些系统还是会拒绝安装。
等我终于把这一套流程全部跑通,对着命令行屏幕上那个“成功”的提示,感觉比跑完马拉松还累。
我为什么这么折腾?这还得从我那次“退休”说起
你们可能觉得我闲得没事干,为了个游戏搞这么大阵仗。我搞这些东西,不是为了给别人提供服务,主要是给自己找点事做,证明自己还有点用。
前两年,我刚从原来的那个IT公司退下来,说好听点是提前退休,说难听点就是被“优化”了。我给公司卖命十几年,从头发茂密干到地中海,结果公司说业务调整,给了点补偿金让我走人。
一下子闲在家里,我老婆还觉得挺说我终于可以休息了。但人一旦闲下来,就容易胡思乱想,觉得自己是废人了。那段时间我整个人都蔫了,早上起来也不知道干什么,出去溜达一圈就回来对着电视发呆。我以前可是个每天要处理上千行代码的“码农”。
这个汉化项目,就是在那个时候开始的。我当时看到群里有人求这个游戏的安卓汉化,质量又差,我就突然想,与其在那儿焦虑,不如把以前搞技术那股劲拿出来,搞点实际的。不是为了赚钱,就是为了找回那种“我能解决问题”的感觉。
我从头开始学APK的逆向和重签名,从一个对安卓逆向一知半解的小白,硬生生把自己逼成了半个“签名专家”。
这个汉化版稳定地跑在我的测试机上,虽然只有我一个人在玩,但我心里特别踏实。这个过程,让我知道,我以前学的东西,经验和解决问题的能力,并没有随着我离开公司而消失。我只是换了个地方,继续当我的“技术宅”罢了。我再也不担心自己会彻底闲下来了,因为总有新的难题等着我去折腾。