自定义替换超级小爱模型,越权完成更多任务。
一个 LSPosed / Xposed 模块,Hook com.miui.voiceassist。它做两件事:
- 换模型 — 把超级小爱背后的大模型替换成你自己配置的(OpenAI 兼容 / Anthropic / xAI / 硅基流动,任意 API Key)。你问、你的模型答,答案原路送回小爱的语音和卡片里。
- 提权 — 原生小爱受限于系统权限,很多事只能「跳到设置页让你自己看」「回一句不支持」。模块把 root 和无障碍能力打包成工具交给模型,它能真正读设备、改设置、启动应用、代你发微信消息。
换模型解决「答得好不好」,提权解决「能不能真的做到」。两件事合起来,超级小爱从一个受限的语音壳子变成一个能落地执行的设备助手。
超级小爱的回答能力由小米的云端模型决定,不可选、不可调。模块把这条链路截断,改由你的模型作答。
接管是完整替换,不是叠加。 小爱的输出有四条互相独立的路:
- TTS 语音播报
- 对话结果卡片
SpeakContentManager的权威文本(卡片上喇叭按钮重播读的是它,不是卡片文字)- App 内历史对话的 SQLite 落库
只改其中一条,就会出现「声音和字对不上」,或者回头翻历史记录还是小爱的原话。四条全部覆盖。
播报走小爱自己的 TTS。 复用 ToastStreamPlayer,音色、打断、音频焦点全是原生行为,听感和平时一致。不用小爱的主 TTS 入口是有原因的:模型答案有几秒延迟,那时会话往往已经拆了,主入口内部有引擎判空守卫,为 null 时静默丢弃、一声不吭;ToastStreamPlayer 设计上就是给「会话已结束、用户回头点重播」用的,正好合适。
服务商可扩展。 只有报文协议(OpenAI / Anthropic 两种)需要写代码,新增一家 OpenAI 兼容服务商只是在 AiProvider 里加一行默认地址和默认模型,界面和客户端都不用动。
接管时机可控。 不是所有话都拦。默认接管两类:小爱会跳设置页打发掉的查看类问题、小爱答不上来会跳全局搜索的兜底。放行词(如「打开」)可自定义,正常的「打开微信」「导航去公司」照旧交给小爱。也可以全开或全关。
原生小爱能做的事被系统权限框死了。模块把设备能力封装成工具表交给模型,模型自己决定调哪个、怎么调。
| 工具 | 作用 |
|---|---|
device_status |
电量与充电状态、剩余存储、内存、运行时长、机型、系统版本 |
wifi_info |
当前 WiFi 状态,含配置详情 |
network_info |
网络连接情况 |
top_memory_apps |
各进程内存占用排行 |
top_storage_apps |
各应用存储占用排行 |
list_apps |
已安装应用(包名 + 显示名) |
recent_notifications |
最近的通知 |
get_location |
设备当前位置(经纬度 + 地名),走系统定位而非 IP |
weather |
天气实况与预报(wttr.in),默认查当前位置 |
get_setting |
读系统设置项(System / Secure / Global) |
read_file |
读任意文本文件(root) |
current_time |
当前系统时间 |
| 工具 | 作用 |
|---|---|
launch_app |
启动应用 |
set_setting |
修改系统设置项 |
media_control |
控制正在播放的媒体 |
set_volume |
设置 / 查询媒体音量 |
send_message |
通过无障碍服务真的在微信里把消息发出去 |
run_shell |
以 root 执行任意 shell 命令 |
每一项都能在设置页单独开关——想让它只读不写,把「能做」那一栏全关掉即可。
| 你说的话 | 原生小爱 | 换脑 + 提权后 |
|---|---|---|
| 「电池健康怎么样」 | 跳设置页,答案自己找 | 留在对话里,读出真实数值直接说 |
| 「WiFi 密码是多少」 | 做不到 | 一轮工具调用读出来 |
| 「哪个应用最占内存」 | 做不到 | 列出排行并给建议 |
| 「给老王发微信说我晚点到」 | 双开机型直接回「暂不支持」 | 无障碍代操作,消息真的发出去 |
| 小爱答不上来时 | 「只能帮你到这儿啦」+ 跳全局搜索 | 拦掉兜底,模型正常回答 |
写类工具有保护。 启动应用、改设置、调音量这类会改变设备状态的工具,只在本轮确实由模块接管时才允许执行。真机上出过事故:「打开微信帮我给 X 发信息」命中放行词、本该交给小爱,模块没接管但模型照样跑了一遍并真的打开了微信,同时小爱在报「不支持双开」,两边各干各的。读类工具跑了无所谓,动手类不行。
工具循环为延迟设计。 语音场景下用户等不了,几处针对性优化:
- 组合式工具优先于通用 shell。「WiFi 密码是多少」交给
run_shell要跑四轮(列网卡 → 找配置 → 读文件 → 解析),每轮一次模型往返,实测 14 秒;wifi_info一轮出结果。 - 单个工具内部只起一次 shell,多条命令拼进同一次
su -c。真机上进程创建 80~150ms,起五次就是半秒白给。 - 同一轮里的多个工具调用并行执行,总耗时取决于最慢的那个。
工具调用双通道。 首选原生 function calling;端点不支持(返回 400)时自动降级为文本约定 <tool_call>{...}</tool_call>,并把工具表写进 system prompt。文本方言兼容 JSON、<name>/<arguments>、<parameter name=...> 三种写法——模型换方言时不至于把整段标记原样念出来。
在 ASR 终态记录问话。 实测「跳设置」的 Agent Action 比 setQueryInfo 早 334ms 就发出去了,那时按问话判定必然失效。改在语音识别终态结果处记录,比 Agent Action 早 266ms,来得及拦。
无障碍权限收窄到微信。 只声明 com.tencent.mm 一个包。无障碍服务能读到被授权应用的全部界面内容,范围能收窄就收窄。
模块自带 HyperOS 风格界面(Compose + Miuix),三个标签页:
- 首页 — 模块激活状态、配置完整度、快捷入口
- 记录 — 每一次拦截、模型请求、工具调用的完整明细,滑动删除,滚动保留最近 500 条
- 设置 — 服务商与密钥、system prompt、拦截开关与放行词、播报开关、逐项开关的工具授权
配置通过 ContentProvider 跨进程下发到小爱进程里的 Hook;运行记录反向经同一座桥回写进模块私有数据库。
- Android 13+
- HyperOS,超级小爱
com.miui.voiceassist(7.513.23.0010) - LSPosed(Xposed API 93+)
- Root
作用域勾选 com.miui.voiceassist
./gradlew :app:assembleDebugAGP 9.3 / Kotlin 2.4 / compileSdk 37。
模块依赖大量小爱内部的混淆类名(la0.n1、jb0.vd、z10.a 等),这些名字随小爱版本变化。所有 Hook 点在 HookEntry.kt 里集中声明,并注明了用途与实测依据,升级失配时从那里对照修正。
面向个人设备的功能增强,不涉及绕过任何鉴权或计费机制。开放 root 工具给大模型有其风险,请按需裁剪工具授权。
任何因使用该模块导致超级小爱获取过高权限所造成的设备损坏作者概不负责。
本项目采用 GNU General Public License v3.0。
第三方依赖均为 Apache-2.0(Xposed API、Miuix、Jetpack Compose、kotlinx-coroutines),与本协议兼容。