From e5d2fa24a1680fbfa0ea87902dda5ec16831991f Mon Sep 17 00:00:00 2001 From: subochev Date: Sun, 27 Sep 2026 16:24:33 +0300 Subject: [PATCH] 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). --- BLOCKERS.md | 72 ++++++++++++++++++++++++--------------- gradle/libs.versions.toml | 2 +- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/BLOCKERS.md b/BLOCKERS.md index 22da627..169f5cb 100644 --- a/BLOCKERS.md +++ b/BLOCKERS.md @@ -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` молча уходил +в старую версию. Строку убрали. --- diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7ace7e4..dc31994 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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"