logo
0
0
WeChat Login

🐾 Buclaw — Android 应用

一个可被云端 AI Agent 调度的 Android 原生应用,基于 Kotlin + Material Design 3 构建。
支持双通道调度:WorkBuddy Sandbox (ACP)OpenClaw Gateway (Protocol v3)
完全使用 CodeBuddy / VSCode + 命令行 进行开发、构建和调试,无需 Android Studio。


📋 功能列表

功能说明
🐾 OpenClaw Gateway 集成基于官方 Companion Node App 标准协议(Protocol v3),WebSocket 连接、Ed25519 签名、四步握手、设备配对
💬 双频道聊天WorkBuddy Sandbox 频道 + OpenClaw 频道,独立消息列表,底部 Tab 切换
📅 日历事件展示读取安卓系统自带日历,展示未来 30 天内的事件
⚙️ Gateway 设置可配置 Gateway 地址、Token/Password 认证、设备显示名
🔧 Node 命令执行接收 Gateway 下发的 invoke 命令,执行 Android API,回传结果
🔐 Ed25519 设备身份自动生成/持久化密钥对,v3 签名载荷,设备配对
📡 前台服务保活Foreground Service 维持 WebSocket 长连接

🌐 OpenClaw Gateway 配置与认证

Gateway 地址

默认 Gateway 地址为 ws://9.135.96.56:18789,可通过以下方式修改:

  1. App 内设置:点击主页右上角 ⚙ 图标 → Gateway 设置 → 修改地址
  2. 代码配置:修改 GatewayConfig.kt 中的 DEFAULT_GATEWAY_URL
// app/src/main/java/com/buclaw/app/gateway/GatewayConfig.kt const val DEFAULT_GATEWAY_URL = "ws://9.135.96.56:18789"

认证方式

Buclaw 支持 OpenClaw 官方的多种认证方式(优先级从高到低):

认证方式说明配置位置
Device Token首次配对后 Gateway 自动颁发,App 自动保存和使用自动管理
Shared Token用户显式设置的共享令牌Gateway 设置 → Token
Password密码认证Gateway 设置 → Password
无认证Token 和 Password 均为空时留空即可

首次连接流程

  1. 在 App 的 Gateway 设置页面填写 Gateway 地址
  2. 如果 Gateway 配置了认证,填写 Token 或 Password
  3. 点击"保存并连接"
  4. App 会通过 WebSocket 连接并完成四步握手:
    • ① WebSocket 连接建立
    • ② 收到 connect.challenge 事件(含 nonce)
    • ③ 用 Ed25519 签名 nonce,发送 connect 请求(含 caps/commands/permissions)
    • ④ 收到 hello-ok 响应(含 deviceToken)
  5. 首次连接需在 Gateway 服务端审批设备配对
# 在 Gateway 服务器上执行 openclaw devices list # 查看待审批的设备 openclaw devices approve <id> # 审批设备

Ed25519 设备签名

App 首次运行时自动生成 Ed25519 密钥对并持久化。签名载荷格式(v3):

v3|{deviceId}|{clientId}|{clientMode}|{role}|{scopes}|{signedAt}|{authToken}|{nonce}|{platform}|{deviceFamily}
  • deviceId = SHA-256(公钥原始 32 字节) 的十六进制
  • 公钥传输使用 Base64URL 无填充编码
  • 密钥存储位置:app/files/openclaw/identity/device.json

Node 能力声明

连接时 App 声明以下能力(三级结构):

Caps(能力类别)device, calendar, contacts, notifications, system

Commands(具体指令)

命名空间命令说明
devicedevice.info获取设备基本信息(型号、系统版本)
devicedevice.status获取设备状态(电量、网络)
devicedevice.health获取设备健康(内存、存储)
devicedevice.permissions获取权限状态
calendarcalendar.events获取日历事件
calendarcalendar.add添加日历事件
contactscontacts.search搜索联系人
contactscontacts.add添加联系人
notificationsnotifications.list获取通知列表
systemsystem.notify发送系统通知

🏗 项目结构

Buclaw/ ├── app/ │ ├── build.gradle.kts # App 模块构建配置 │ └── src/main/ │ ├── AndroidManifest.xml # 权限声明 + Activity + Service 注册 │ ├── java/com/buclaw/app/ │ │ ├── MainActivity.kt # 主页面(双频道聊天 + Gateway 集成) │ │ ├── GatewaySettingsActivity.kt # Gateway 设置页面 │ │ ├── CalendarActivity.kt # 日历事件页面 │ │ ├── ChatMessage.kt # 消息数据类 + 频道枚举 │ │ ├── ChatAdapter.kt # 聊天 RecyclerView 适配器 │ │ ├── CalendarHelper.kt # 系统日历读取工具 │ │ ├── CalendarEvent.kt # 日历事件数据模型 │ │ ├── CalendarEventAdapter.kt # RecyclerView 适配器 │ │ ├── HelloDialogActivity.kt # Hello World 对话框页面 │ │ └── gateway/ # ← OpenClaw Gateway 集成模块 │ │ ├── GatewayConfig.kt # 可配置的连接参数(地址、认证) │ │ ├── GatewaySession.kt # WebSocket 会话(四步握手、RPC) │ │ ├── GatewayManager.kt # 高层管理器(单例门面) │ │ ├── OpenClawProtocol.kt # Protocol v3 帧构建/解析 │ │ ├── DeviceIdentity.kt # Ed25519 密钥 + 签名 │ │ ├── NodeCapabilities.kt # 能力声明(caps/commands) │ │ ├── InvokeDispatcher.kt # 命令调度器(执行 Android API) │ │ └── NodeForegroundService.kt # 前台服务保活 │ └── res/ # 布局、颜色、字符串、主题 ├── build.gradle.kts # 根构建配置(AGP 8.9 + Kotlin 2.0) ├── settings.gradle.kts # 项目设置 ├── gradle/wrapper/ # Gradle Wrapper(已包含 JAR) ├── gradlew # 构建入口脚本(macOS/Linux) └── local.properties # 本地 SDK 路径

🛠 技术栈

语言Kotlin 2.0.21
构建Gradle 8.11.1 + AGP 8.9.0
UIMaterial Design 3 + ViewBinding
网络OkHttp 4.12 (WebSocket + HTTP)
协程kotlinx.coroutines 1.8.1
序列化kotlinx-serialization-json 1.7.3
加密BouncyCastle 1.78.1 (Ed25519)
安全存储AndroidX Security Crypto
Min SDK26 (Android 8.0)
Target SDK35 (Android 15)

🚀 完整开发流程(CodeBuddy / VSCode + 命令行)

一、环境要求

工具最低版本检查命令
JDK17java -version
Android SDKplatforms/android-35ls ~/Library/Android/sdk/platforms
ADB任意~/Library/Android/sdk/platform-tools/adb version

Gradle 无需单独安装,项目已包含 Gradle Wrapper(gradlew),会自动下载正确版本。

1.1 设置环境变量

~/.zshrc 中添加以下内容(一次性配置):

# Android SDK export ANDROID_HOME=~/Library/Android/sdk export PATH=$PATH:$ANDROID_HOME/platform-tools export PATH=$PATH:$ANDROID_HOME/emulator

使其生效:

source ~/.zshrc

二、在 CodeBuddy / VSCode 中开发

2.1 推荐安装的扩展

在 CodeBuddy / VSCode 扩展市场安装:

扩展作用
Kotlin LanguageKotlin 语法高亮 + 基础补全
Gradle for JavaGradle 任务面板
XML (Red Hat)XML/布局文件智能提示
Material Icon Theme更好的文件图标

2.2 打开项目

# 在 CodeBuddy / VSCode 中打开项目根目录 code /Users/yupengfei/Documents/040_软件工程/Bclaw-sandbox/Buclaw

2.3 编辑代码

直接在编辑器中修改 .kt.xml 文件即可。核心文件:

app/src/main/java/com/buclaw/app/ ← Kotlin 源码 app/src/main/res/layout/ ← 界面布局 XML app/src/main/res/values/ ← 字符串/颜色/主题 app/src/main/AndroidManifest.xml ← 应用清单

三、构建项目

所有构建操作都通过 终端 完成。在 CodeBuddy / VSCode 中按 Ctrl+` 打开终端:

cd /Users/yupengfei/Documents/040_软件工程/Bclaw-sandbox/Buclaw

3.1 Debug 构建

./gradlew assembleDebug

成功后 APK 位于:

app/build/outputs/apk/debug/app-debug.apk (约 5.6 MB)

3.2 清理 + 重新构建

./gradlew clean assembleDebug

3.3 查看所有可用的 Gradle 任务

./gradlew tasks

3.4 仅编译检查(不生成 APK)

./gradlew compileDebugKotlin

四、真机调试 🔌

4.1 开启手机开发者模式 + USB 调试

品牌开启方法
小米/Redmi设置 → 我的设备 → 全部参数 → 连击 MIUI 版本 7 次
华为/荣耀设置 → 关于手机 → 连击 版本号 7 次
OPPO/一加设置 → 关于手机 → 连击 版本号 7 次
vivo设置 → 更多设置 → 关于手机 → 连击 软件版本号 7 次
三星设置 → 关于手机 → 软件信息 → 连击 编译编号 7 次
Pixel设置 → 关于手机 → 连击 Build number 7 次

然后进入 开发者选项,开启 USB 调试

4.2 USB 连接

# 用数据线连接手机,手机弹窗选择"允许 USB 调试" adb devices # 应显示: # List of devices attached # XXXXXXXX device

4.3 一键构建 + 安装 + 启动

# 构建并安装到设备 ./gradlew installDebug # 启动应用 adb shell am start -n com.buclaw.app/.MainActivity

或者分步操作:

# 仅安装已构建的 APK adb install app/build/outputs/apk/debug/app-debug.apk # 启动应用 adb shell am start -n com.buclaw.app/.MainActivity

4.4 无线调试(推荐 Android 11+,摆脱数据线)

# 手机和 Mac 连同一个 WiFi # 手机:开发者选项 → 无线调试 → 使用配对码配对设备 # 记下 IP:端口 和 配对码 adb pair 192.168.x.x:xxxxx # 输入配对码 adb connect 192.168.x.x:xxxxx # 验证 adb devices

4.5 查看实时日志

# 查看 Buclaw 应用的日志(按包名过滤) adb logcat --pid=$(adb shell pidof com.buclaw.app) 2>/dev/null || adb logcat | grep -i buclaw # 只看错误 adb logcat *:E | grep buclaw # 清空日志后重新开始 adb logcat -c && adb logcat --pid=$(adb shell pidof com.buclaw.app)

4.6 实时开发循环(改代码 → 看效果)

# 一条命令完成:构建 → 安装 → 启动 ./gradlew installDebug && adb shell am start -n com.buclaw.app/.MainActivity

💡 提示:可以在 CodeBuddy / VSCode 中配置 Task 来快速触发,见下文。


五、模拟器调试 📱

如果没有安卓真机,可以使用 Android 模拟器:

5.1 创建模拟器

# 列出可用的系统镜像 ~/Library/Android/sdk/emulator/emulator -list-avds # 如果没有 AVD,使用 avdmanager 创建 ~/Library/Android/sdk/cmdline-tools/latest/bin/avdmanager create avd \ -n Buclaw_Test \ -k "system-images;android-35;google_apis_playstore;arm64-v8a" \ -d pixel_6

如果没有 cmdline-tools,需要先安装:

~/Library/Android/sdk/bin/sdkmanager "cmdline-tools;latest"

5.2 启动模拟器

~/Library/Android/sdk/emulator/emulator -avd Buclaw_Test &

5.3 安装到模拟器

# 等模拟器完全启动后 ./gradlew installDebug adb shell am start -n com.buclaw.app/.MainActivity

六、VSCode Task 配置(可选,提升效率)

.vscode/tasks.json 中配置快捷构建任务:

{ "version": "2.0.0", "tasks": [ { "label": "🔨 Build Debug APK", "type": "shell", "command": "./gradlew assembleDebug", "group": { "kind": "build", "isDefault": true }, "problemMatcher": [] }, { "label": "🚀 Install & Run on Device", "type": "shell", "command": "./gradlew installDebug && adb shell am start -n com.buclaw.app/.MainActivity", "group": "build", "problemMatcher": [] }, { "label": "🧹 Clean Build", "type": "shell", "command": "./gradlew clean assembleDebug", "group": "build", "problemMatcher": [] }, { "label": "📋 View Logs", "type": "shell", "command": "adb logcat --pid=$(adb shell pidof com.buclaw.app)", "group": "test", "isBackground": true, "problemMatcher": [] } ] }

使用方式:Cmd+Shift+PTasks: Run Task → 选择任务。


七、运行时权限说明

日历功能首次打开时会弹出系统权限对话框:

Buclaw 请求访问您的日历 [拒绝] [允许]

如果误拒,可在手机 设置 → 应用管理 → Buclaw → 权限 中手动开启。


八、常见问题

问题解决方案
./gradlew: Permission denied执行 chmod +x gradlew
SDK location not found检查 local.propertiessdk.dir 路径
adb: command not found执行 export PATH=$PATH:~/Library/Android/sdk/platform-tools
adb devices 显示空列表1. 换 USB 线/接口 2. 手机重新授权 3. adb kill-server && adb start-server
日历页面无数据确保手机上有日历账户且有事件,检查权限已授予
构建失败 JAVA_HOME确认 JDK 17 已安装:java -version
构建慢首次构建需下载依赖(约 2 分钟),后续增量构建约 10-20 秒
安装失败手机设置中允许"安装未知应用"

九、生成 Release APK

# 1. 生成签名密钥(首次) keytool -genkey -v -keystore buclaw-release-key.jks \ -keyalg RSA -keysize 2048 -validity 10000 -alias buclaw # 2. 在 app/build.gradle.kts 中配置 signingConfigs # 3. 构建 Release 版本 ./gradlew assembleRelease

📱 应用界面说明

  • 主页面:两张功能卡片(日历 📅 / 对话框 💬),Material 3 风格
  • 日历页面:卡片列表展示事件(标题、时间、地点、所属日历)
  • 对话框页面:Hello World 大标题 + 三个按钮触发不同类型对话框