ZCode 官方远程控制(zcode.z.ai/remote)的原生安卓增强客户端——Kotlin + Jetpack Compose 实现,深度对标 zai-org/ZCode 工业级设计规范与现代移动端交互架构(GitHub Mobile / Claude Mobile),复用官方中继与配对协议(逆向实证,见 PROTOCOL.md),提供比官方 Web 版更强的通知、审批、流式会话与移动端操控体验。
┌──────────────────────────────────────────────┐
│ ZCode Remote (Scaffold) │
└──────────────────────┬───────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ (Tab 1: 会话工作台) │ (Tab 2: 待办审批 Inbox) │ (Tab 3: 控制中心 Settings)
┌──────▼───────────┐ ┌──────▼───────────┐ ┌──────▼───────────┐
│ 会话工作台 │ │ 待办与审批看板 │ │ 系统与设备设置 │
├──────────────────┤ ├──────────────────┤ ├──────────────────┤
│ • 设备状态呼吸灯 │ │ • 权限审批操作流 │ │ • 当前连接卡片 │
│ • 「+ 新建会话」 │ │ • 表单提问应答 │ │ • 多设备管理切换 │
│ • 实时搜索/过滤 │ │ • 实施计划确认 │ │ • 协议线路选择 │
│ • 流式会话卡片 │ │ • 倒计时进度条 │ │ • HyperOS 保活 │
│ • 运行中状态高亮 │ │ • 历史待办留档 │ │ • 在线检查更新 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
- 现代化 3-Tab 移动端架构:彻底告别单页混乱堆叠,采用「会话工作台 / 待办审批 / 设置中心」标准底部导航架构;全面接入系统级物理返回键拦截(
BackHandler),杜绝手势误杀退出的问题。 - 深度对标官方 ZCode 工业级设计:
- 全量接入官方
theme-zai-dark(#161616)与theme-zai-light(#F8F8FA)色彩体系,搭配官方 15% 微边框(Hairline Border); - 引入官方 Trajectory 四色轨迹语义:用户消息蓝(
#60A5FA)、助手响应青(#2DD4BF)、思考轨迹紫(#A78BFA)、工具调用琥珀橙(#F59E0B); - 全面淘汰杂乱的系统 Emoji,统一采用规范的 Material 矢量图标;
- 官方同款深度思考组件(
ReasoningBlock):紧凑紫色折叠胶囊 + 平滑展开动画 + 标志性左侧弱引导竖线 + 一键复制; - 官方紧凑工具卡片(
ToolCallCard):类型标签徽章 + 状态徽标 + 终端代码框格式化展开。
- 全量接入官方
- 移动端一键发起新会话:会话工作台顶栏直接「+ 新建会话」,基于官方 V4 原生信封链路(
sendConversationCommandV4(type: "createSession", sessionId: null)),支持首条 Prompt 输入与实时语音识别填充,创建后直接切入流式对话窗口。 - 集中式审批与待办看板:底部导航栏实时角标(Badge)提醒,集中看板统一处理权限审批(允许一次 / 总是允许 / 拒绝)与表单交互(AskUserQuestion / 计划确认),带桌面端决议倒计时。
- 通知栏锁屏审批(核心差异点):桌面端请求权限时,锁屏状态下收到高优先级系统通知,通知栏直接批准/拒绝。
- 扫码配对:扫描桌面端二维码即完成配对,凭据经 AES-256-GCM + Android Keystore 加密存储;支持手动粘贴链接兜底;支持多台设备管理(切换 / 移除)。
- 会话流式渲染与代码块自适应:原生 Markdown 渲染支持各级标题、粗体、列表、引用,代码块自动适配深浅双色主题并配备一键复制反馈;滚到顶部自动翻页加载更早历史。
- 发送消息与停止:会话页底部悬浮药丸输入栏直接向桌面端发消息;会话运行中显示平滑变形的「停止」按钮,一键中断。
- 附件上传:会话页选择文件(≤20MiB)→ 分片上传 → 随消息发送,桌面端模型可直接读取内容;走官方 Web 同款
sendText附件链路。 - 语音输入:输入栏 🎤 系统语音识别转文字(识别中实时上屏),一键追加到消息草稿,零协议改动。
- 会话离线持久化与秒开(Sprint 5 核心):
SessionCacheStore本地原子持久化缓存 —— App 启动首帧 0ms 渲染历史会话列表;点击任意会话卡片更可立即呈现该会话最近 200 行历史消息,无需等待订阅握手与快照回包,网络到达后由快照平滑对齐权威状态。 - 配对链接 Deep Link 一键唤起(Sprint 5):点击外部浏览器、邮件或分享卡片中的
zcode://pair或官方https://zcode.z.ai/remote配对链接,直接唤起 App 并自动解析凭据完成秒级配对,彻底免除扫码或复制粘贴。 - 全场景机械级触觉反馈(Haptic Feedback):权限审批(允许/拒绝)、消息发送、会话中断、代码 Diff 复制触发饱满的系统触觉震动确认;快捷指令胶囊点击与悬浮回底触发细腻轻触震动回馈。
- 单轮 Turn 变更文件聚合卡片(Sprint 3 第三步):自动将每一轮 Agent Turn 中执行的所有 Edit / Write 工具行汇聚为
📦 本轮变更 · 共 N 个文件 (+A −B)汇总卡片,支持一键展开多文件代码 DiffBlock 进行一站式 Review(对标 GitHub PR Files Changed)。 - 通知栏 RemoteInput 直接回复(Sprint 4):遇到提问或表单交互时,锁屏状态下收到通知可直接下拉展开文本框输入并一键提交,全程免解锁进 App。
- 系统级 Share Sheet 分享接入(Sprint 5):外部浏览器、文件管理器等 App 点击「分享」至 ZCode Remote,自动填入当前会话输入草稿或解析加入待发附件。
- 常用快捷指令胶囊栏:输入栏上方提供「继续」、「运行测试验证」、「修复该问题」等横向滚动快捷胶囊,单指轻触快速填入,大幅降低移动端打字成本。
- 会话流智能贴底与悬浮回底:动态感知视口位置,用户主动上翻查阅历史或代码 Diff 时不再被新行强拉贴底打断,并优雅弹出悬浮「回到底部 ↓」胶囊按钮一键平滑定位。
- 最近文件与只读代码预览(Sprint 3):顶栏 📁 图标动态汇总本会话涉及的文件,点开 ModalBottomSheet 面板浏览文件清单;点选文件经
file.readTextFile实时拉取并等宽展示正文,支持横向滚动与 20KB 截断保护,纯只读无写路径。 - 工具调用 Diff 差异高亮(Sprint 3):Edit / Write / MultiEdit 工具行纯客户端 Myers 算法计算行级 diff,折叠摘要展示
📄 文件名 +N −M,展开直观呈现红绿增删与「⧉ 复制」unified 格式文本。 - 执行模式安全选择(Sprint 2 / P0-B):新建会话与会话内顶栏均支持自由切换规划(plan)、构建(build)、全自动(yolo),默认安全 build 模式,彻底杜绝免审批漏洞;yolo 显式红底警示。
- 前台长连接保活与终态通知(Sprint 1–2 / P0-A):
ConnectionService真正升级为 FGSspecialUse前台服务(进程级ConnectionScope保长连),锁屏或划掉后台持续存活;KICKED / AUTH_FAILED / PROTOCOL_MISMATCH 终态常驻通知提醒。 - 强韧断网感知重连(Sprint 1):
NetworkGate常驻监听系统网络,断网立即重置并挂起,网络恢复即刻重连(事件链全程 <9s)。 - 会话流附件 chip:发送带附件的消息后,附件以 chip(图标 + 文件名 + 体积)显示在消息气泡上方,与官方客户端一致;附件字段随行缓存持久化,冷启动秒开时同样可见。
- 会话异常原因可见:出错会话在会话页显示完整错误原因(可一键复制),列表对已打开过的会话补齐原因——与桌面端信息对齐。
- 完整回归测试保护网(Sprint 6 起持续扩充):VQL 二进制编解码金标准双向对拍测试(Python↔Kotlin 共享 fixture)、47 项纯函数与状态判定单测全绿、GitHub Actions CI 持续集成。
- 桌面 Widget:主屏卡片实时显示待处理总数(审批 + 表单交互),点按直达 App;连接断开时明示「未连接」。
- 可靠连接:完整官方握手(HMAC proof)、心跳、指数退避重连、断线出站缓冲,单端在线互踢提示。
| 会话工作台 | 待办与审批看板 | 沉浸式对话控制台 | 独立系统设置 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 里程碑 | 内容 | 状态 |
|---|---|---|
| M0 协议逆向 | PC/手机两侧 bundle 交叉实证,产出 PROTOCOL.md | ✅ 完成 |
| M1 骨架+配对+会话 | 扫码配对、中继连接、会话列表、事件流 | ✅ 模拟器验收通过 |
| M2 审批与推送 | 会话流实时渲染、权限审批(会话内 + 通知栏)、双源审批接收 | ✅ 端到端验收通过(2026-09-28) |
| M3 打磨与内测 | 多机管理、线路切换、HyperOS 保活引导、异常兜底 | ✅ 主体完成 |
| M3+ 交互增强 | 发送/停止、表单类交互应答、多会话看板与控制权提示、附件上传(全链路实测)、语音输入、桌面 Widget、会话搜索 | ✅ 协议层端到端验收通过 |
| M3++ 移动端全面重构 | 底部 3-Tab 移动架构、官方 ZCode 设计系统对齐(zai-dark/zai-light)、集中待办看板、独立设置中心、原生新建会话、会话内模型切换与审批修复 | ✅ 完成(v0.5.0-beta5,2026-10-01) |
| Sprint 0–3/6 P0结清与功能收官 | 三个 P0 缺陷结清、Diff 视图、最近文件只读预览、前台服务保活、VQL 对拍与 23 项单测回归网、真机端到端全通 | ✅ 完成(v0.5.0-beta6,2026-10-05) |
| Sprint 4–5 原生交互深度落地 | 通知栏 RemoteInput 内联回复、系统级 Share Sheet 分享接入、智能贴底与快捷指令胶囊栏、真机端到端全通 | ✅ 完成(v0.5.0-beta8,2026-10-05) |
| Sprint 3 第三步 / Turn 变更聚合 | 会话流单轮 Turn 变更文件汇总卡片(Turn Diff Summary)、多文件一站式 Review、24 项单测全绿、真机实测全通 | ✅ 完成(v0.5.0-beta9,2026-10-05) |
| Sprint 5 移动原生与离线能力闭环 | 会话列表与消息流双离线持久化秒开(Offline First)、配对链接 Deep Link 唤起、系统级触觉震动反馈、Share Sheet 接入、26 项单测全绿 | ✅ 完成(v0.5.0-beta12,2026-10-05) |
| 正确性缺陷修复补丁 | 上传跨会话附件注入(数据/隐私)、握手三跳无超时导致永久卡死、beta11/12 引入的贴底回归、触觉补漏与失败时长档位;47 项单测全绿 | ✅ 代码完成,A-2/B-1 真机 PASS(v0.5.0-beta13,2026-10-07) |
| 会话流附件 chip | 发送带附件的消息后,附件 chip 显示在气泡上方(含体积、随行缓存持久化) | ✅ 代码 + 真机端到端 PASS(v0.5.0-beta14,2026-10-07) |
| 连接层缺陷修复 | 桥握手无超时导致「已连接却永久卡在会话报错」、bridge not ready 未判可重试、网络恢复白等一整轮退避 |
✅ 代码 + 单测 + 真机 PASS:断网 80s→5s、150s→3s(旧版 ~47s)(v0.5.0-beta15,2026-10-07) |
| ❌ 已取消(2026-09-30 决策:单人自用下成本收益不划算,详见 HANDOVER) | ||
| ❌ 已取消(2026-10-05 用户决策:后续开发计划一律不做) | ||
| v1.0 判停 | 3 天日常使用观察(锁屏审批可达 / 杀后台 30min / 网络往返) | ⏳ 进行中(唯一剩余事项);观察窗口因 beta13/14/15/16 补丁已重置,自 beta16 真机验收通过日(2026-10-07)起重新计时 |
| 会话异常原因 + 输入栏对齐 | 会话页显示错误原因(可复制)、列表回填、标题双重序列化解包、输入栏控件对齐(48dp 触控档)、顶栏 phase 标签中文化 | ✅ 代码 + 单测 + 真机验收全通过(v0.5.0-beta16,2026-10-07) |
功能开发已结清(2026-10-05):Sprint 0–6 全部完成并真机验收,后续开发计划(Sprint 7 等)经决策取消。当前仅剩「3 天日常使用观察 → 发 v1.0」一步。
2026-10-07 补丁轮次(v0.5.0-beta13):按《体验提升任务书 v2》档 A/B 修复四项正确性/体验缺陷(上传跨会话附件注入、握手三跳无超时、beta11/12 引入的贴底回归、触觉补漏)。属维护与缺陷修复性质,不含新增功能;JVM 单测与构建已全绿,真机验收待办,并按仓库规则重置 3 天观察窗口。详见 CHANGELOG.md 与 HANDOVER.md。
交接文档见 HANDOVER.md(自包含,面向 AI agent 直接接手)。
签名 APK 从 GitHub Releases 下载
(如 ZCodeRemote-0.5.0-beta13.apk 或 releases 挂载的 app-release.apk,minSdk 31,Android 12+)。
无需 Android Studio,本机工具链(JDK 17 + Gradle + Android SDK)就绪于 toolchain/:
./build.sh # 构建 APK
./build.sh install # 构建 + 安装到设备/模拟器 + 启动
./build.sh log # 查看中继日志本项目仅连接本人自己的 ZCode 账号/设备(暂不开源、不分发)。走官方中继无端到端加密,凭据与消息对中继服务器可见;二维码泄露等于控制权泄露,App 端已做凭据加密存储。
A native Android client for the official ZCode Remote Control relay (zcode.z.ai/remote), built with Kotlin + Jetpack Compose. Deeply aligned with the zai-org/ZCode design specifications and modern mobile interaction patterns (GitHub Mobile / Claude Mobile), it reuses the official pairing protocol and relay (reverse-engineered and verified, see PROTOCOL.md) to deliver a far superior notification, approval, live streaming, and session experience.
┌──────────────────────────────────────────────┐
│ ZCode Remote (Scaffold) │
└──────────────────────┬───────────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ (Tab 1: Sessions) │ (Tab 2: Approvals / Inbox) │ (Tab 3: Settings)
┌──────▼───────────┐ ┌──────▼───────────┐ ┌──────▼───────────┐
│ Sessions Tab │ │ Approvals Inbox │ │ Settings Tab │
├──────────────────┤ ├──────────────────┤ ├──────────────────┤
│ • Pulse status │ │ • Permission flow│ │ • Active device │
│ • "+ New Session"│ │ • Form questions │ │ • Multi-device │
│ • Search/Filter │ │ • Plan approval │ │ • Relay endpoint │
│ • Live stream │ │ • Countdown bar │ │ • Keep-alive guide│
│ • Running status │ │ • History archive│ │ • Update checker │
└────────────────┘ └──────────────────┘ └──────────────────┘
- Modern 3-Tab Mobile Architecture: Say goodbye to crowded single-page layouts. Clean navigation across Sessions Workbench, Approvals Inbox, and Settings Center; full integration with system
BackHandlerprevents accidental exits. - Aligned with Official ZCode Industrial Design:
- Full support for
theme-zai-dark(#161616) andtheme-zai-light(#F8F8FA), paired with 15% hairline borders for clean, calm contrast; - Official Trajectory colors: User Blue (
#60A5FA), Assistant Teal (#2DD4BF), Reasoning Purple (#A78BFA), and ToolCall Amber (#F59E0B); - Replaced ad-hoc emojis with crisp, standard Material vector icons;
- Official
ReasoningBlock: Sleek collapsible purple pill + smooth expand animation + vertical guide line + one-tap copy; - Official
ToolCallCard: Compact tool badge + status chip + formatted terminal code block.
- Full support for
- Create New Sessions from Mobile: One-tap "+ New Session" on the workbench header powered by the official V4 envelope command (
sendConversationCommandV4(type: "createSession", sessionId: null)), with text or speech recognition input. - Centralized Approvals Inbox: Dedicated tab with live Badge counter for pending permissions and form interactions (
AskUserQuestion, plan approvals) with desktop auto-resolution countdown. - Lock-screen Notifications (Key Differentiator): Approve/deny directly from system notifications without unlocking the screen.
- QR Pairing & Multi-device Management: AES-256-GCM + Android Keystore encrypted credential storage, manual link fallback, and multi-device switching/deletion.
- Markdown & Code Rendering: Adaptive light/dark code blocks with one-tap copy confirmation; auto-pagination when scrolling to top.
- Send & Stop: Pill-shaped floating composer sends prompts; morphing Stop button interrupts running turns.
- Chunked Attachments: Pick files (≤20 MiB) in conversation, chunked stream upload, sent via official
sendTextattachment path. - Voice Input: Tap-to-talk speech recognition with live partial results appended to drafts.
- Offline-First Cache & Instant Open (Sprint 5):
SessionCacheStorelocal atomic persistence renders the cached session list on frame 0 (0ms instant cold launch); tapping any session card likewise surfaces its most recent 200 cached message rows immediately, without waiting for the subscribe handshake or snapshot — the network snapshot then smoothly reconciles to authoritative state. - Pairing URL Deep Link Integration (Sprint 5): Tap
zcode://pairor officialhttps://zcode.z.ai/remotepairing URLs in external browsers or chats to wake the app and pair instantly with zero scanning or manual copy-pasting. - Full Tactile Haptic Feedback: Tactile vibration confirmation for approvals (allow/deny), prompt sends, turn stops, and diff copying, plus crisp feedback on action chips and scroll-to-bottom buttons.
- Notification RemoteInput Inline Reply (Sprint 4): Direct pull-down inline text reply within system notifications for interactive prompts without needing to unlock into the app.
- Turn Changes Summary Card (Sprint 3 Step 3): Automatically aggregates all Edit / Write tool rows in each agent turn into a compact
📦 Turn Changes · N files (+A −B)review card (aligned with GitHub PR Files Changed), with one-tap expansion to review all file diffs in a continuous flow. - System Share Sheet Integration (Sprint 5): Receive shared text or file attachments from external apps (browsers, file explorers), auto-filling drafts or attachment queues.
- Quick Action Chips Bar: One-tap quick actions ("继续", "运行测试验证", etc.) above composer to dramatically reduce typing friction on mobile.
- Smart Auto-Scroll & Floating Jump-to-Bottom: Viewport-aware auto-scroll that preserves your reading position when reading history or code diffs, accompanied by a floating "Jump to Bottom" pill.
- Recent Files & Read-Only Code Preview (Sprint 3): Dynamic top bar 📁 pill aggregates touched files in the active session; tap to open a ModalBottomSheet file list. Tapping any file invokes
file.readTextFileRPC to fetch and render code in monospace with horizontal scrolling and 20KB truncation guard (strictly read-only). - In-Tool Diff Highlighting (Sprint 3): Client-side Myers line diff calculation for Edit / Write / MultiEdit tool rows, showing summary
📄 filename +N −Mand expanding into red/green unified diff blocks with one-tap clipboard copy. - Safe Execution Mode Selector (Sprint 2 / P0-B): Choose between plan, build, or yolo during session creation or directly in the top bar. Defaults to safe build mode; yolo mode clearly displays red hazard indicators.
- Foreground Service Keep-Alive & Terminal Notifications (Sprint 1–2 / P0-A):
ConnectionServicepromoted to a realspecialUseForeground Service with process-levelConnectionScopesingleton to keep connections alive across lock-screen and task killing; persistent system notifications for KICKED / AUTH_FAILED / PROTOCOL_MISMATCH. - Resilient Network-Aware Reconnection (Sprint 1):
NetworkGateactively monitors network connectivity viaConnectivityManager, instantly resetting on connection loss and reconnecting in <9s upon network availability. - Attachment Chips in the Conversation Stream: messages sent with attachments render a chip (icon + file name + size) above the message bubble, matching the official client; the attachment field rides along in the row cache so chips also show on instant-open cold starts.
- Regression Safety Net (since Sprint 6, continuously extended): Bi-directional VQL binary codec golden fixture tests (Python↔Kotlin shared vectors), 47 pure-function & state-decision unit tests, and GitHub Actions CI automation.
- Home-Screen Widget: Live card showing total pending items, tap to jump into the app.
- Reliable Connectivity: HMAC handshake proof, 30s heartbeat, exponential backoff, and offline outbound queue.
| Milestone | Scope | Status |
|---|---|---|
| M0 protocol RE | Cross-verified both desktop & mobile bundles → PROTOCOL.md | ✅ Done |
| M1 skeleton+pairing+sessions | QR pairing, relay connection, session list, event stream | ✅ Verified on emulator |
| M2 approvals & push | Live conversation streaming, permission approvals (in-app + notification shade), dual-source approval intake | ✅ E2E verified (2026-09-28) |
| M3 polish & beta | Multi-device, endpoint switching, HyperOS keep-alive guide | ✅ Core done |
| M3+ interactions | Send & stop, form-style interaction responses, multi-session board, attachments, voice input, home-screen widget, search | ✅ E2E verified at protocol level |
| M3++ Mobile UI/UX Overhaul | Modern 3-Tab architecture, official ZCode design system alignment (zai-dark/zai-light), dedicated inbox, native createSession, in-session model switching, and approval fixes | ✅ Done (v0.5.0-beta5, 2026-10-01) |
| Sprint 0–3/6 P0 Fixes & Feature Completion | Three P0 bugs resolved, Diff view, Recent Files preview, FGS keep-alive, VQL fixtures, 23 unit tests, real-device E2E verified | ✅ Done (v0.5.0-beta6, 2026-10-05) |
| Sprint 4–5 Native System Interactions | Notification RemoteInput inline reply, Share Sheet receiver, smart auto-scroll & action chips, real-device verified | ✅ Done (v0.5.0-beta8, 2026-10-05) |
| Sprint 3 Step 3 / Turn Diff Summary | In-session turn changes aggregation review card, multi-file unified diff inspection, 24 unit tests, verified on real device | ✅ Done (v0.5.0-beta9, 2026-10-05) |
| Sprint 5 Offline-First & System Integration | Instant-open session & message-row cache, Pairing Deep Links, full tactile haptics, Share Sheet receiver, 26 unit tests | ✅ Done (v0.5.0-beta12, 2026-10-05) |
| Correctness Bug-Fix Patch | Cross-session attachment injection (data/privacy), handshake deadlock from missing timeouts, beta11/12 auto-scroll regression, missing haptics & failure-banner duration; 47 unit tests green | ✅ Code complete, A-2/B-1 real-device PASS (v0.5.0-beta13, 2026-10-07) |
| Attachment Chips in Conversation Stream | Chips (name + size, persisted with the row cache) rendered above the message bubble for messages sent with attachments | ✅ Code + real-device E2E PASS (v0.5.0-beta14, 2026-10-07) |
| Connection-Layer Fixes | Bridge handshake had no timeout ("connected but session stuck on an error forever"), bridge not ready not treated as retryable, network recovery waiting out a full backoff round |
✅ Code + unit tests + real-device PASS: 80s outage → 5s, 150s outage → 3s (was ~47s) (v0.5.0-beta15, 2026-10-07) |
| ❌ Cancelled (2026-09-30: cost/benefit not worth it for single-user, see HANDOVER) | ||
| ❌ Cancelled (2026-10-05: all future dev plans dropped by user decision) | ||
| v1.0 Judgment Line | 3-day daily-use observation (lock-screen approval reachability / 30-min background kill / network round-trips) | ⏳ In progress (only remaining item); window reset by the beta13/14/15 patches — restarts from real-device acceptance |
| Session Error Reason + Composer Alignment | Full error reason shown in the session page (copyable), backfilled into the list, double-serialized title unwrapped, composer controls aligned to the 48dp touch tier, phase label localized | ✅ Code + unit tests + real-device verification all PASS (v0.5.0-beta16, 2026-10-07) |
Download signed APKs from GitHub Releases
(e.g., ZCodeRemote-0.5.0-beta16.apk or attached app-release.apk, minSdk 31, Android 12+).
2026-10-07 patch rounds: beta13 fixed four correctness/UX defects per the Experience Improvement Task Book v2 (grades A/B) — cross-session attachment injection, missing handshake timeouts, the beta11/12 auto-scroll regression, and missing haptics. beta14 adds attachment chips in the conversation stream (a user-requested feature). beta15 fixes three connection-layer defects: the bridge handshake had no timeout (session stuck on an error forever while the relay showed "connected"),
bridge not readywas not treated as retryable, and network recovery waited out a full backoff round (~47s). JVM tests and build are green; beta15 recovery latency verified on device (80s→5s, 150s→3s vs ~47s before). See CHANGELOG.md and HANDOVER.md.
No Android Studio required — toolchain (JDK 17 + Gradle + Android SDK) is in toolchain/:
./build.sh # build APK
./build.sh install # build + install to device/emulator + launch
./build.sh log # tail relay logs


