对某手游更新资源进行本地缓存加速的笔记
之前看阿夸联动玩 Lastidea，然后我也跟风玩了下，嗯副本贼难出货感人，用 MMORPG 模式做手游真以为自己是端游啊。然后我这破 820 在 2019 究竟能不能用呢？玩崩崩崩很难全程 60 帧了，玩玩方舟或少前这些低端画面的手游还是可以的。不可能为了个破手游而换个新手机吧，反正我平常都是呆在电脑前，那就用模拟器玩呗。 然后用模拟器愉快的打了几波副本，跟手机的 PPT 般的帧数比真的是舒服得多咯（毕竟辣鸡优化）。然后吃饭的时候想用手机玩，但tm打开手机后登录游戏就会报错，大意应该是 Token 失效，右上角的按钮复原也没用，那就只好清数据了重下数据才能登回游戏。但模拟器的体验实在是太好了，想办法自己试试解决这问题看看。 我用吊思考了一下午，试了以下几个方法 1. 备份两端的游戏数据 首先，我的手机没 root ，没有钛备份来备份数据非常麻烦，用 adb 来备份数据的话，备份出来的数据大小只有 1K，而且是没有相关内容的。就很烦，为了这破游戏又要解锁手机太浪费时间了，所以就不用这方法了 2. 学岛风狗那种正向代理缓存 留下了不会编程的眼泪。 3. 抓包修改跟手机端相同的 Token 这个还没测试过，感觉难度可能很大。而且我试过应用双开克隆了客户端再登录好像会提示错误。以后再试试 4. 将游戏反向proxy并将数据包拖到网站 这个姑且解决该问题，但是操作还是蛮多的，估计我用正向代理做的话可能没那么麻烦，可能还比反向高效得多。 # 获取游戏更新资源 首先我用个虚拟机搭个 Nginx 做反向proxy的服务器，直接用桥接模式。平台直接用宝塔的懒得折腾了。 通过 Fiddler 抓包看到这游戏的更新服务器是 `cache-lastidea.sqex-edge.jp` ，那就建个反向proxy吧，主机域名与游戏更新服务器域名一样，通过更改 `hosts` 实现就行了。 反向proxy配置如下 `try_files $uri @missing;` 是判断本地目录有没有同文件，如果没有就跳转到 missing 块反代下载，毕竟到后面我们就不依赖 nginx 自身缓存了。（为了适应以后我不维护该更新项目，如果有新的更新资源不用我自己补充，让服务器自己回源下载） ``` location / { try_files $uri @missing; } location @missing { expires 30d; proxy_pass https://cache-lastidea.sqex-edge.jp; proxy_set_header Host cache-lastidea.sqex-edge.jp; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; add_header X-Cache $upstream_cache_status; } ``` 最后使用在 Github 随便找的[自签泛域名证书](https://github.com/Fishdrowned/ssl)生成个 HTTPS 证书，解决证书问题，再把证书丢到 mumu 模拟器中就可以暂时避免证书问题了。 ## 查看 access.log 过滤游戏所有资源 傻逼游戏直接丢数据包（/Android/data/com.....）不认，非要直接重下才认数据包。使用反向的缓存有个问题就是速度比直接读本地目录慢得多，为了解决该问题得想办法把所有数据的 URL 拖出来才行，用 Fiddler 当然可以，但我也就刚开始碰这工具不是很熟练，那就直接看 nginx 的响应日志就简单了。 查看 access.log ，会有以下内容，IP、时间、请求、URL、用户设备类型会显示出来，我们就看同一小时段的日志复制出来，再用正则表达式过滤掉相同 IP/时间/设备类型/重复行 就可以了。 ``` 192.168.123.111 - - [07/May/2019:14:35:45 +0800] "HEAD /archive/dlarc/Android/20190405155346/effects_common HTTP/1.1" 200 0 "-" "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3000 Build/PKQ1.181203.001)" 192.168.123.111 - - [07/May/2019:14:35:45 +0800] "GET /archive/dlarc/Android/20190405155346/effects_common HTTP/1.1" 206 2083541 "-" "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3000 Build/PKQ1.181203.001)" 192.168.123.111 - - [07/May/2019:14:35:46 +0800] "HEAD /archive/dlarc/Android/20190403151634/character/female/hair/hair_f10 HTTP/1.1" 200 0 "-" "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3000 Build/PKQ1.181203.001)" 192.168.123.111 - - [07/May/2019:14:35:46 +0800] "GET /archive/dlarc/Android/20190403151634/character/female/hair/hair_f10 HTTP/1.1" 206 493473 "-" "Dalvik/2.1.0 (Linux; U; Android 9; ONEPLUS A3000 Build/PKQ1.181203.001)" ``` 过滤完毕的结果 ![TIM截图20190507145349.jpg](https://cdn.lowb.ren/s/2019/05/161334623.jpg) ## 下载游戏资源 直接拿游戏现成的数据包太费时间了，傻逼才会根据 URL 来建立目录丢文件。在网上有方法可以用 node.js 或 java 根据 URL 批量生成文件夹并下载到指定目录，但对于我留下不会编程的眼泪并且一个IDE都没有的我只好使用 wget 来批量下载了，使用以下两个参数也可以做到相同的效果。 `wget -xi download.txt` - -x, –force-directories 强制创建目录 - -i, –input-file=FILE 下载在FILE文件中出现的URLs # 一波设置丢真机游戏测试 以上方法是我头疼了两天才搞定的，如何把好好的五一假期浪费掉，那就去研究没用的东西吧 ## 没root怎么强行将域名解析到本地 首先我没 root，那就只能去酷安找找一些免 root 的工具实现 hosts 功能。 好在我路由器是 openwrt，改个 hosts 就行了 ## 怎么更新还报错了？ 继承之后终于弹出更新通知了，当我觉得可以的时候，点击更新就马上报错了，浏览器可以直接访问游戏更新服务器，也没提示证书错误（在此之前我已经导入证书了），但为什么到游戏就不行呢。 翻了下谷歌，是因为 `SSL Pinning` 这东西在作怪，在 MuMu 模拟器好像没有这东西，可能是 7.0 后谷歌就添加这个安全策略了。什么是 `SSL Pinning`，简单来说就是防止中间人攻击的技术，APP 也存放了服务器的私钥，我们添加的证书的公钥是对不上密钥的，所以游戏不会认我们自己生成的证书。 ### 突破 谷歌一下，利用 JustTrustMe 就可以解除 SSL 证书的认证，但代价需要上 Xposed ，问题不大用太极或 VirtualXposed 就行了。但测试两个 APP，还是失败。打开浏览器随便访问个 https 的网站，就会报错 `ERR:FAILED`，感觉所有证书系统都不认了。 正当我以为我所有努力都木大的时候，我翻了下 JustTrustMe 的 issue，就有大佬提到这个问题，好像作者也修了。但，release 还是 2016 的档，我不可能为了这 APP 又下个 Android 的 IDE 平台吧。于是让我的安卓开发大佬兼以前舍友帮忙 build 一个，丢到 VXposed 就 OK 了，该破问题终于解决了。 # 成果，总结与缺点 **啧啧，直接把游戏目录的 Pack 备份起来，等继承之后直接把 Pack 的内容还原回去，再进入游戏就不用下了。就只有我这个傻吊浪费那么多时间搞这个。** 用文件管理器打开 `/Android/data/com.square_enix.android_googleplay.lastidea/files/`，将 Pack 目录压缩好并迁移到外面。然后清理数据后，打开游戏先正常继承好账号，进入下载页面后关闭游戏，再将压缩包的内容还原到上面的目录，重开游戏黑屏二十多秒后再进入游戏就不用下数据直接玩了。 搞定之后，游戏的更新速度终于 1 分钟就搞定了，切号没有什么大问题了。 以上流程可以简单概括为 `利用 Nginx 的反向代理判断文件是否存在并缓存远程对端资源与手动下载对端资源文件，同时解决双向证书认证问题，随后资源本地指向到本地设备`，算了我也看不懂我在写什么鸡儿。缺点还是蛮多的，没有岛风狗那种有客户端就能本地缓存到手机，而不是像我用服务器来缓存，而且如果出去的话忘记下回资源还是得用自己的流量或加速器下回来。 那我什么时候才可以做到岛风狗和ACGP的那种效果呢？学习开发，请 要不是为了阿夸联动，我会玩这游戏？当我60级后才得知月底的阿夸联动只送一个背景和称号，我明白我已经很难回头了。