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:
2026-09-27 16:24:33 +03:00
parent 0f6f07782f
commit e5d2fa24a1
2 changed files with 45 additions and 29 deletions
+44 -28
View File
@@ -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` молча уходил
в старую версию. Строку убрали.
---
+1 -1
View File
@@ -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"