| 简体中文 | English |
Android 端的 ZCode 远程控制客户端。通过逆向官方 Web 远程控制页面的通信协议实现, 可以在手机上查看和操控桌面端 ZCode 的会话,不依赖浏览器。
Kotlin + Jetpack Compose(Material 3)编写,全部代码为独立实现。
📱 在线预览: damianjiang.github.io/ZCode-Android
sid / hash 等同于设备凭据,不要分享给任何人。泄露后在桌面端重新生成二维码即可作废。permission_request / elicitation_request,在手机上即可审批文件或执行命令需要 JDK 17 和 Android SDK 35。
git clone https://github.com/Damianjiang/ZCode-Android.git
cd ZCode-Android
./gradlew assembleRelease # Windows 用 gradlew.bat
产物在 app/build/outputs/apk/release/。release 包开启 R8 与资源收缩,
使用 debug 签名,可以直接安装。日常调试用 assembleDebug。
系统要求 Android 12+(minSdk 28),仅支持 arm64-v8a 架构。
app/src/main/java/app/zemote/
├── MainActivity.kt # 应用入口
├── ZemoteApp.kt # Application 类
├── crash/
│ └── CrashHandler.kt # 崩溃捕获与重启
├── protocol/ # 协议栈(全部独立实现)
│ ├── ConnectionParams.kt # URL 解析(sid/hash/t)
│ ├── Proof.kt # HMAC-SHA256 配对证明
│ ├── IpcCodec.kt # 7-bit varint 编解码
│ ├── RpcFrameTransport.kt # rpc-frame 分片/CRC32/重组
│ ├── ChannelClient.kt # Channel RPC 与事件订阅
│ ├── RelayClient.kt # WebSocket 长连接、心跳、重连
│ ├── ZemoteClient.kt # bootstrap、bridge 打开与恢复
│ ├── BridgeSession.kt # workspace bridge 会话
│ └── ConversationV4.kt # 对话协议:订阅/流式/队列/附件/权限
├── service/
│ └── KeepAliveService.kt # 前台保活通知
├── state/ # 状态层
│ ├── AccountStore.kt # 设备列表持久化
│ ├── AppSessionViewModel.kt # 连接与会话仓库管理
│ ├── AppSettings.kt # 应用设置(消息条数等)
│ ├── CredentialCipher.kt # Keystore AES/GCM 加密
│ └── LanguagePrefs.kt # 语言设置
└── ui/ # Compose 界面
├── theme/ # M3 主题、配色、字体
├── component/ # 通用组件
├── components/ # Markdown 渲染
├── logger/
│ └── ZemoteLogger.kt # 协议层调试日志
├── navigation/
│ └── ZemoteNavHost.kt # 导航路由
└── screens/ # 各页面
├── AccountsScreen.kt # 设备列表
├── ChatAndTasksScreen.kt # 聊天页 + 任务面板
├── ChangelogScreen.kt # 更新日志
├── CrashScreen.kt # 崩溃报告页
├── DeviceSwitchSheet.kt # 设备切换弹窗
├── LogScreen.kt # 调试日志页
├── MainScreen.kt # 底部导航主屏
├── MainShellScreen.kt # 登录后主页
├── PersonalizeScreen.kt # 主题个性化
├── QrScanScreen.kt # 扫码配对
└── SettingsScreen.kt # 设置页
协议栈与官方 Web 客户端行为一致,实现全部独立完成:
| 层级 | 说明 |
|---|---|
| Relay | wss 长连接,10s 心跳,指数退避重连 |
| 配对 | HMAC-SHA256(nonce ‖ role ‖ deviceSid, passHash) |
| IPC | 7-bit varint,类型标签(String / Int / JSON / Bytes / Array) |
| RpcFrame | 512KB 分片、CRC32 校验、ack 应答、断线重传 |
| Channel RPC | request/response promise + 事件监听 |
| Conversation V4 | 订阅快照 + 增量、wire 帧分片重组、会话队列、附件上传、权限审批 |
对话协议的实现细节参考了同项目原 Flutter 版本(协议行为一致)。
MIT。ZCode 名称及相关商标归其权利人所有,本项目与其无任何隶属关系。