起心动念,就想试试
干这个“归巢”的安卓汉化,纯粹是闲得蛋疼。我翻出了家里那个一直吃灰的老平板,想找个不联网也能玩的游戏打发时间。在几个论坛上晃悠的时候,看到有老哥在求一个日系文字游戏的安卓汉化包,这游戏PC版都烂大街了,但安卓这块,愣是没人动它。
我这个人就是这样,越是没人干,我越想试试。我寻思着,既然PC版有现成的文本,我把它扒下来,塞进安卓包里,不就成了吗?想法很简单,但中间走的路,那叫一个曲折,差点没把我绕进去。
上手就是一闷棍
我搞到手了日文原版的APK文件,不大,一百多兆。第一反应,就是祭出我的老伙计Apktool,照着常规应用的路子,直接解包。我敲下回车,文件哗地跑出来,等我打开资源文件夹,我彻底懵了。
它把核心文本那部分,也就是几万字的剧情内容,压根没放进标准的里。它藏得深,塞进了一个我从来没见过的自定义文件格式里,后缀名都奇奇怪怪。这下就不是简单的翻译工作了,得先变成一个解密工作。我当时就骂了一句,这些开发商为了防汉化,真是下了血本。
我泡进了几个逆向工程的群里,到处问老哥们有没有见过这种打包方式。找了两天,终于找到一个热心的老哥,他给了我一个Python脚本,说这玩意儿就是专门对付这种魔改资源包的。我赶紧下载,试着跑了跑,还真管用!文本哗一下,全解包了出来,文件名还是日文,但内容总算是明明白白的了。
当翻译机器的那几天
文本是弄出来了,但量实在太大了。我把PC版的汉化文件也弄来,然后写了一个简单粗暴的匹配脚本。我的做法就是:
- 先比对:用脚本把安卓解包出来的文本行和PC版的汉化文本行进行比对,能对上的,直接复制粘贴。
- 再人工:对不上的,通常是程序内部的标识符或者版本更新导致的内容差异,这部分我只能自己对着游戏截图,硬着头皮去翻。
- 校对:找了两个朋友,我把翻译好的文本扔给他们,让他们看看有没有明显的机翻痕迹或者语句不通顺的地方。
忙活了快一周,总算把所有的核心剧情文本全都搞定了。接下来就是回填。我运行了那个解密脚本的反向操作,把所有的中文文本重新打包、重新加密,塞回了APK的资源目录里。这步看起来简单,但中间只要有一行文本的长度超过了原日文的长度限制,程序运行时就会直接崩溃。
跟编译工具打架
文本搞定了,但还没完。安卓应用在显示文字时,如果默认字体不支持中文,显示出来就是一堆“口口口”,所以必须把字体文件也塞进去。
我找了一个开源的中文字体文件,体积很大,直接扔进了Assets文件夹。然后,我得去修改Smali代码,找到应用启动时加载字体的那部分代码,把路径指向我新塞进去的中文字体文件。这个过程非常考验耐心,因为Smali代码就像汇编语言,密密麻麻,看一眼都头疼。
好不容易改完了代码,我开始回编译。Apktool报了一堆错。我反复检查,才发现是我的签名文件有点问题,或者说是编译环境的问题。我换了一个版本的Java环境,然后重新操作,总算是把新的APK文件给编译了出来。
一步,签名。我用自己的调试证书给它签了名,然后信心满满地把文件传到平板上,点击安装,点击打开。
结果,白屏!
我当时气得想把平板扔出去。冷静下来,我用Logcat工具看了一下,发现是程序在加载资源的时候卡死了。我回过头去扒开资源文件夹,发现原来是Apktool在回编译的时候,把一些启动画面和图标的配置给漏掉了。我手动把缺失的XML配置补齐,重新编译,重新签名。
这回再点开,中文界面终于完整地展现出来了。虽然折腾得够呛,但看着自己亲手完成的汉化能在老平板上跑起来,那种成就感,真不是吹的。我把这个包发到群里,让大家也试试,算是给这回折腾画了一个圆满的句号。