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 **Когда выяснено:** 2026-09-27. **Симптом:** после ребута очков provisioning не
(`adb pull /system/app/RayNeoLauncher`). проходил — телефон писал «не удалось получить адрес ADB over WiFi на очках»,
Shizuku на очках не поднимался (хотя Wi-Fi и BLE у обоих были живы).
**Что происходит (по smali + логам):** **Настоящая причина — одна и она наша:** библиотека `rayneo-mercury` слала команду
1. Телефон шлёт BLE-команду `ble.request.debug` с `payload.cmd="enableWirelessAdb"`. не на тот URI.
2. Очки **принимают** команду и реально поднимают беспроводной adb (мы видим 1. Очки разбирают входящие кадры по таблице `RESPONSE_MAP[uri]` (`BleResponse` из
`adb_wifi_enabled=1` и `service.adb.tcp.port` после). **Это работает.** `RayNeoLauncher`), и debug-ответ зарегистрирован **только** как
3. Очки **должны** прислать событие `WirelessAdbAddress` обратно. **Это не происходит.** `"ble.response.debug"` → `DebugResponse`.
4. В smali `BleResponse` есть `RESPONSE_MAP`, в котором зарегистрированы Wi-Fi / media / 2. Наша `Commands.Debug.enableWirelessAdb()` слала `"ble.request.debug"` — это
netconfig ответы — но **`DebugResponse` отсутствует**. Поэтому маршрутизация ответа направление очки→телефон.
по URI `ble.request.debug` не настроена, и событие теряется. 3. Итог: кадр доходил до очков и **молча выбрасывался** в
5. Телефон вечно ждёт `Event.WirelessAdbAddress`, не получает его и уходит в таймаут. `BleServerV2.handleMobileCommand` — не совпал ни с `"brt"`, ни с `RESPONSE_MAP`.
Ни обработки, ни ошибки, ни лога.
Полный JSON, который уходил: `{"uri":"ble.request.debug","payload":{"cmd":"enableWirelessAdb"}}`.
**Что это значит для provisioning:** Раньше «адрес не приходит» трактовалось как «очки не отвечают» — на деле очки не
- Команда `enableWirelessAdb` через BLE **включает adb** — но адрес `ip:port` мы узнать не можем. получали команду, поэтому и адрес было некому слать. (Сам адрес очки шлют назад как
- Provisioning сейчас работает только потому, что **adb уже был включён раньше** (например, `ble.request.debug` + `payload.cmd="WirelessAdbAddress"` — это направление
руками или через shizuku) и не выключился после ребута. После ребута очков — если корректно и у нас уже разобрано.)
`adb_wifi_enabled` сбросится в 0 — provisioning сломается, потому что новый адрес мы
узнать не сможем.
**Обходной путь (уже работает):** **Ground truth — стоковое приложение телефона `com.rayneo.mercury`:**
```bash `cn.rayneo.mercury.connectivity.util.GlassesDebugCommands.enableWirelessAdb()` кладёт
# Через shizuku shell на очках: в `BleResponsePipeline` именно `DebugResponse(Payload(cmd="enableWirelessAdb"))`, а у
service call adb 4 i32 1 s16 'Caffeine Portable' # включить adb `DebugResponse` `uri == "ble.response.debug"`. Лишние поля не читаются — обработчик
settings put global adb_wifi_enabled 1 # не дать ему автоотключиться очков (`DebugKnife.observeBleWirelessDebugCommand`) матчит только `payload.cmd` и сам
``` вызывает `RayNeoAdbService.enableWirelessAdb(true, <текущий ssid>)`.
После этого `adb_wifi_enabled` остаётся 1, телефон через mDNS `_adb-tls-connect._tcp`
находит `ip:port` и подключается. Это уже используется как fallback в `AdbController`.
**Следующий шаг:** при первом удобном случае — поднять через shizuku-shell и убедиться, **Фикс:** `Commands.Debug.enableWirelessAdb()/disableWirelessAdb()` → `Uris.RESPONSE_DEBUG`;
что provisioning пройдёт полностью через этот путь. библиотека опубликована как `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" shizukuApi = "13.1.5"
shizukuProvider = "13.1.5" shizukuProvider = "13.1.5"
navCompose = "2.10.2" navCompose = "2.10.2"
mercury = "0.1.0-SNAPSHOT" mercury = "0.1.1-SNAPSHOT"
mercuryTransport = "0.1.1-SNAPSHOT" mercuryTransport = "0.1.1-SNAPSHOT"
mercuryBinocular = "0.1.0-SNAPSHOT" mercuryBinocular = "0.1.0-SNAPSHOT"
mercuryShizuku = "0.1.0-SNAPSHOT" mercuryShizuku = "0.1.0-SNAPSHOT"