Skip to content

feat: 支持通过 adb broadcast 远程设置定位坐标#393

Open
MSCMonster wants to merge 1 commit into
ZCShou:masterfrom
MSCMonster:feat/adb-set-location
Open

feat: 支持通过 adb broadcast 远程设置定位坐标#393
MSCMonster wants to merge 1 commit into
ZCShou:masterfrom
MSCMonster:feat/adb-set-location

Conversation

@MSCMonster

@MSCMonster MSCMonster commented Jun 27, 2026

Copy link
Copy Markdown

Closes #176

改动概述

ServiceGo 增加一个动态注册的 BroadcastReceiver,监听自定义 action com.zcshou.gogogo.action.SET_LOCATION,复用已有的 ServiceGoBinder.setPosition() 路径更新经纬度与海拔。

适用场景:自动化测试、脚本批量切换位置、CI 环境下的定位模拟等无需手动操作 UI 的场合。

使用方法

服务必须先通过 APP UI 启动一次(让 receiver 注册),随后可在 adb 中执行:

adb shell am broadcast -p com.zcshou.gogogo \
    -a com.zcshou.gogogo.action.SET_LOCATION \
    --ed lat <纬度> --ed lng <经度> [--ed alt <海拔>]

示例(注入上海外滩):

adb shell am broadcast -p com.zcshou.gogogo \
    -a com.zcshou.gogogo.action.SET_LOCATION \
    --ed lat 31.2304 --ed lng 121.4737 --ed alt 10

广播到达后,GPS 与 NETWORK 两个 mock provider 会在 100ms 内同步刷新,摇杆的当前位也会一并更新。

设计说明

  • 零侵入:完全复用已有 ServiceGoBinder.setPosition() 路径,没有引入新的位置写入逻辑
  • 生命周期对齐onCreate()initAdbReceiver() 注册,onDestroy() 中反注册(包了 IllegalArgumentException 兜底)
  • 不修改 manifest:receiver 为动态注册,ServiceGo 仍保持 exported=false
  • 参数校验lat ∈ [-90, 90]lng ∈ [-180, 180],越界忽略;alt 可选,缺省沿用当前值
  • target SDK = 32:暂不需要 RECEIVER_EXPORTED 显式 flag,注释中已留备忘,未来升 33+ 时一并加上

取舍点(请 reviewer 决定是否需要加强)

当前实现 没有对调用方做鉴权,任意 APP 只要知道 action 名都能发广播改坐标。考虑到本身就是定位修改类工具、坐标本来就由用户决定,影响有限。如果维护者认为需要加强,可以追加 signature 级 permission 或 Binder.getCallingUid() == Process.SHELL_UID 校验,欢迎在 review 中指出偏好,我会跟进调整。

测试

在 Xiaomi 13 Ultra (HyperOS, Android 14) 上实测:

  • ✅ Receiver 正确注册(dumpsys activity broadcasts 可见 SET_LOCATION filter)
  • ✅ 外滩坐标 31.2304, 121.4737 注入后 dumpsys location 的 GPS / NETWORK provider last mock location 立即变更
  • ✅ 1 秒内可热切换到天安门 39.9087, 116.3975
  • alt 缺省时正确沿用 mCurAlt
  • ✅ 服务销毁后 receiver 反注册无异常

Register a dynamic BroadcastReceiver in ServiceGo that listens for
com.zcshou.gogogo.action.SET_LOCATION and reuses ServiceGoBinder.setPosition()
to update lat/lng/alt. Enables scripted / automated coordinate injection
without touching the UI; both GPS and NETWORK mock providers refresh within
100ms and the joystick current position is kept in sync.

Usage (service must be started from the UI first so the receiver is alive):

    adb shell am broadcast -p com.zcshou.gogogo \
        -a com.zcshou.gogogo.action.SET_LOCATION \
        --ed lat <latitude> --ed lng <longitude> [--ed alt <altitude>]

README updated with the full command, parameter notes and caveats.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] 添加 ADB 定位控制功能

1 participant