X-OmniClaw Technical Report: A Unified Mobile Agent for Multimodal Understanding and Interaction
Paper: arXiv:2605.05765 Code: OPPO-Mente-Lab/X-OmniClaw Code reference:
main@8614c935(2026-05-22)
1. Motivation (研究动机)
当前 mobile agent 的断点
这篇技术报告要解决的不是“让模型会聊天”,而是让手机端 agent 能在真实 Android 生态里把多模态感知、个性化记忆和可执行动作接成一个闭环。作者指出,已有方向各有缺口:OpenClaw 这类开源 agent 框架强调 skills、memory、tools 的分层工程化,但主要面向 PC/通用执行环境;Mobile-Agent、AppAgent、UI-TARS、Doubao Phone 等证明了视觉或系统编排可以驱动移动 UI,但真实部署中仍容易受弱结构页面、广告浮层、跨 App 深层入口、用户自定义逻辑和端侧隐私数据限制;AndroidWorld、OSWorld、WebArena、DigiRL 等仿真/评测环境有利于策略迭代,却与用户真实设备、相机、麦克风、本地相册、系统配置和 app 历史状态隔着一层。
论文的核心目标是把手机本身当作第一人称执行底座:屏幕 UI、真实世界相机画面、语音输入、定时触发、外部 Gateway 触发、历史任务状态和本地个人数据都进入同一条 agent pipeline。这样做的价值在于,agent 不再只是“看截图再点坐标”,而是能在用户真实设备上理解“此刻我看见什么、用户刚说了什么、上一步执行到哪里、过去有哪些可复用路径”,然后把高层意图落到 Android 原子动作、Deep Link、Intent、技能卡和可回放轨迹。
为什么 edge-native 重要
论文特别区分 cloud-centric 与 edge-native。云手机/虚拟 Android 可以降低本机算力压力,但缺少真实传感器、真实应用状态、私有本地数据和设备级配置;X-OmniClaw 则把核心感知和执行逻辑放在用户物理手机上,让云端 LLM/VLM 只承担高层推理或视觉理解的“燃料”。这个设计直接服务三个问题:一是隐私和本地上下文不必全部搬到远端虚拟机;二是真实 App 的 Activity、Intent、Accessibility Tree、相册 MediaStore 等端侧资源可以被系统级工具利用;三是用户可以把重复路径沉淀成可审计、可编辑、可复用的技能,而不是每次让模型从零规划。
2. Idea (核心思想)
核心洞见
X-OmniClaw 的核心洞见是:移动端 agent 的可靠性主要来自“端侧可执行闭环”,而不是单一更强的视觉模型。它把感知、记忆、行动作为同一个系统栈来设计:Omni Perception 负责把 UI/相机/语音/定时/外部触发对齐成结构化意图,Omni Memory 负责把运行时证据和长期个人数据变成可检索上下文,Omni Action 负责用结构化 UI、视觉 grounding、OCR、Deep Link、Intent 和行为克隆把意图执行掉。
相对 OpenClaw,X-OmniClaw 的差异在于执行底座从 PC/通用工具栈转向 Android 真机;相对纯 screenshot/coordinate mobile agent,它不是只从像素预测下一步点击,而是优先融合 Accessibility/XML、UI detection、OCR、root/Intent introspection 和 skill cards;相对云手机框架,它强调用户本机传感器、本地相册、权限和 app 状态是 agent 的一等输入。
更具体地说,论文的新意不是提出某个单独 loss,而是把移动设备上原本分散的能力做成统一 harness:屏幕和相机让 agent 获得第一人称感知,工作记忆和长期文件让 agent 能跨任务积累上下文,Deep Link / Intent / skill export 让成功路径从“临时点击序列”变成“可复用动作原语”。因此它的研究价值更偏系统架构:展示一个 mobile-native personal assistant 需要哪些端侧接口、权限、记忆文件、技能协议和回放机制共同工作。
3. Method (方法)
3.1 Overall framework:Perception–Memory–Action 闭环
Figure 1 解读:整体结构把 Voice、Screen、Camera 作为多模态输入,先进入 agent loop,再通过 Android device tools、skills 和 memory 影响后续执行。图中最关键的箭头不是单向“输入到回答”,而是执行结果会反过来成为 refined experience 和 persistent memory:每次 App 操作、页面状态、相册语义、可复用 Deep Link 都可能改变下一次规划。因此 X-OmniClaw 更像端侧 agent runtime,而不是一次性 GUI 操作器。
系统级闭环可以概括为 perceive → plan → act → verify。README 中把设备操作分成 observation、reasoning、execution:observation 由截图、XML metadata、screen projection 构成统一观察栈;reasoning 由 LLM/VLM 检查页面、上一动作状态、记忆和技能;execution 调度 Android 原子动作,包括 tap、swipe、text input、app switch。released code 中这个闭环主要分布在 ContextBuilder.kt、DeviceTool.kt、MainEntryNew.kt 和 skills assets 里。
3.2 Omni Perception:统一入口与场景化意图理解
Figure 2 解读:Omni Perception 解决“任务如何进入系统”和“系统如何理解当前环境”两个问题。入口层包含 App 内 UI、系统悬浮窗、麦克风语音、用户定义的定时/重复任务,以及 Feishu、Discord、Gateway 等外部触发;感知层同时接收屏幕投影、相机流和 ASR 文本;时间对齐模块把用户按下语音的时刻与对应屏幕/相机帧绑定,避免模型用错上下文。
具体机制有三层。第一,统一 ingress:普通即时请求、定时任务和外部 bot 事件都汇入同一 agent pipeline;代码侧 AlarmTaskScheduler.kt 使用 AlarmManager.RTC_WAKEUP、setExactAndAllowWhileIdle / fallback inexact alarm 把定时触发拉回执行服务。第二,多模态感知:Camera 与 screen projection 给出视觉观测,ASR 实时转写语音;论文提到端侧 AEC 抑制手机外放导致的自回声,repo 中也有 extensions/observer/.../audio/AudioFramePreprocessor.kt、WebRtcAecNativeBridge.kt、SimpleAdaptiveEchoCanceller.kt 等音频预处理组件。第三,UI grounding:DeviceTool.executeSnapshot 先从 AccessibilityProxy.dumpViewTree 读取无障碍树,再通过 SnapshotBuilder 和 ref manager 生成可点击引用;若结构不足,UiYoloSnapshotEngine 调用截图与本地 ONNX detector,再由 UiDetectionFusionEngine 用 IoU 和中心距离把 detection boxes 融合到 Accessibility refs。
直觉上,这个设计把“语音请求”“当前屏幕”“真实相机画面”和“可操作 UI 元素”变成同一份决策证据。没有这一层,agent 要么只能做语义聊天,要么只能盲点截图;有了这一层,像“这瓶水在淘宝卖多少钱”这样的请求才能被拆成物体识别、购物意图、目标 App、搜索关键词和页面抽取。
3.3 Omni Memory:工作记忆、相册语义记忆与用户画像
Figure 3 解读:Omni Memory 左侧强调 runtime context:截图、压缩观测、执行状态和对话上下文共同维持当前任务;右侧强调长期 artifacts:相册图片语义、用户画像、任务记忆和 skills/tools 协作。它不是把所有历史文本塞进 prompt,而是把不同来源压缩成可审计文件,例如 IMAGE-MEMORY.md、USER-PROFILE.md 和 pending task memory。
论文把 memory 分成两类:一类是 working memory,用于跨轮次、跨前台 app 切换和长任务恢复;另一类是 long-term personal memory,用于把用户本地多模态数据蒸馏成个性化上下文。released code 中,GalleryMemoryWorkflow.syncGalleryMemories 扫描 MediaStore 新图、按 displayName 去重、调用 summarizer 生成 ImageMemoryEntry,再用 GalleryMemoryRepository.appendImageMemories 写入 IMAGE-MEMORY.md;随后 UserProfileGenerator / UserProfileMarkdownFormatter 重建 USER-PROFILE.md。MemoryEvolutionManager 则把普通 agent run 先写到 .memory-evolution-pending.jsonl,由专门的 memory evolution 定时任务批量合并,避免每轮任务直接污染长期记忆。
这个模块的设计取舍是“可审计而非黑盒缓存”。相册记忆保留 filename、time、album、summary 等紧凑字段,用户画像也分 Stable、Recent、Sources、Recent Signals Details。这样后续 gallery QA 或 CapCut 自动化可以按主题检索图片,但仍能追溯到具体文件和 content_uri,不会把个性化能力变成不可控的隐式状态。
3.4 Omni Action:混合 UI evidence 与 Android 原子动作
Figure 4 解读:Omni Action 把 action 拆成 observation、reasoning、execution 三段:观察阶段融合 XML、GUI detection、OCR、screen/camera context;推理阶段选择技能、检索记忆、决定下一步;执行阶段落到 snapshot、screenshot、open、act、tap、swipe、wait 等工具。右侧的 trajectory cloned execution 表明系统不只执行当前动作,还要把成功路径变成可复用入口。
关键机制是 hybrid grounding。Android 页面有的结构化信息可靠,有的页面被广告、浮层、自绘控件或弱结构节点干扰。X-OmniClaw 的策略是:结构化 Accessibility/XML 可用时优先用 ref 点击;结构缺失或空间语义模糊时,引入截图、YOLO detection、OCR 和 saliency 分析补足空间证据;执行前后用 wait、snapshot 和 guard 检查误点。DeviceTool.kt 中的 executeOpen 支持 URI / URL / explicit Activity / root launch,executeSwipe 和 tap 类动作通过 AccessibilityProxy 落地;tryAutoDismissObstruction 用 dual-track visual decision 尝试关闭遮挡但避免点到目标附近。
3.5 Trajectory Cloned Execution:Deep Link / Intent / Skill Card
论文用 Behavior Cloning 和 Trajectory Replay 描述从一次性 UI 操作到可复用 skill 的转变。更准确地说,X-OmniClaw 的 released code 目前实现的是 行为轨迹捕获 + 页面启动参数恢复 + 技能导出:用户通过悬浮窗开始录制,系统订阅 Accessibility events,用户在目标页面触发 bookmark,随后抓取当前 Activity 的 launch Intent、data URI、extras 和页面摘要,最后导出成可调用 skill。
BehaviorRecordingController.start 清空记录、启动 DeeplinkBookmarkSession、添加 Accessibility event listener 并显示悬浮窗;bookmarkCurrentPage 调用 DeeplinkBookmarkSession.bookmarkCurrentPage;DeeplinkIntentCapture.capture 通过 root 执行 dumpsys activity activities,先按 Activity short class grep,再按 resumed package grep,最后 full parse fallback;DeeplinkIntentParser.buildAmCommand 把 action/data/component/categories/extras 还原为 am start 命令;DeeplinkLauncher.launch 优先 root am,失败则尝试 direct Intent;DeeplinkSkillExporter.buildSkillMarkdown 生成符合 skills 格式的 SKILL.md。
论文公式与 released code 实现差异:报告没有给出监督学习式 Behavior Cloning loss,也没有在 repo 中看到 policy network 训练脚本;released code 中的 “behavior cloning” 更接近可执行轨迹/Intent 捕获和 skill materialization,而不是从人类轨迹训练一个动作模型。因此阅读时不应把这里理解成传统 imitation learning 的 ,而应理解成工程上的 observe-then-distill。
3.6 Demo workflows:从架构到任务
Figure 5a–5b 解读:Figure 5a 展示相机识物到淘宝检索:用户用语音问真实物体价格,系统将相机视觉线索和语音意图转为 (app, keywords),通过 deeplink 进入目标 App,再滚动、截图、抽取价格/销量等结构化字段。Figure 5b 展示 ScreenAvatar:悬浮伴侣跟随屏幕,用户按住语音触发后,系统以当前屏幕为主视角连续规划和执行多步任务。
Figure 6 解读:Demo B 把 Omni Memory 和 Omni Action 串起来:后台先把相册整理成可检索语义记忆;用户说“找鹦鹉主题照片并一键成片”时,系统从 IMAGE-MEMORY.md 或 memory search 中取回匹配图片,映射到 MediaStore content_uri,复制到固定临时相册 A_latest,再驱动 CapCut / 剪映类一键成片流程。released skill capcut-theme-video 明确要求先清空 A_latest、再写入目标图片、再在剪映素材页选择该相册。
Figure 7 解读:Demo C 展示“录一次,下次一句话直达”。用户第一次导航到美团秒杀页时,系统观察 UI 路径并捕获 Activity/Intent;之后“打开美团秒杀”可直接调用保存的 bookmark/skill,优先恢复可执行地址,而不是机械重放每次点击。这对深层入口、广告中断和 app 版本变动更鲁棒。
3.7 Pseudocode:按 released code 抽象出的关键组件
def build_device_snapshot(accessibility_proxy, yolo_engine, ref_manager, include_yolo=True):
view_nodes = accessibility_proxy.dump_view_tree(use_cache=False)
if not view_nodes:
raise RuntimeError("Accessibility service unavailable or current page has no visible nodes")
ref_nodes = SnapshotBuilder.build_from_view_nodes(view_nodes)
snapshot_id = ref_manager.update_refs(ref_nodes)
if include_yolo:
screenshot = DeviceController.get_screenshot()
detections = yolo_engine.detect(screenshot.bitmap)
fused = UiDetectionFusionEngine.fuse(detections, view_nodes, ref_nodes)
return format_snapshot(ref_nodes, fused, snapshot_id)
return format_snapshot(ref_nodes, [], snapshot_id)def sync_gallery_memory(scanner, summarizer, repository, user_profile_generator, max_images=10):
cursor = load_album_scan_cursor()
existing = repository.load_existing_stable_keys()
discovered = []
while len(discovered) < max_images:
batch = scanner.scan_new_images(cursor=cursor, max_results=max(20, max_images))
if not batch:
break
for record in batch:
if record.display_name not in existing and len(discovered) < max_images:
discovered.append(record)
existing.add(record.display_name)
cursor = advance_cursor(batch)
entries = [summarizer.summarize(record) for record in discovered]
repository.append_image_memories(entries)
profile = user_profile_generator.build_user_profile()
repository.write_user_profile(profile)
return entries, profiledef capture_and_export_deeplink_skill(package_name, activity_name, page_summary):
block = root_shell("dumpsys activity activities | grep -B 2 -A 60 Hist")
spec = DeeplinkIntentParser.parse_block(block, package_name, activity_name)
if spec is None:
block = root_shell("dumpsys activity activities")
spec = DeeplinkIntentParser.parse_block(block, package_name, activity_name)
bookmark = DeeplinkBookmark(
package_name=package_name,
activity_name=activity_name,
data_uri=spec.data_uri or "",
intent_command=spec.am_command,
page_title=page_summary,
)
skill_md = DeeplinkSkillExporter.build_skill_markdown(bookmark, skill_name=slug(page_summary))
return save_skill_card(skill_md), bookmarkdef schedule_app_task(alarm_manager, task):
pending_intent = build_pending_intent(task.id, task.next_trigger_at_ms)
if task.exact and can_schedule_exact_alarms():
if task.allow_while_idle:
alarm_manager.setExactAndAllowWhileIdle("RTC_WAKEUP", task.next_trigger_at_ms, pending_intent)
else:
alarm_manager.setExact("RTC_WAKEUP", task.next_trigger_at_ms, pending_intent)
elif task.allow_while_idle:
alarm_manager.setAndAllowWhileIdle("RTC_WAKEUP", task.next_trigger_at_ms, pending_intent)
else:
alarm_manager.set("RTC_WAKEUP", task.next_trigger_at_ms, pending_intent)Code reference:
main@8614c935(2026-05-22) — pseudocode and mapping based on this commit
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| Edge-native Android agent loop | app/src/main/java/com/shijing/xomniclaw/core/MainEntryNew.kt, ContextBuilder.kt, DeviceTool.kt | ContextBuilder.loadBootstrapFiles, device tool dispatch, session/runtime context |
| Unified UI snapshot / hybrid grounding | agent/tools/device/DeviceTool.kt, SnapshotBuilder.kt, yolo/UiYoloSnapshotEngine.kt, yolo/UiDetectionFusionEngine.kt | executeSnapshot, buildSnapshotResult, fuse |
| Speech/screen/camera ingress and AEC support | voice/VoiceRecorderManager.kt, extensions/observer/.../audio/*.kt, config/XOmniClawConfig.kt | STT config, audio preprocessing, WebRTC/Simple AEC bridge |
| Gallery-derived long-term memory | agent/memory/gallery/GalleryMemoryWorkflow.kt, GalleryMemoryRepository.kt, UserProfileMarkdownFormatter.kt | syncGalleryMemories, appendImageMemories, toMarkdown |
| Task-memory evolution | agent/memory/evolution/MemoryEvolutionManager.kt | recordAgentRun, runEvolution, .memory-evolution-pending.jsonl |
| Deep Link / Intent capture | deeplink/DeeplinkIntentCapture.kt, DeeplinkIntentParser.kt, DeeplinkLauncher.kt | capture, buildAmCommand, launch |
| Behavior recording and skill export | behavior/BehaviorRecordingController.kt, deeplink/DeeplinkSkillExporter.kt | start, bookmarkCurrentPage, buildSkillMarkdown |
| Scheduled proactive triggers | scheduler/AlarmTaskScheduler.kt, scheduler/ScheduledTaskExecutionService.kt, assets/skills/scheduled-automation/SKILL.md | schedule, getSchedulingMode, execution service wake-up |
| Demo skills | app/src/main/assets/skills/taobao-search/SKILL.md, gallery-memory/SKILL.md, capcut-theme-video/SKILL.md | Taobao deeplink search, gallery sync, A_latest CapCut workflow |
4. Experimental Setup (实验设置)
论文类型与评测对象
这是一篇系统 technical report,不是以标准 benchmark leaderboard 为中心的训练论文。论文没有报告可复现的训练集规模、测试集样本数、随机种子、GPU 训练配置或定量 benchmark 表格;评测对象主要是 X-OmniClaw 在真实 Android 手机上的系统能力演示。可视为 qualitative system evaluation:验证 edge-native mobile agent 是否能在真实 app、真实传感器和端侧个人数据上完成闭环任务。
Datasets / data sources
- 论文未报告标准 dataset 和 sample count:没有给出 AndroidWorld、AITW、OSWorld、WebArena 等基准上的样本数或得分。
- 运行时数据源:真实手机屏幕状态、Accessibility Tree/XML、截图/录屏帧、相机画面、麦克风语音、定时触发、外部 Feishu/Discord/Gateway 事件。
- 长期记忆数据源:用户授权下的相册 MediaStore、本地
IMAGE-MEMORY.md、USER-PROFILE.md、任务执行日志和技能文件。 - Demo 场景:三条主线 / 四个 demos:A1 Camera-informed execution,A2 ScreenAvatar execution,B Memory-based one-tap video,C Instant portal to a Meituan flash-sale page。
Baselines / comparisons
论文没有做正式数值对比;Related Work 中对比的参考系统包括 OpenClaw、Hermes Agent、Mobile-Agent、AppAgent、UI-TARS、Doubao Phone、AndroidWorld、OSWorld、WebArena、DigiRL,以及 RedFinger/Wuying/Tencent Cloud Phone 等 cloud phone 架构。主要对比维度是架构能力:PC-side vs mobile-native、cloud-centric vs edge-native、视觉单轨 vs hybrid UI evidence、一次性 GUI 操作 vs 可复用 skill / trajectory replay。
Metrics
论文没有定义数值指标。可从文本中抽取的 qualitative metrics 包括:interaction efficiency、task reliability、context awareness、personalization、robustness under advertisements / weak structure / app version changes、direct-access execution success,以及 user-governed customization。README 也强调 observable runs and cost、loop detection、controlled stop,但没有给出具体成功率、latency 或 token cost 表。
Deployment / configuration
released repo 给出的是部署配置而非训练配置。README 中示例 Agent model 使用 OpenRouter qwen/qwen3.6-flash,context window 131072,max tokens 8192;STT 示例是 SiliconFlow FunAudioLLM/SenseVoiceSmall;VLM 示例同样用 OpenRouter 兼容视觉模型,context window 200000,max tokens 16384。首次配置需要授予 7 项权限:无障碍、悬浮窗、录屏、相册、全部文件访问、摄像头、麦克风。构建要求 JDK 17、Android SDK、Gradle wrapper,示例命令是 ./gradlew :app:assembleDebug。
训练配置说明:论文和 repo 当前没有提供用于训练 Behavior Cloning policy、UI detector 或 VLM/LLM 的 launch script;上述数字来自 README 的 deployment config snippets,而不是训练超参。若未来 repo 增加训练脚本,本笔记的 training-config 部分需要重新核对。
5. Experimental Results (实验结果)
Main results: qualitative demonstrations
论文的主要证据是演示而非定量表格。Demo A1 证明系统可以把真实物体 + 语音请求转换为电商 app 检索:识别商品线索,构造 Taobao deeplink,打开搜索页,滚动结果,截图/读取页面,并抽取价格、销量等结构化字段。Demo A2 证明 ScreenAvatar 可以跟随当前投屏/界面,用 push-to-talk 触发多步执行并依据反馈调整。Demo B 证明相册语义记忆可以被下游 UI 自动化消费:后台生成图片记忆,按主题检索“parrot”候选,复制到 A_latest,再进入 CapCut / 剪映一键成片流程。Demo C 证明 behavior cloning 可以把深层 app 页面变成可复用 bookmark / skill:录制一次轨迹,之后一句话直达美团秒杀页。
Ablation / component findings
论文没有报告消融实验数值,但从系统描述能看出各模块的必要性。没有 Omni Perception,语音、屏幕、相机和定时触发会被割裂,尤其无法处理“按下说话那一刻屏幕内容是什么”这类对齐问题;没有 Omni Memory,长任务和个性化媒体任务只能依赖临时对话上下文,无法稳定复用相册语义、用户画像和任务历史;没有 Omni Action 的 hybrid grounding,弱结构页面、广告浮层和自绘控件会让 XML-only 或 screenshot-only 方法更容易误点;没有 Deep Link / Intent capture,长路径 app 页面每次都要重放点击序列,难以跨版本和中断恢复。
Released-code evidence
代码与报告主张基本对齐:repo 公开于 OPPO-Mente-Lab/X-OmniClaw,当前记录的 github_ref 是 main@8614c935 (2026-05-22)。README 明确链接 arXiv 2605.05765,并列出 10 个 bundled skills:app-search、taobao-search、gallery-qa、gallery-memory、capcut-theme-video、clipboard-to-shortcut、model-config、channel-config、skill-creator、scheduled-automation。实现层面能找到与论文三大模块对应的 Kotlin/asset 文件:snapshot/Yolo/OCR/Accessibility 融合、gallery memory/user profile、memory evolution、deeplink intent capture、behavior recording、scheduler、Taobao/CapCut demo skills。
Limitations
作者在 conclusion/future work 中没有给出传统 limitations table,但明确提出三条后续方向,也可视为当前边界:第一,需要 self-evolving mechanism,把复杂 reasoning chains 蒸馏成更紧凑表示,以降低 token consumption 和 response latency;第二,需要 dynamic memory evolution,包括 semantic consolidation 和 selective forgetting,避免用户画像过期或低质;第三,需要更成熟的 device-cloud synergy,在端侧隐私/轻量处理与云端开放域推理之间做 intent-aware secure gateway。除此之外,本报告缺少正式 benchmark、成功率、延迟、token cost、鲁棒性统计和用户研究,因此现阶段更像系统蓝图和开源工程报告,而不是定量证明某个 mobile-agent 策略显著优于 baseline 的论文。
Overall conclusion
X-OmniClaw 的贡献在于把 mobile agent 从“模型看屏幕做动作”的单点能力推进为端侧 runtime:真实手机负责多模态感知、权限和执行,云端模型负责高层推理,长期记忆和 skills 把成功经验沉淀成可复用工具。对 Web & GUI Agent 方向来说,它最值得关注的点不是单个模型指标,而是 Android 真机上的工程闭环:Accessibility/XML + visual fallback、local memory artifacts、Deep Link/Intent replay、scheduled automation 和 user-steerable skill ecosystem 如何组合成可持续演化的个人 mobile assistant。