ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

模拟位置死活不动?免ROOT虚拟定位,拖个摇杆就走

模拟位置死活不动?免ROOT虚拟定位,拖个摇杆就走

模拟位置死活不动?免ROOT虚拟定位,拖个摇杆就走

【免费下载链接】GoGoGo一个基于 Android 调试 API + 百度地图实现的虚拟定位工具,并且同时实现了一个可以自由移动的摇杆项目地址: https://gitcode.com/GitHub_Trending/go/GoGoGo

做回归测试时你在地图上点了个模拟位置,目标 App 里的蓝点却纹丝不动——八成忘了在开发者选项里把它设为模拟位置应用。GoGoGo 就是个免 ROOT 的虚拟定位工具:百度地图选点,靠 Android 调试 API 改坐标,还带一个能拖着走的悬浮摇杆。

四步装好,门槛只有 Android 8.0 以上

环境硬条件就一条:Android 8.0 及以上,鸿蒙实测能跑,更老版本作者手里没有设备、不做适配。

  1. 拉源码:git clone https://gitcode.com/GitHub_Trending/go/GoGoGo
  2. Android Studio 打开工程,等 Gradle 同步完成——报 Java 相关错误时,先对齐JAVA_HOME和 Studio 用的 JDK 版本,这是编译期最常见的翻车点
  3. 连接设备,编译安装后启动,依次授予定位、悬浮窗权限
  4. 进"开发者选项 → 选择模拟位置信息应用"选中 GoGoGo——漏掉这步一切白搭,应用内检测到未设置时也会弹窗直接带你跳转

装完启动,你看到的主界面就是一张百度地图,点哪算哪,右下角按钮一按模拟定位服务就跑起来,通知栏会挂一个常驻图标。

三个高频场景:卡住的点都在这儿

卡住你的基本是三类情况:想让位置动起来、想快速回固定点、手上只有一串坐标。

让蓝点持续走起来:摇杆模拟位置移动

测路径规划或运动轨迹时,一个静态坐标根本不够用,位置得"一直在走"。

  • 点地图左侧的摇杆按钮调出悬浮摇杆,通知栏快捷按钮也能控制它显隐
  • 摇杆指向哪个方向,模拟位置就按当前速度朝哪个方向位移
  • 速度能在设置里调,步行、跑步、骑行的节奏都能对上
  • 悬浮窗模式下可以直接在摇杆面板里搜点、选点,不用切回主界面

效果:目标 App 看到的位置每 100ms 刷一次,表现是持续移动而不是瞬移。

固定点位反复切:搜索与历史记录秒回

同一批点位反复测,每次重新搜一遍地名既慢又容易搜串。

  • 点搜索图标输入关键词,从 POI 结果列表里点选即设点
  • 用过的地点自动存进历史,菜单进历史页点一下就能跳回去
  • 从历史列表选点时还能加随机偏移,避免每次都落在同一组坐标
  • 历史页工具栏带下载、分享、清空,测完把点位列表直接发给同事

效果:配合几个常测点位,回归时切点基本是秒回。

手上只有经纬度:WGS84 与 BD09 坐标系换算

工单里贴的坐标往往是 WGS84,直接贴进百度地图会偏出几百米,还得手动换算。

  • 打开坐标输入入口,填入经纬度
  • 坐标系可选 GPS(WGS84) 或 BD09;选 WGS84 时由MapUtils的wgs2bd09自动换算成百度坐标系
  • 地图上先确认落点位置对了,再点"传送"
  • 确认后地图居中落点,直接启动模拟

效果:不用再拿别的 App 手动算偏移量。

模拟位置的原理:测试 Provider 接管 LocationManager

说白了,GoGoGo 干的就一件事:用LocationManager的测试 Provider 机制,把 GPS 和网络定位两个数据源接管过来。启动时先addTestProvider注册测试源,参数照抄系统真实 Provider 的属性(作者用调试器截了图存在仓库里),再开一条独立HandlerThread,上面的 Handler 每 100ms 把当前坐标装进一个新的Location对象写进系统:

// 把"当前坐标"包装成一次真实 GPS 上报,每 100ms 执行一次 Location loc = new Location(LocationManager.GPS_PROVIDER); loc.setAccuracy(Criteria.ACCURACY_FINE); loc.setLatitude(mCurLat); loc.setLongitude(mCurLng); loc.setAltitude(mCurAlt); loc.setBearing(mCurBea); loc.setSpeed((float) mSpeed); loc.setTime(System.currentTimeMillis()); mLocManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, loc);

GPS 和网络定位两个源都注册、都喂同一个坐标,是因为不同 App 有的只读 GPS、有的只读网络定位,漏喂一个就可能被判定为信号异常。

摇杆自己不直接写位置,它只以"每秒位移量 + 方向角"回调onMoveInfo,由ServiceGo按"1 度纬度 ≈ 110.574km"的换算更新当前坐标,下一个 100ms 周期自然带出去。

想深挖看这几个文件:ServiceGo.java(测试 Provider 注册、100ms 定位循环、通知栏控制)、JoyStick.java(摇杆手势与速度换算)、MapUtils.java(WGS84/BD09 坐标换算)。

坑与边界:用之前先看

问题基本都出在模拟源和真实源打架上,另有几条边界要提前知道。

  1. 现象:模拟位置偶尔跳回真实位置。原因:Android 定位是多源融合,基站、WiFi 定位还开着时,真实信号会盖过测试 Provider,作者也承认这是调试 API 的固有问题。怎么办:目标 App 走高精度定位,关掉无关的联网定位,或换 WiFi 信号弱的环境再测。
  2. 现象:微信等腾讯系 App 完全没反应。原因:这类客户端有自己的定位校验逻辑。怎么办:README 原话是"建议去问一下腾讯",实操就是换个被测应用验证;遇到这类 App 先确认它读的是哪个定位源,再决定要不要继续折腾。
  3. 现象:Android 8.0 以下用不了。原因:作者手头机器就是 8.0,没有低版本设备做适配。怎么办:直接用 8.0+ 设备;鸿蒙系统实测可正常运行。
  4. 现象:编译时 Gradle 报 Java 版本错。原因:环境变量里的JAVA_HOME与 Android Studio 用的 JDK 不一致。怎么办:把两处版本对齐即可。

不同 App 对位置的态度差很多,先对号入座再调参:

应用类型常见定位策略模拟表现建议
导航类GPS+网络高频更新基本生效,实时刷新用合理移动速度,避免瞬移
社交/游戏类网络定位或简化逻辑基本生效,偶发跳变别短时间跨城市,加微小随机偏移
校园运动类专门反作弊校验明确不支持开发者已声明不做适配

README 里专门写了警告:本工具不支持任何校园运动类 App 的作弊行为,开发者也不赞同采用任何形式在校园运动中作弊。这条不是技巧问题,是边界问题,别拿它去刷课。

和别的方案比,选哪个

四个方向比下来,GoGoGo 赢在交互成本而不是能力上限。

维度GoGoGo需 ROOT 的模拟工具其他免 ROOT 同类工具开发者选项手动模拟
操作方式地图点选+摇杆命令/配置为主点选为主手动改参数
连续移动模拟摇杆持续位移部分支持基本不支持不支持
坐标系换算BD09/GPS 均支持部分支持基本不支持不支持
位置历史保存内置自动存部分有部分有无

只验证一个静态坐标,系统开发者选项就够;要做轨迹模拟、或在多个预设点位间反复切换,选 GoGoGo 交互成本最低。需要 ROOT 的场景不多见——路径模拟、点位切换、坐标系换算,它都免 ROOT 做到了。

搭着用的几样东西

单独一个都解决不了定位问题,但搭着用能省一半排查时间。

  • ADB + logcat:看目标 App 的定位回调日志
  • GPS Test 类应用:交叉验证精度与刷新频率
  • Charles:抓包判断是否走服务端校验
  • 百度地图开放平台文档:查地图、POI 与坐标转换 API

下次回归再点完地图,那个不动的蓝点会自己走起来——前提是开发者选项里那一下没忘。

【免费下载链接】GoGoGo一个基于 Android 调试 API + 百度地图实现的虚拟定位工具,并且同时实现了一个可以自由移动的摇杆项目地址: https://gitcode.com/GitHub_Trending/go/GoGoGo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进