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
@@ -116,6 +116,11 @@ data object Shutdown : VmMessage
@SerialName("get_app_list")
data object GetAppList : VmMessage
/** Просьба к очкам прислать текущее состояние Shizuku (см. [ShizukuStatus]). */
@Serializable
@SerialName("request_shizuku_status")
data object RequestShizukuStatus : VmMessage
@Serializable
data class AppEntry(
val packageName: String,
@@ -154,6 +159,20 @@ data class AppLaunchedAck(
val success: Boolean,
) : VmMessage
/**
* Состояние Shizuku на очках.
*
* [running] — жив ли сервер Shizuku (`Shizuku.pingBinder()`): без него GlassesApp не может
* создать VirtualDisplay, и его надо поднимать через ADB. [granted] — выдано ли нашему
* приложению разрешение (если сервер жив, но прав нет, лечится диалогом на очках, не ADB).
*/
@Serializable
@SerialName("shizuku_status")
data class ShizukuStatus(
val running: Boolean,
val granted: Boolean,
) : VmMessage
// =====================================================================
// Bidirectional
// =====================================================================