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
|
**Когда выяснено:** 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` молча уходил
|
||||||
|
в старую версию. Строку убрали.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user