生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~185k tokens,输出 ~5k tokens(本节)
Android 应用与 iOS 应用一样扮演"节点"角色——连接到 Gateway 并暴露设备的硬件能力。它使用 Kotlin + Jetpack Compose 构建,是三个原生客户端中唯一运行在非 Apple 平台上的。
28.3.1 Kotlin 架构
Android 应用位于 apps/android/,使用 Gradle 构建:
// apps/android/app/build.gradle.kts
android {
namespace = "ai.openclaw.android"
compileSdk = 36
defaultConfig {
applicationId = "ai.openclaw.android"
minSdk = 31 // Android 12 (S) 最低
targetSdk = 36
}
buildFeatures {
compose = true // Jetpack Compose UI
buildConfig = true
}
}
值得注意的是 assets.srcDir 指向了共享库的资源目录——Android 应用直接复用 OpenClawKit 的资源文件(如音效、图标),但由于 Kotlin 无法直接使用 Swift 包,协议和模型需要在 Kotlin 中重新实现。
NodeRuntime 是 Android 应用的核心运行时,聚合了所有设备能力:
与 iOS 的 NodeAppModel 对应,NodeRuntime 创建并持有所有能力管理器的实例。它使用 Kotlin 协程(CoroutineScope + SupervisorJob)进行异步操作。
衍生解释 — Kotlin 协程与 SupervisorJob
Kotlin 协程是 Kotlin 的异步编程方案,类似于 Swift 的 async/await。CoroutineScope 定义了协程的生命周期范围,SupervisorJob 确保一个子协程的失败不会取消其他兄弟协程——这对于节点运行时很重要,因为摄像头失败不应该影响位置服务。
Android 要求长时间运行的后台任务必须通过 前台服务(Foreground Service)实现。NodeForegroundService 在 MainActivity.onCreate 时启动:
前台服务会在通知栏显示一个持久通知,告知用户 OpenClaw 正在运行。这确保了即使用户切换到其他应用,WebSocket 连接也不会被系统杀死。
28.3.2 Canvas / 摄像头 / 屏幕录制
Android 节点暴露的设备能力与 iOS 对齐:
每个能力管理器都需要与 Android 的权限系统集成。PermissionRequester 统一处理运行时权限请求:
屏幕录制比较特殊:Android 的 MediaProjection API 不仅需要运行时权限,还需要用户在系统弹窗中明确同意,因此有独立的 ScreenCaptureRequester。
MainActivity 还监听 preventSleep 状态流,在需要时设置 FLAG_KEEP_SCREEN_ON 防止屏幕自动关闭——这在 Canvas 展示或对话模式下很重要。
28.3.3 可选 SMS 支持
Android 独有的能力是 SMS 短信支持。当用户授予 SMS 权限后,AI 代理可以通过 SmsManager 读取和发送短信。这在 iOS 上由于系统限制不可能实现。
SMS 能力的声明和使用遵循与其他能力相同的模式:在连接 Gateway 时通过 capabilities 声明,Gateway 据此决定是否暴露 SMS 相关工具。
Android 应用使用 Kotlin + Jetpack Compose + Gradle 构建,最低支持 Android 12(API 31)。
NodeRuntime 是核心运行时,使用 Kotlin 协程和 SupervisorJob 管理各设备能力管理器。
前台服务确保 WebSocket 连接在后台不被系统终止,通过持久通知告知用户。
设备能力(Canvas、摄像头、屏幕录制、位置、SMS)各自有独立的管理器,统一通过 PermissionRequester 处理权限。
SMS 是 Android 独有能力,使得 AI 代理可以读写短信。