模拟位置死活不动?免ROOT虚拟定位,拖个摇杆就走
【免费下载链接】GoGoGo一个基于 Android 调试 API + 百度地图实现的虚拟定位工具,并且同时实现了一个可以自由移动的摇杆项目地址: https://gitcode.com/GitHub_Trending/go/GoGoGo
做回归测试时你在地图上点了个模拟位置,目标 App 里的蓝点却纹丝不动——八成忘了在开发者选项里把它设为模拟位置应用。GoGoGo 就是个免 ROOT 的虚拟定位工具:百度地图选点,靠 Android 调试 API 改坐标,还带一个能拖着走的悬浮摇杆。
四步装好,门槛只有 Android 8.0 以上
环境硬条件就一条:Android 8.0 及以上,鸿蒙实测能跑,更老版本作者手里没有设备、不做适配。
- 拉源码:
git clone https://gitcode.com/GitHub_Trending/go/GoGoGo - Android Studio 打开工程,等 Gradle 同步完成——报 Java 相关错误时,先对齐
JAVA_HOME和 Studio 用的 JDK 版本,这是编译期最常见的翻车点 - 连接设备,编译安装后启动,依次授予定位、悬浮窗权限
- 进"开发者选项 → 选择模拟位置信息应用"选中 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 坐标换算)。
坑与边界:用之前先看
问题基本都出在模拟源和真实源打架上,另有几条边界要提前知道。
- 现象:模拟位置偶尔跳回真实位置。原因:Android 定位是多源融合,基站、WiFi 定位还开着时,真实信号会盖过测试 Provider,作者也承认这是调试 API 的固有问题。怎么办:目标 App 走高精度定位,关掉无关的联网定位,或换 WiFi 信号弱的环境再测。
- 现象:微信等腾讯系 App 完全没反应。原因:这类客户端有自己的定位校验逻辑。怎么办:README 原话是"建议去问一下腾讯",实操就是换个被测应用验证;遇到这类 App 先确认它读的是哪个定位源,再决定要不要继续折腾。
- 现象:Android 8.0 以下用不了。原因:作者手头机器就是 8.0,没有低版本设备做适配。怎么办:直接用 8.0+ 设备;鸿蒙系统实测可正常运行。
- 现象:编译时 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),仅供参考