← 返回 Tony's Lab网页由小虾生成 🦐
SYS:LAB / MIKA源码级拆解v0.1.2 · 2026-10-30

一台看不见的屏,
一双看不见的手

wangzan101/Mika 是昨天才建库的安卓 AI 助理。它最不像玩具的地方,不是能调用大模型, 而是它把「像人一样用手机」拆成了一组可以测的数字:落指前停多久、按住多久、手势偏几像素、 两次对外动作之间隔几秒。这篇文章把它的源码拆开看。

图号
MKA-001
比例
1 : 133081
日期
2026-10-30
许可
Apache-2.0
00读数

先看四个数

REPO AT A GLANCE
133,081行 Kotlin,971 个文件
45,456行测试代码,363 个测试文件
0个 TODO / FIXME
3个版本,12 小时内

仓库 2026-10-29 14:34 UTC 建立,现在是 105 ★ / 20 fork / 1 个 open issue。 全部提交来自同一个人,共 13 次。这三个数字放在一起,本身就是一个结论:这是一个人用 AI 辅助、两天里压出来的完整产品级代码库。 值得讨论的不是「是不是 AI 写的」,而是「这样写出来的东西,到底站不站得住」。

01结构

三层:屏、手、脑

THREE STRATA

Mika 的能力不是一个大循环,而是三层互不认识的模块。这个划分贯穿整个仓库,也是它能被单测覆盖的前提。

屏 / SCREEN
虚拟屏内置助手经手机自己的「无线调试」启动,在独立虚拟屏上打开 App;安卓 14 起这块屏有自己的焦点,不影响你主屏打字。
手 / HAND
无障碍 + OCR + 手势读控件树,树不够用就用随 APK 带的 ML Kit 中文 OCR 补字,再不够让看图模型定位;点击、滑动、输入全部走这一层。
脑 / BRAIN
AgentLoop只做调度,判断拆给 ModelCaller、TurnPolicy、StopRules、BatchRunner 各管一件事;核心不认识任何具体能力。

最值得看的是依赖方向::core 是纯 Kotlin(不依赖安卓),:app 是安卓宿主; core/cap/<能力> 依赖核心,核心不引用任何能力,能力之间也互不引用,只有装配层同时认识几种能力。 这条规则由一个叫 PackageDependencyTest 的测试守着——不是写在文档里,是写进 CI 之外的构建里。

docs/architecture.md §1

02签名

一次点按的预算

THE COST OF ONE TAP · SIGNATURE

全仓库最不像「AI 生成」的地方,是 GesturePacing.kt 和 OutwardPacing.kt 这两个文件。 它们不优化速度,专门负责变慢——因为一个 0 毫秒落指、匀速直线滑动的操作,在任何风控系统眼里都不是人。

图 1

一次点按的时间预算

0100200300400 ms
落指前30–120 ms 随机
按住50–120 ms
手势弧线偏移 ≤6% / ≤30px
t = 0 ms落点偏移 ≤ 1/5 宽 · ≤12px(坐标点 ≤3px)· 时长 ±8%
等待 按住 移动
08 s20 s30 s
第一次不等
8–20 s 随机
上限 30 s
同一次「发送」:手指上 0.2 秒的事,它的对外节奏是 8 秒起 —— 约 40 倍。 30 分钟内做得越多,上下限各 +0.5 / +1 秒。

还有一套按网站算的:同一站点连续换页,第一页不停,第二页起停 4–7 秒,每多一页上下限各加 0.6 / 1 秒,最长 12 秒;标了 pace: careful 的站点从 10–16 秒起,最长 30 秒。同一个站一个任务最多 20 页(careful 12 页),到了就让模型停下来问你。

为什么这些数重要。它们不是性能指标,是伪装成本。一个 agent 值不值得用,往往就卡在这里:太快被封,太慢没法用。 Mika 把「多快算人」写成了常量,还让停留和间隔在插话时不丢——被打断只是让模型早点想,不会让下一次动作来得更快。
03结构

唯一的执行入口

ONE DOOR OUT

所有改变外部世界的动作——点一下、打一个字、发一条消息、跑一条命令——都必须经过 ActionExecutor。 这不是约定,是编译期强制:ToolDispatcher.execute 要一个 ActionPass,而它的构造函数是 internal,只有 ActionExecutor 能造。

  1. 守卫重复同一动作、没有进展、反复读同一屏、失败太多——先拦。
  2. 锁屏检查屏幕锁着就停,不硬来。
  3. 不可逆判定与同意认得出这是不是「对外」或「花钱」的一步。
  4. 对外节奏判定之后、动作之前等 8–20 秒——这段时间任务还能取消。
  5. 执行 + 动作后核对比出实际效果,输入要读回核对;看不出变化时如实标 treeBlind,不说「多半没点上」。
  6. 记录写进运行记录,密码框输入和像密钥的字符串由 Redactor 遮掉。

复合工具(一次多步的 do_steps、沙箱里的 mika phone、网页脚本)内部的每个子动作,经 SubActions 回到同一个入口——所以「批量打招呼」和「点一个按钮」走的是同一条记录路径,也受同一套节奏约束。

docs/architecture.md §4 · core/action/ActionExecutor.kt

04结构

它知道什么,以及怎么不被撑爆

KNOWLEDGE, PROMPTS, CONTEXT

知识是纯文本,谁都能加

18 个 App 的 APP.md、12 个网站的 SITE.md、4 个技能,加起来只有 54 KB。 格式是带 YAML 头的 Markdown,加一份就是加一个目录。构建时 KnowledgeIndex 扫头部、校验、生成索引,校验不过直接构建失败。 这份东西的护城河不在代码里,在内容里——写微信的坑、写小红书的入口,比写一行 Kotlin 难得多。

提示词分六层,且有金样

prompts/ 有 464 KB,分 P0 身份 / P1 准则 / P2 能力段 / P3 工具说明 / 入口短说明 / 反馈文案。 规则很硬:system/ 里不许出现任何工具名(由测试检查);工具结果文案必须自成一体,代码不许用 + 拼; 每条反馈键都要有代码在用。全部文字有金样测试,四种工具展开情形的全貌和字节数都存在 prompt-surface/ 里——改一个字的后果会出现在提交差异里。

上下文分四区,只追加

  • 区 0 系统提示词 + 工具定义:一个任务内只在展开一组工具时变,每组至多一次。
  • 区 1 开局上下文:写一次不改(历史对话、记忆、原话、知识、技能)。
  • 区 2 历史:只追加,从不改写。
  • 区 3 本步结果:在哪个界面、第几步、当地时间,附在最后一条消息末尾。

输入估算超过上下文的 0.6 才压缩,压到触发线一半以下;用户说的话永不裁剪,压缩后 ContextRecovery 把缺了的原话补回原位。

05安全

只有花钱会问你

THE APPROVAL MODEL

这是全仓库最有争议的一个决定。它只在一件事上停你:钱。

动作询问模式(默认)
下单、付款、屏上有金额时的提交停,出确认卡片(只同意这一次 / 不同意)
发消息、发帖、提交表单直接做
删除、改账号或安全设置直接做
往密码框里打字直接做
看不出是什么的按钮直接做
定时任务 / 子任务 / MCP(无人在场)付款一律拒绝,别的照做

作者的理由写在提交信息里:「发消息不算花钱」——商家客服、闲聊里提到价钱不该被拦。代价是,误发、误删的锅是用户的。 开发者选项里有个「自主模式」,开了连付款也不问。而 roadmap 自己承认了一处漏洞:自主模式的提前返回排在「不操作 Mika 自己」的检查之前,所以那层保护在自主下不生效。

它自己承认的四个洞。网页只读脚本里:①按 value 选元素只拦了直接写的选择器,CSS 转义还能绕;②秘密输入框只遮了 value,valueAsNumber / selectionStart 还能间接读出内容;③fetch 请求头全放行,没做白名单;④「是不是密码框」只看只读环境建立之后的变化。
——能把这四条写进 roadmap 的项目,比不写的可信;但反过来说,安全审计确实还没成熟。
06证据

工程证据,和它的缺口

EVIDENCE & GAPS

做得比多数商业项目细的地方

  • 构建即校验:知识索引校验不过构建失败;README 里会变的清单由 ./gradlew updateReadme 从源码重新生成,还有测试守着两边一致。
  • 文档一致性测试:DocsConsistencyTest 读仓库根目录的文档,再对照 app 源码——文档过期会挂测试。
  • 金样测试:循环场景的消息序列、提示词表面全貌,都有快照。
  • 真机评测集:eval/tasks/ 分了 barrier / impossible / irreversible / memory / read / skills / web / write,不可逆题默认不跑,要显式开。
  • 45,456 行测试,占全部代码约 34%。

缺的地方,一样明显

  • 没有 CI。仓库里连 .github/ 都没有。所有测试都是本地跑的,没有一道门拦着。
  • 一个人、13 次提交。没有 PR 流程,没有第二双眼睛看过。
  • 0 个 TODO。133,081 行里一条待办都没有——这不正常,通常意味着要么极度自律,要么是生成时被要求「不要留 TODO」。
  • 最终核查是关的。TaskRun.reviewFinalAnswer = false,所以回答一律记为「未核实」,而技能草稿、经验回放都要求「核实过」——整个学习闭环目前是死的。

docs/roadmap.md「已知问题」第 1 条

07判断

值不值得

VERDICT

真本事

  • 虚拟屏这条路走通了。不用 root、不用电脑、不用数据线,靠无线调试启内置助手,把 App 拉到后台屏上操作——这是安卓 agent 最难的一环,市面上的方案大多绕开它。
  • 把「像人」变成了可测的数。手势节奏、页面停留、对外间隔,全是常量加随机,且被打断也不丢。
  • 架构守得住。编译期唯一入口、依赖方向测试、提示词金样——这三样是长期维护的地基。
  • 诚实。roadmap 里自己列了 12 条已知问题,包括安全洞和「学习闭环不生效」。

真风险

  • 默认太激进。发消息、删除、改设置全不问。产品上能理解,出事时锅在用户。
  • ToS 迟早找上门。自动化操作微信、小红书、BOSS 直聘,封号是概率问题不是是非问题。
  • 没有商业模式。无服务器、BYO Key、Apache-2.0。普通人卡在「先去申请一个 API Key」这一步。
  • 单点依赖。一个人、两天、13 万行。下一个版本还能不能跟上,取决于这个人还有没有兴趣。

一句话:这是「技术含量远大于商业可行性」的那类项目。它不解决「普通人怎么用上 AI」, 它解决的是「一个 agent 怎么才敢替你在真手机上按下那个按钮」——而这个问题,大多数做移动 agent 的团队都还没开始认真回答。

想玩可以下 APK:安卓 11 能装,13 才能跑任务,14 体验最好;沙箱只支持 arm64。 但别拿主微信试。

08出处

资料来源

SOURCES
  • 仓库 · github.com/wangzan101/Mika(main @ 2026-10-30)
  • 架构 · docs/architecture.md(265 行,按代码现状写,带类名与文件路径)
  • 路线图 · docs/roadmap.md(已完成 / 接下来 / 已知问题与暂缓)
  • 知识格式 · docs/knowledge-format.md
  • 版本 · Releases(v0.1.0 → v0.1.2)

文中所有数字来自本地克隆的源码与文档,非二手转述。

← 返回 TONY'S LAB网页由小虾生成 🦐 · MIKA 源码拆解 · 2026-10-30 · SYS:LAB/MKA-001