我们学校有校园跑的要求,一学期得跑够多少公里。说实话天气好的时候跑跑还行,但一到期末或者连着下雨,就特别不想动。
就想着,能不能让它自己跑。
—— 先看看有没有现成的
先去 GitHub 上翻了翻,还真找到一个叫 MockGPS 的开源项目,是做 Android 虚拟定位的,能改系统的 GPS 坐标。
我的手机是一加 9RT,之前折腾过 Root,Magisk、LSPosed 这些都装好了,条件还行。
原版功能挺简单,就是选个点定位过去。我想加的主要是:
- 地图换成高德(我之前申请过 key)
- 加个摇杆,能手动控制走
- 让它能真的"跑"起来
—— 想简单了
第一版我写得很直接:沿着路线不断更新坐标不就完了?
跑了一下发现,地图上的小人确实在动,但跑步 App 里的公里数和配速一动不动。
查了才知道,跑步 App 不是只看 GPS 的,它还在读手机传感器:加速度(有没有颠簸)、陀螺仪(方向变化)、计步器、气压计这些。
你只改坐标,传感器是静止的,它就会觉得:位置在飘但手机没动,那大概是 GPS 信号漂移,不算数。
所以光改定位没用,得让手机"以为"自己真的在跑。
—— 后面的改动
知道原因之后就好办了,主要是几件事:
轨迹不能是一条直线,真人跑步不会那么标准,所以加了随机横向偏移,最多 8 米,看起来会左右晃一点。
操场绕圈的场景单独做了个椭圆循环模式,打开就能一直绕,顺便记圈数和累计距离。
刷新频率设成 500ms,太快容易出问题,太慢轨迹会有跳跃感。
Xposed 那边改了两个地方:一个是把 LocationManager 的几个重载都覆盖到;另一个是加了 FusedLocationHook —— 有些 App 不直接读系统定位,走的是 Google Play 的融合定位,那条路也得拦。
—— 卡住的地方
Xposed 模块那块卡了一会儿:启动提示"未检测到模块",但设置里显示的又是正常的。
后来发现是 MainHook 只在内存里设了 isModuleActive,没写进配置文件,App 重启读配置就读不到了。
改起来是一行的事,但排查花了不少时间 —— 这种"一半生效一半不生效"最折腾人,会让你怀疑是不是 hook 压根没生效。
—— 做完之后
原代码里没有这些功能,所以基本是从零往上加,不是修 bug。断断续续搞了一阵,最后是能用的。
做完最大的感觉是:得先搞明白对面在检测什么,不然改了半天都不知道为什么没用。写代码的时间其实没查原因的时间多。
(这个纯粹是自己手机上的折腾记录,Android 的模拟位置本来就是给开发调试用的。)
改造 MockGPS — 给虚拟定位加上「跑步」这件事
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法