mercury 0.1.1-SNAPSHOT (fixed enableWirelessAdb URI); B-2 resolved
Phone now self-provisions after a glasses reboot: BLE enableWirelessAdb -> glasses start wireless adb -> address back over BLE -> adb connect -> Shizuku started + accessibility/media grants applied. Verified on device 16:22 (glasses rebooted, adb_wifi_enabled=0, nothing activated over USB).
This commit is contained in:
+44
-28
@@ -32,39 +32,55 @@ Wi-Fi/network fallback.
|
||||
|
||||
---
|
||||
|
||||
## B-2 · rayneo-mercury: `enableWirelessAdb` через BLE на X3 Pro не возвращает адрес
|
||||
## B-2 · rayneo-mercury: `enableWirelessAdb` через BLE не работал — РЕШЕНО
|
||||
|
||||
**Когда выяснено:** 2026-09-27, аудит прошивки RayNeoLauncher по smali
|
||||
(`adb pull /system/app/RayNeoLauncher`).
|
||||
**Когда выяснено:** 2026-09-27. **Симптом:** после ребута очков provisioning не
|
||||
проходил — телефон писал «не удалось получить адрес ADB over WiFi на очках»,
|
||||
Shizuku на очках не поднимался (хотя Wi-Fi и BLE у обоих были живы).
|
||||
|
||||
**Что происходит (по smali + логам):**
|
||||
1. Телефон шлёт BLE-команду `ble.request.debug` с `payload.cmd="enableWirelessAdb"`.
|
||||
2. Очки **принимают** команду и реально поднимают беспроводной adb (мы видим
|
||||
`adb_wifi_enabled=1` и `service.adb.tcp.port` после). **Это работает.**
|
||||
3. Очки **должны** прислать событие `WirelessAdbAddress` обратно. **Это не происходит.**
|
||||
4. В smali `BleResponse` есть `RESPONSE_MAP`, в котором зарегистрированы Wi-Fi / media /
|
||||
netconfig ответы — но **`DebugResponse` отсутствует**. Поэтому маршрутизация ответа
|
||||
по URI `ble.request.debug` не настроена, и событие теряется.
|
||||
5. Телефон вечно ждёт `Event.WirelessAdbAddress`, не получает его и уходит в таймаут.
|
||||
**Настоящая причина — одна и она наша:** библиотека `rayneo-mercury` слала команду
|
||||
не на тот URI.
|
||||
1. Очки разбирают входящие кадры по таблице `RESPONSE_MAP[uri]` (`BleResponse` из
|
||||
`RayNeoLauncher`), и debug-ответ зарегистрирован **только** как
|
||||
`"ble.response.debug"` → `DebugResponse`.
|
||||
2. Наша `Commands.Debug.enableWirelessAdb()` слала `"ble.request.debug"` — это
|
||||
направление очки→телефон.
|
||||
3. Итог: кадр доходил до очков и **молча выбрасывался** в
|
||||
`BleServerV2.handleMobileCommand` — не совпал ни с `"brt"`, ни с `RESPONSE_MAP`.
|
||||
Ни обработки, ни ошибки, ни лога.
|
||||
Полный JSON, который уходил: `{"uri":"ble.request.debug","payload":{"cmd":"enableWirelessAdb"}}`.
|
||||
|
||||
**Что это значит для provisioning:**
|
||||
- Команда `enableWirelessAdb` через BLE **включает adb** — но адрес `ip:port` мы узнать не можем.
|
||||
- Provisioning сейчас работает только потому, что **adb уже был включён раньше** (например,
|
||||
руками или через shizuku) и не выключился после ребута. После ребута очков — если
|
||||
`adb_wifi_enabled` сбросится в 0 — provisioning сломается, потому что новый адрес мы
|
||||
узнать не сможем.
|
||||
Раньше «адрес не приходит» трактовалось как «очки не отвечают» — на деле очки не
|
||||
получали команду, поэтому и адрес было некому слать. (Сам адрес очки шлют назад как
|
||||
`ble.request.debug` + `payload.cmd="WirelessAdbAddress"` — это направление
|
||||
корректно и у нас уже разобрано.)
|
||||
|
||||
**Обходной путь (уже работает):**
|
||||
```bash
|
||||
# Через shizuku shell на очках:
|
||||
service call adb 4 i32 1 s16 'Caffeine Portable' # включить adb
|
||||
settings put global adb_wifi_enabled 1 # не дать ему автоотключиться
|
||||
```
|
||||
После этого `adb_wifi_enabled` остаётся 1, телефон через mDNS `_adb-tls-connect._tcp`
|
||||
находит `ip:port` и подключается. Это уже используется как fallback в `AdbController`.
|
||||
**Ground truth — стоковое приложение телефона `com.rayneo.mercury`:**
|
||||
`cn.rayneo.mercury.connectivity.util.GlassesDebugCommands.enableWirelessAdb()` кладёт
|
||||
в `BleResponsePipeline` именно `DebugResponse(Payload(cmd="enableWirelessAdb"))`, а у
|
||||
`DebugResponse` `uri == "ble.response.debug"`. Лишние поля не читаются — обработчик
|
||||
очков (`DebugKnife.observeBleWirelessDebugCommand`) матчит только `payload.cmd` и сам
|
||||
вызывает `RayNeoAdbService.enableWirelessAdb(true, <текущий ssid>)`.
|
||||
|
||||
**Следующий шаг:** при первом удобном случае — поднять через shizuku-shell и убедиться,
|
||||
что provisioning пройдёт полностью через этот путь.
|
||||
**Фикс:** `Commands.Debug.enableWirelessAdb()/disableWirelessAdb()` → `Uris.RESPONSE_DEBUG`;
|
||||
библиотека опубликована как `0.1.1-SNAPSHOT`, в `rayneo-vm/gradle/libs.versions.toml`
|
||||
`mercury = "0.1.1-SNAPSHOT"`.
|
||||
|
||||
**Проверено на устройстве 2026-09-27 16:22** (очки перезагружены, `adb_wifi_enabled=0`,
|
||||
по USB ничего не активировал — всё делает телефон):
|
||||
1. `ble.response.debug` → `DebugResponse dispatched` → `RayNeoAdbService: alwaysAllow=true,
|
||||
bssid=O2 5` → `open wireless adb success: true` → на телефон вернулся адрес
|
||||
`192.168.76.248:41395`. Первый ответ бывает `ip:-1` (порт ещё не назначен), через ~0.6 c
|
||||
приходит второй, валидный.
|
||||
2. Телефон: `ShizukuProvisioner: starting server... shizuku_starter exit with 0` →
|
||||
`Shizuku поднят` (`pidof shizuku_server` = 4104).
|
||||
3. `AccessibilityProvisioner` включил `VmAccessibilityService` через тот же adb.
|
||||
|
||||
mDNS-fallback в `AdbController` остаётся как страховка.
|
||||
|
||||
**Побочный урок:** `~/.gradle/gradle.properties` содержал левый
|
||||
`mercuryVersion=0.1.0-SNAPSHOT`, который перебивал проектный, — `publish` молча уходил
|
||||
в старую версию. Строку убрали.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ composeBom = "2026.09.00"
|
||||
shizukuApi = "13.1.5"
|
||||
shizukuProvider = "13.1.5"
|
||||
navCompose = "2.10.2"
|
||||
mercury = "0.1.0-SNAPSHOT"
|
||||
mercury = "0.1.1-SNAPSHOT"
|
||||
mercuryTransport = "0.1.1-SNAPSHOT"
|
||||
mercuryBinocular = "0.1.0-SNAPSHOT"
|
||||
mercuryShizuku = "0.1.0-SNAPSHOT"
|
||||
|
||||
Reference in New Issue
Block a user