phone: autonomous Shizuku revive over wireless-adb; glasses screen on/off buttons

AdbClient wraps the bundled libadb.so (useLegacyPackaging -> exec from nativeLibraryDir, HOME/TMPDIR overridden, adb key injected into BuildConfig from ~/.android at build time and never committed). ShizukuProvisioner: on each BLE+WiFi connect it enables ADB-over-WiFi via Mercury, connects with mDNS fallback, pushes the Shizuku starter and runs it; runs once per BLE session, does not relaunch GlassesApp when the WS channel is already up, and exposes runShell() for arbitrary commands. DebugReceiver (DUMP) + am start --ez provision for diagnostics.

Protocol: ShizukuStatus(running/granted) + RequestShizukuStatus; glasses push it on connect and on Shizuku state change, using a passive probe() that never shows a permission dialog. Glasses kill-guard now recreates its UserService when the Shizuku binder dies instead of spamming DeadObjectException. Mercury: brightness disables auto-brightness first (was silently ignored), BLE auto-connect loop retries every 6s (fixes 'searches then stops'). New phone section 'Экран очков' with wake/sleep via adb (input keyevent 224/223).
This commit is contained in:
2026-09-27 03:52:05 +03:00
parent 59069a741e
commit 8a0b7832c0
18 changed files with 1112 additions and 44 deletions
+49
View File
@@ -89,3 +89,52 @@ RayDesk — Moonlight-клиент: стримит рабочий стол ПК
### Ложная зацепка
- `127.0.0.1:8872` (uid 1002) — при коннекте отдаёт поток с магией `btsnoop` → это
Bluetooth HCI-логгер, не adbd. ADB-хендшейк не проходит.
---
## Этап F — автономный подъём Shizuku С ТЕЛЕФОНА (успех)
### Механизм включения wireless-adb на очках
- Нужно **два** действия (иначе TLS-сервер не поднимается):
1. `IAdbManager.allowWirelessDebugging(true, ssid)` — транзакция binder `adb` №4,
добавляет доверенную сеть (`adb_temp_keys.xml` + запись wifiAP/bssid).
2. `settings put global adb_wifi_enabled 1` — adbd стартует
`TlsServer running on port <random>` и публикует mDNS `_adb-tls-connect._tcp`.
- Порт — **случайный**; узнать: binder-транзакция `adb` №10 (`getAdbWirelessPort`).
- Shell (uid 2000) вправе делать оба вызова — root не нужен.
### Критично: wireless-adb сам гаснет
- Как только очки теряют ту WiFi-сеть, к которой были привязаны, `adb_wifi_enabled`
сбрасывается в 0, порт становится `-1`. Поэтому при каждом бутстрапе его надо
перевключать (через Mercury `enableWirelessAdb`, который и вызывает оба шага).
### Авторизация без сопряжения
- Встроенный adb-ключ рабочей машины уже лежит в `/data/misc/adb/adb_keys` очков.
`AdbDebuggingManager.addUserKeysToKeyStore()` подмешивает user-ключи в wireless-keystore,
поэтому при connect по TLS ключ принимается без pairing-кода. Проверено.
### Реализация в PhoneApp
- `jniLibs/arm64-v8a/libadb.so` — AOSP adb (префилд LADB, Apache-2.0);
`useLegacyPackaging = true` → распаковывается в `nativeLibraryDir`, откуда
разрешён `exec` (W^X запрещает exec из filesDir/cacheDir — первая ошибка была `EACCES`).
- Ключ `~/.android/adbkey` зашивается в `BuildConfig` на сборке (в репо не коммитится).
- `AdbClient`: HOME=filesDir/.android (ключ кладём и в `.android/.android`),
TMPDIR=cacheDir, `ANDROID_USER_CONFIG`=HOME.
- `ShizukuProvisioner`: Mercury адрес → mDNS fallback → `start-server` → `connect` →
`pidof shizuku_server` → push `assets/shizuku/starter` → `chmod` →
`starter --apk=$(pm path moe.shizuku.privileged.api)` → проверка `pidof` → `appMarketLaunch`.
### Проверено на устройстве (через TCP-релей ПК, т.к. телефон и очки были в разных сетях)
```
forceWithAddress(192.168.76.142:39998)
exec: -s ... shell /data/local/tmp/shizuku_starter --apk=.../base.apk
info: shizuku_server pid is 4342
pidof shizuku_server -> '4342'
Shizuku поднят
```
Диагностика: `am broadcast -a pw.binom.rayneovm.phone.DEBUG_PROVISION [--es address ip:port]`
или `am start -n pw.binom.rayneovm.phone/.MainActivity --ez provision true [--es address ip:port]`.
### Остаётся проверить «в бою»
- Реальный сценарий: телефон держит хотспот, очки к нему подключены, BLE соединён →
`enableWirelessAdb` отдаёт адрес (или mDNS), телефон поднимает Shizuku сам.