这一阵子闲得蛋疼,就想着找点以前的老东西玩玩。小时候《龙珠》看得多,尤其喜欢那些格斗游戏。结果翻来翻去,发现市面上那些官方出的安卓游戏,要么逼着你氪金,要么就是纯粹的换皮。玩着真没劲。
发现与立项:老项目的泥潭
于是我开始在几个老外社区和国内的ACG论坛里翻。我记得以前看过一个老哥,自己用Unity捣鼓了一个像素风格的龙珠格斗框架,开放了部分源码。我当时就想着,如果能把这玩意儿在安卓上跑起来,并且自己改改参数,那多舒服。
我花了整整两天时间,从一个快要沉底的古老帖子里,找到了那个GitHub的链接。点进去一看,差点没给我气死。那上面写得清清楚楚:项目已经停更三年了,一次提交记录还是在四年前。我心想这跟当年我被老东家坑了的时候一样,明明知道这东西是好的,但它就是不让你顺利使用。
但我这人脾气硬,越是告诉我不能用,我就越要试试。我把项目代码用Git拉了下来。好家伙,代码量不大,但那个安卓编译环境,真是能折磨死人。原作者用的是老版本的JDK和Gradle,我机器上跑的都是最新的开发环境。我一编译,它直接就给我报了一堆兼容性错误。简直就是技术领域的“查无此人”。
实践记录:与过时依赖的搏斗
我没办法,硬着头皮开始干。我给自己列了个清单,目标就是把这个四年前的Unity安卓项目,在最新的Android Studio环境里跑起来。
- 第一步:回退版本?不可能的。
- 第二步:手动升级依赖。
- 第三步:处理资源文件路径。
- 第四步:权限和配置的补漏。
一开始我想着是不是直接把我的开发环境版本也降下来。结果发现不行,因为很多新的安卓系统特性和安全要求,老版本根本不支持。如果降版本,后期调试起来更麻烦,等于是给自己挖坑。
这是最耗时的一步。我打开了项目的文件,开始逐一对比那些红色报错的依赖库。很多旧的库名已经被弃用或者整合了。我必须去查官方文档,找到最新的替代品,然后手动修改版本号。
比如说,有一个旧的动画库,我换成了新的兼容包。每升级一个包,我就得重新同步一次项目,然后看它蹦出什么新的错误。有一次,我把粒子效果的库版本升错了,直接导致整个编译时间从五分钟飙到了十五分钟。我当时就骂,真是左手打右手,自己给自己找麻烦。
这个同人项目里面有很多盗版的音频和立绘,原作者的文件命名格式非常混乱,有些文件名字里甚至带中文。安卓系统识别起来有障碍。我花了整整一个下午的时间,写了个简单的脚本,对几百个资源文件进行了批量重命名,确保它们符合安卓的文件路径规范,没有特殊字符,然后重新打包进Asset文件夹。
折腾了三天,终于,那个绿色的“Build Successful”的提示跳出来了。我立马把生成的APK文件拷到我的旧手机上测试。第一次运行,手机屏幕一闪,又退回桌面了。我心想MMP,肯定又是兼容性问题。
我把日志拉出来一看,原来是在Manifest文件里少了个存储读写权限的声明。这个老项目可能没要求,但是新系统默认是禁止的。我赶紧回去补上,再次打包。
最终实现:虽然粗糙,但跑起来了
第二次运行,成功了!看到了那个熟悉的孙悟空的像素立绘,还听到了那个略显粗糙的背景音乐。游戏主界面虽然简陋,但至少功能是完整的。
试玩了一下。操作起来,攻击判定有点延迟,大招释放也有些卡顿,但至少,我成功把它在最新的安卓系统上跑起来了。那种感觉,比当年我找到国企那个朝九晚五的铁饭碗还要踏实。这个过程让我明白,很多时候,代码这东西,你不去硬啃,它就永远是个摆设,躺在那里等你放弃。
我现在正打算研究一下,能不能把新的角色模型加进去,让贝吉塔和布罗利也来一拳。这种自己动手,让老项目重获新生的乐趣,比玩那些官方的流水线游戏强太多了。现在的安卓开发环境,越来越复杂,但是只要你愿意沉下去,去解决那些看似无解的版本冲突,你会发现,任何停更的项目,都有被重新激活的可能。