1. 项目简介
项目:Zorv AI(包名 com.ai.assistance.quro) 开源地址:https://github.com/Quor-a/ZorvAI 适用版本:v1.0.77 更新日期:2026-09-02
Zorv AI 是一款深度整合系统能力的 AI 助手,其核心亮点在于突破 Android 系统边界,实现跨应用感知、系统级浮窗常驻与高特权操作。本文将从架构层面拆解其三大核心能力:LSPosed / Xposed 模块注入、ADB 高特权通道以及系统级浮窗(对话框 / 浏览器化小窗)。
2. 范围与定位
本章覆盖三类"穿透系统边界"的能力:
| LSPosed / Xposed | 跨应用注入桥,补齐"前台 App 感知"等盲区 | 可选(opt-in) |
| ADB | 无线调试 / 授权 / 调用系统组件的高特权通道 | 按需启用 |
| 系统级浮窗 | 对话框、浏览器以 TYPE_APPLICATION_OVERLAY 常驻屏幕 | 核心能力 |
关键事实:核心能力(无障碍 / Shizuku / 设备管理员 / ROOT / ADB)走 Zorv AI 自有管线;LSPosed 只是"可选增强",用于解决"获取前台 App"等少数盲区,模块启停仍在 LSPosed Manager 完成。
3. 特权获取总览(自有管线 + 可选 LSPosed)
#mermaid-svg-poKZo4siKbiQnzPU{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-poKZo4siKbiQnzPU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-poKZo4siKbiQnzPU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-poKZo4siKbiQnzPU .error-icon{fill:#552222;}#mermaid-svg-poKZo4siKbiQnzPU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-poKZo4siKbiQnzPU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-poKZo4siKbiQnzPU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-poKZo4siKbiQnzPU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-poKZo4siKbiQnzPU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-poKZo4siKbiQnzPU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-poKZo4siKbiQnzPU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-poKZo4siKbiQnzPU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-poKZo4siKbiQnzPU .marker.cross{stroke:#333333;}#mermaid-svg-poKZo4siKbiQnzPU svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-poKZo4siKbiQnzPU p{margin:0;}#mermaid-svg-poKZo4siKbiQnzPU .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-poKZo4siKbiQnzPU .cluster-label text{fill:#333;}#mermaid-svg-poKZo4siKbiQnzPU .cluster-label span{color:#333;}#mermaid-svg-poKZo4siKbiQnzPU .cluster-label span p{background-color:transparent;}#mermaid-svg-poKZo4siKbiQnzPU .label text,#mermaid-svg-poKZo4siKbiQnzPU span{fill:#333;color:#333;}#mermaid-svg-poKZo4siKbiQnzPU .node rect,#mermaid-svg-poKZo4siKbiQnzPU .node circle,#mermaid-svg-poKZo4siKbiQnzPU .node ellipse,#mermaid-svg-poKZo4siKbiQnzPU .node polygon,#mermaid-svg-poKZo4siKbiQnzPU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-poKZo4siKbiQnzPU .rough-node .label text,#mermaid-svg-poKZo4siKbiQnzPU .node .label text,#mermaid-svg-poKZo4siKbiQnzPU .image-shape .label,#mermaid-svg-poKZo4siKbiQnzPU .icon-shape .label{text-anchor:middle;}#mermaid-svg-poKZo4siKbiQnzPU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-poKZo4siKbiQnzPU .rough-node .label,#mermaid-svg-poKZo4siKbiQnzPU .node .label,#mermaid-svg-poKZo4siKbiQnzPU .image-shape .label,#mermaid-svg-poKZo4siKbiQnzPU .icon-shape .label{text-align:center;}#mermaid-svg-poKZo4siKbiQnzPU .node.clickable{cursor:pointer;}#mermaid-svg-poKZo4siKbiQnzPU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-poKZo4siKbiQnzPU .arrowheadPath{fill:#333333;}#mermaid-svg-poKZo4siKbiQnzPU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-poKZo4siKbiQnzPU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-poKZo4siKbiQnzPU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-poKZo4siKbiQnzPU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-poKZo4siKbiQnzPU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-poKZo4siKbiQnzPU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-poKZo4siKbiQnzPU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-poKZo4siKbiQnzPU .cluster text{fill:#333;}#mermaid-svg-poKZo4siKbiQnzPU .cluster span{color:#333;}#mermaid-svg-poKZo4siKbiQnzPU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-poKZo4siKbiQnzPU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-poKZo4siKbiQnzPU rect.text{fill:none;stroke-width:0;}#mermaid-svg-poKZo4siKbiQnzPU .icon-shape,#mermaid-svg-poKZo4siKbiQnzPU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-poKZo4siKbiQnzPU .icon-shape p,#mermaid-svg-poKZo4siKbiQnzPU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-poKZo4siKbiQnzPU .icon-shape .label rect,#mermaid-svg-poKZo4siKbiQnzPU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-poKZo4siKbiQnzPU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-poKZo4siKbiQnzPU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-poKZo4siKbiQnzPU :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
可选增强
Zorv AI 自有特权管线(核心)
无障碍 AccessibilityService
Shizuku
设备管理员 DeviceAdmin
ROOT
ADB 无线调试
LSPosed 模块(QuroXposedModule)
前台 App 感知盲区
QuroLsposeBridgeReceiver补全 get_foreground_app
- 自有管线覆盖绝大多数系统操作(点击、启动 Activity、读设置等)。
- 仅当"需要知道当前前台是哪个 App"这类信息原生不可得时,才由 LSPosed 桥接补全。
4. LSPosed / Xposed 模块架构
4.1 组件与文件
| QuroXposedModule | opt-in Xposed 模块入口(LSPosed 识别) |
| QuroLSPosed | 作用域判定:isAppInScope() 读取标记文件 .lsposed_scope 真实判定作用域 |
| QuroLsposeTool | AI 可调用的 lsposed 工具:支持 status / foreground / enable / disable |
| QuroLsposeBridgeReceiver | 接收 ACTION_APP_OPENED 广播(com.ai.assistance.quro.LSPOSED_APP_OPENED)收集前台 App |
4.2 启用流程(enable)
QuroLsposeBridgeReceiver
外部存储根
QuroLsposeTool
AI 引擎
QuroLsposeBridgeReceiver
外部存储根
QuroLsposeTool
AI 引擎
#mermaid-svg-VLOUQyDc4TVkFBu7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VLOUQyDc4TVkFBu7 .error-icon{fill:#552222;}#mermaid-svg-VLOUQyDc4TVkFBu7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VLOUQyDc4TVkFBu7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VLOUQyDc4TVkFBu7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VLOUQyDc4TVkFBu7 .marker.cross{stroke:#333333;}#mermaid-svg-VLOUQyDc4TVkFBu7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VLOUQyDc4TVkFBu7 p{margin:0;}#mermaid-svg-VLOUQyDc4TVkFBu7 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VLOUQyDc4TVkFBu7 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VLOUQyDc4TVkFBu7 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-VLOUQyDc4TVkFBu7 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-VLOUQyDc4TVkFBu7 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-VLOUQyDc4TVkFBu7 .sequenceNumber{fill:white;}#mermaid-svg-VLOUQyDc4TVkFBu7 #sequencenumber{fill:#333;}#mermaid-svg-VLOUQyDc4TVkFBu7 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-VLOUQyDc4TVkFBu7 .messageText{fill:#333;stroke:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VLOUQyDc4TVkFBu7 .labelText,#mermaid-svg-VLOUQyDc4TVkFBu7 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .loopText,#mermaid-svg-VLOUQyDc4TVkFBu7 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VLOUQyDc4TVkFBu7 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VLOUQyDc4TVkFBu7 .noteText,#mermaid-svg-VLOUQyDc4TVkFBu7 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-VLOUQyDc4TVkFBu7 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VLOUQyDc4TVkFBu7 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VLOUQyDc4TVkFBu7 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VLOUQyDc4TVkFBu7 .actorPopupMenu{position:absolute;}#mermaid-svg-VLOUQyDc4TVkFBu7 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-VLOUQyDc4TVkFBu7 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VLOUQyDc4TVkFBu7 .actor-man circle,#mermaid-svg-VLOUQyDc4TVkFBu7 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-VLOUQyDc4TVkFBu7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
lsposed(action="enable", pkg="…")
写 lsposed_bridge.json\\n(跨应用注入桥 + 可选 system_redirect)
模块读取并注册监听
后续前台 App 变化经广播回传
- enable 写入外部存储根 lsposed_bridge.json:跨应用注入桥 + 可选 system_redirect。
- disable 移除桥配置。
- status 查询当前桥/作用域状态。
- foreground 补 get_foreground_app 盲区(经广播回传当前前台 App)。
模块本身的"启用 / 停用 / 作用域勾选"仍在 LSPosed Manager 内操作;Zorv AI 只负责驱动桥配置与读取状态。
5. ADB 通道
ADB 在 Zorv AI 中作为"高特权系统通道"使用,典型场景:
| 无线调试授权 | 通过 adb tcpip / 配对码获取 shell 级权限 |
| 授予特殊权限 | 给自身或受控端授权(如 WRITE_SECURE_SETTINGS) |
| 调用系统组件 | 启动 Activity / Service / 发送广播 |
| 与浮窗配合 | ADB 取得权限后,浮窗可稳定常驻、免被系统收回 |
ADB 与无障碍 / Shizuku / ROOT 共同构成"自有特权管线",与 LSPosed 互为补充。
6. 对话框「化小窗」架构
用户可把正在进行的 AI 对话收起为屏幕角落的小窗,继续在其它 App 中操作,需要时再点开。
#mermaid-svg-ysI3t4mTkwAfMRgL{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ysI3t4mTkwAfMRgL .error-icon{fill:#552222;}#mermaid-svg-ysI3t4mTkwAfMRgL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ysI3t4mTkwAfMRgL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ysI3t4mTkwAfMRgL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ysI3t4mTkwAfMRgL .marker.cross{stroke:#333333;}#mermaid-svg-ysI3t4mTkwAfMRgL svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ysI3t4mTkwAfMRgL p{margin:0;}#mermaid-svg-ysI3t4mTkwAfMRgL .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL .cluster-label text{fill:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL .cluster-label span{color:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL .cluster-label span p{background-color:transparent;}#mermaid-svg-ysI3t4mTkwAfMRgL .label text,#mermaid-svg-ysI3t4mTkwAfMRgL span{fill:#333;color:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL .node rect,#mermaid-svg-ysI3t4mTkwAfMRgL .node circle,#mermaid-svg-ysI3t4mTkwAfMRgL .node ellipse,#mermaid-svg-ysI3t4mTkwAfMRgL .node polygon,#mermaid-svg-ysI3t4mTkwAfMRgL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ysI3t4mTkwAfMRgL .rough-node .label text,#mermaid-svg-ysI3t4mTkwAfMRgL .node .label text,#mermaid-svg-ysI3t4mTkwAfMRgL .image-shape .label,#mermaid-svg-ysI3t4mTkwAfMRgL .icon-shape .label{text-anchor:middle;}#mermaid-svg-ysI3t4mTkwAfMRgL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ysI3t4mTkwAfMRgL .rough-node .label,#mermaid-svg-ysI3t4mTkwAfMRgL .node .label,#mermaid-svg-ysI3t4mTkwAfMRgL .image-shape .label,#mermaid-svg-ysI3t4mTkwAfMRgL .icon-shape .label{text-align:center;}#mermaid-svg-ysI3t4mTkwAfMRgL .node.clickable{cursor:pointer;}#mermaid-svg-ysI3t4mTkwAfMRgL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ysI3t4mTkwAfMRgL .arrowheadPath{fill:#333333;}#mermaid-svg-ysI3t4mTkwAfMRgL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ysI3t4mTkwAfMRgL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ysI3t4mTkwAfMRgL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ysI3t4mTkwAfMRgL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ysI3t4mTkwAfMRgL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ysI3t4mTkwAfMRgL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ysI3t4mTkwAfMRgL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ysI3t4mTkwAfMRgL .cluster text{fill:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL .cluster span{color:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ysI3t4mTkwAfMRgL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ysI3t4mTkwAfMRgL rect.text{fill:none;stroke-width:0;}#mermaid-svg-ysI3t4mTkwAfMRgL .icon-shape,#mermaid-svg-ysI3t4mTkwAfMRgL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ysI3t4mTkwAfMRgL .icon-shape p,#mermaid-svg-ysI3t4mTkwAfMRgL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ysI3t4mTkwAfMRgL .icon-shape .label rect,#mermaid-svg-ysI3t4mTkwAfMRgL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ysI3t4mTkwAfMRgL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ysI3t4mTkwAfMRgL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ysI3t4mTkwAfMRgL :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
用户点 化小窗
ChatScreen 对话
QuroMiniWindowManager(进程级单例)
QuroMiniWindowServicespecialUse 前台保活
WindowManager.addViewTYPE_APPLICATION_OVERLAY
对话浮窗 View(常驻: show/hide 只 add/remove)
关键点:
- QuroMiniWindowService:以 specialUse 前台服务保活,避免被后台回收。
- QuroMiniWindowManager:进程级单例,统一收纳/恢复浮窗。
- 常驻不重建:显示/隐藏只做 addView / removeView,浮窗 View 全程不销毁、不丢状态。
7. 浏览器「化小窗」架构
内置浏览器同样可化为小窗,且复用全局单 WebView,避免重复加载:
#mermaid-svg-oFzprelmjdr7pqml{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oFzprelmjdr7pqml .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oFzprelmjdr7pqml .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oFzprelmjdr7pqml .error-icon{fill:#552222;}#mermaid-svg-oFzprelmjdr7pqml .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oFzprelmjdr7pqml .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oFzprelmjdr7pqml .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oFzprelmjdr7pqml .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oFzprelmjdr7pqml .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oFzprelmjdr7pqml .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oFzprelmjdr7pqml .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oFzprelmjdr7pqml .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oFzprelmjdr7pqml .marker.cross{stroke:#333333;}#mermaid-svg-oFzprelmjdr7pqml svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oFzprelmjdr7pqml p{margin:0;}#mermaid-svg-oFzprelmjdr7pqml .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-oFzprelmjdr7pqml .cluster-label text{fill:#333;}#mermaid-svg-oFzprelmjdr7pqml .cluster-label span{color:#333;}#mermaid-svg-oFzprelmjdr7pqml .cluster-label span p{background-color:transparent;}#mermaid-svg-oFzprelmjdr7pqml .label text,#mermaid-svg-oFzprelmjdr7pqml span{fill:#333;color:#333;}#mermaid-svg-oFzprelmjdr7pqml .node rect,#mermaid-svg-oFzprelmjdr7pqml .node circle,#mermaid-svg-oFzprelmjdr7pqml .node ellipse,#mermaid-svg-oFzprelmjdr7pqml .node polygon,#mermaid-svg-oFzprelmjdr7pqml .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oFzprelmjdr7pqml .rough-node .label text,#mermaid-svg-oFzprelmjdr7pqml .node .label text,#mermaid-svg-oFzprelmjdr7pqml .image-shape .label,#mermaid-svg-oFzprelmjdr7pqml .icon-shape .label{text-anchor:middle;}#mermaid-svg-oFzprelmjdr7pqml .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oFzprelmjdr7pqml .rough-node .label,#mermaid-svg-oFzprelmjdr7pqml .node .label,#mermaid-svg-oFzprelmjdr7pqml .image-shape .label,#mermaid-svg-oFzprelmjdr7pqml .icon-shape .label{text-align:center;}#mermaid-svg-oFzprelmjdr7pqml .node.clickable{cursor:pointer;}#mermaid-svg-oFzprelmjdr7pqml .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oFzprelmjdr7pqml .arrowheadPath{fill:#333333;}#mermaid-svg-oFzprelmjdr7pqml .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oFzprelmjdr7pqml .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oFzprelmjdr7pqml .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oFzprelmjdr7pqml .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oFzprelmjdr7pqml .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oFzprelmjdr7pqml .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oFzprelmjdr7pqml .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oFzprelmjdr7pqml .cluster text{fill:#333;}#mermaid-svg-oFzprelmjdr7pqml .cluster span{color:#333;}#mermaid-svg-oFzprelmjdr7pqml div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oFzprelmjdr7pqml .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oFzprelmjdr7pqml rect.text{fill:none;stroke-width:0;}#mermaid-svg-oFzprelmjdr7pqml .icon-shape,#mermaid-svg-oFzprelmjdr7pqml .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oFzprelmjdr7pqml .icon-shape p,#mermaid-svg-oFzprelmjdr7pqml .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oFzprelmjdr7pqml .icon-shape .label rect,#mermaid-svg-oFzprelmjdr7pqml .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oFzprelmjdr7pqml .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oFzprelmjdr7pqml .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oFzprelmjdr7pqml :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
browserUrl=nullbrowserFloatUrl=u
重挂不重建/不重载
AI 调用 browser_act(open)
QuroMiniWindowManager
QuroBrowserViewHost(全局单 WebView)
WindowManager.addView
浏览器浮窗
- AI 用 browser_act 的 open 默认化小窗:browserUrl=null; browserFloatUrl=u。
- QuroBrowserViewHost 持有全局唯一 WebView,化小窗时只是"重挂"到浮窗容器,不重建、不重载页面,保住登录态与滚动位置。
8. 浮窗公共机制(WindowManager / flags / 常驻)
两类浮窗共享同一套底层机制:
| 窗口类型 | TYPE_APPLICATION_OVERLAY | 系统级浮层,覆盖其它 App |
| 保活 | QuroMiniWindowService(specialUse 前台) | 不被后台回收 |
| 焦点 flag | FLAG_NOT_FOCUSABLE | 不抢焦点,不影响其它 App 输入 |
| 输入法兼容 | FLAG_ALT_FOCUSABLE_IM | 浮窗内可正常唤起键盘 |
| 触摸穿透 | FLAG_NOT_TOUCH_MODAL | 浮窗外区域仍可操作原 App |
| 全屏布局 | FLAG_LAYOUT_IN_SCREEN | 浮窗可铺满/贴边 |
| 生命周期 | show/hide = addView / removeView | 视图常驻,状态不丢 |
#mermaid-svg-Q1Io5lZyGmURvtGS{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Q1Io5lZyGmURvtGS .error-icon{fill:#552222;}#mermaid-svg-Q1Io5lZyGmURvtGS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Q1Io5lZyGmURvtGS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Q1Io5lZyGmURvtGS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Q1Io5lZyGmURvtGS .marker.cross{stroke:#333333;}#mermaid-svg-Q1Io5lZyGmURvtGS svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Q1Io5lZyGmURvtGS p{margin:0;}#mermaid-svg-Q1Io5lZyGmURvtGS .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS .cluster-label text{fill:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS .cluster-label span{color:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS .cluster-label span p{background-color:transparent;}#mermaid-svg-Q1Io5lZyGmURvtGS .label text,#mermaid-svg-Q1Io5lZyGmURvtGS span{fill:#333;color:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS .node rect,#mermaid-svg-Q1Io5lZyGmURvtGS .node circle,#mermaid-svg-Q1Io5lZyGmURvtGS .node ellipse,#mermaid-svg-Q1Io5lZyGmURvtGS .node polygon,#mermaid-svg-Q1Io5lZyGmURvtGS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Q1Io5lZyGmURvtGS .rough-node .label text,#mermaid-svg-Q1Io5lZyGmURvtGS .node .label text,#mermaid-svg-Q1Io5lZyGmURvtGS .image-shape .label,#mermaid-svg-Q1Io5lZyGmURvtGS .icon-shape .label{text-anchor:middle;}#mermaid-svg-Q1Io5lZyGmURvtGS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Q1Io5lZyGmURvtGS .rough-node .label,#mermaid-svg-Q1Io5lZyGmURvtGS .node .label,#mermaid-svg-Q1Io5lZyGmURvtGS .image-shape .label,#mermaid-svg-Q1Io5lZyGmURvtGS .icon-shape .label{text-align:center;}#mermaid-svg-Q1Io5lZyGmURvtGS .node.clickable{cursor:pointer;}#mermaid-svg-Q1Io5lZyGmURvtGS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Q1Io5lZyGmURvtGS .arrowheadPath{fill:#333333;}#mermaid-svg-Q1Io5lZyGmURvtGS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Q1Io5lZyGmURvtGS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Q1Io5lZyGmURvtGS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q1Io5lZyGmURvtGS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Q1Io5lZyGmURvtGS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q1Io5lZyGmURvtGS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Q1Io5lZyGmURvtGS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Q1Io5lZyGmURvtGS .cluster text{fill:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS .cluster span{color:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Q1Io5lZyGmURvtGS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Q1Io5lZyGmURvtGS rect.text{fill:none;stroke-width:0;}#mermaid-svg-Q1Io5lZyGmURvtGS .icon-shape,#mermaid-svg-Q1Io5lZyGmURvtGS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q1Io5lZyGmURvtGS .icon-shape p,#mermaid-svg-Q1Io5lZyGmURvtGS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Q1Io5lZyGmURvtGS .icon-shape .label rect,#mermaid-svg-Q1Io5lZyGmURvtGS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q1Io5lZyGmURvtGS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Q1Io5lZyGmURvtGS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Q1Io5lZyGmURvtGS :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
FLAG_NOT_FOCUSABLE
不挡其它 App 输入
FLAG_NOT_TOUCH_MODAL
FLAG_ALT_FOCUSABLE_IM
面板内可唤起键盘
FLAG_LAYOUT_IN_SCREEN
可贴边/全屏
9. 能力对照表
| 对话化小窗 | 用户/AI 触发 | QuroMiniWindowService + QuroMiniWindowManager | 核心 |
| 浏览器化小窗 | browser_act(open) 默认 | QuroBrowserViewHost | 核心 |
| LSPosed 桥 | lsposed 工具 | QuroLsposeTool / QuroLSPosed / QuroLsposeBridgeReceiver | 可选 |
| 前台 App 补全 | 广播回填 | QuroLsposeBridgeReceiver | 可选 |
| ADB 高特权 | 无线调试 / 授权 | 自有管线 | 按需 |
10. 总结
Zorv AI 通过自有特权管线 + 可选 LSPosed 增强的组合策略,在 Android 系统边界上实现了优雅的突破:
- 核心能力自研:无障碍、Shizuku、设备管理员、ROOT、ADB 全部走自有管线,不依赖外部框架;
- LSPosed 按需增强:仅在"前台 App 感知"等原生盲区启用,模块启停交给 LSPosed Manager;
- 浮窗常驻不重建:对话框与浏览器化小窗共享 TYPE_APPLICATION_OVERLAY 机制,视图全程不销毁、状态不丢失。
如果你对跨进程能力框架、小程序渲染或 AI 人格孵化机制感兴趣,欢迎 Star 项目持续关注后续架构解析。
开源地址:https://github.com/Quor-a/ZorvAI

