AriesAI架构解密:从前台 Compose 极限压榨到后台“虚拟屏”无感自动化!

0 阅读1分钟

大家好,我是 Aries AI 的开发者。

几个月前,我们发布了第一代端侧智能助手,凭借“AutoGLM 云端大脑 + 老手机本地运行”的演示,在开源社区很受欢迎。只需一句话:“帮我买张去北京的高铁票”,老旧的 Android 机就能像有了自主意识一样自动完成操作。

但是,随着我们对接的 AI 模型越来越强,传统的 Android 前端架构和自动化注入方式,已经探测到了天花板:

  1. 比如 DeepSeek 等大模型带有长达数千字的思考过程,如果前台 UI 频繁拼接刷新,极易引发重组风暴导致 UI 线程卡死。
  2. 以往依赖无障碍服务(AccessibilityService)的“明屏自动化”,只要 AI 一干活,手机屏幕就被各种模拟点击“霸占”,用户直接丧失控制权。

为了解决这两个端侧 AI Agent 的致命痛点,我们在 Aries AI v1.5.0 中进行了一场史无前例的底层重构。今天,我将结合真实的源码片段,毫无保留地公开我们的三大架构级设计!

前台重构一:拒绝正则!手搓字符级状态机

目前市面上大部分接入大模型流式接口的 App,处理思路都很粗暴:把网络流拼成一条长字符串,然后不停地用正则表达式去替换标签,最后全量扔给 UI。这就是导致手机发烫的最魁祸首。

在 Aries AI 中,我们彻底抛弃了正则方案,针对流处理链路自研了一个基于有限状态机(FSM)的解析器。

代码巧思解密:

我们设计了四级核心枚举来精确捕获网络增量(Delta):

// 核心状态
enum class ParseState {
    IDLE,                // 初始状态
    IN_THINKING,         // 思考中(如标签内部)
    IN_THINKING_ANGLE,   // 兼容异形标记
    IN_ANSWER            // 进入正式回答正文
}

当大模型的数据流到达 processContentDelta(delta) 时,解析器会按字符位扫描。一旦判断当前处于特定阶段,解析器就直接将这部分切片打包;一旦拦截到代表结束的标签,就丝滑切换到正文状态。

带来的体验飞跃: 由于状态在数据层就被严格剥离,当我们更新 UI 时,正文视图在思考期间绝对不会被迫刷新。这让画面上的“思考框”不仅伸展自如,还彻底告别了过早折叠乱码的解析 Bug​。​

前台重构二:极限压榨渲染生命线

解决了解析问题流,下一个拦路虎就是前端框架的性能诅咒。为了让聊天气泡和后台操作悬浮窗即使在古董机上也能跑满 60fps,我们成了死磕对象。

代码巧思解密:

为了防止“重组风暴”,我们自研了性能监控探针:

// 我们的性能抓手
@Composable
fun DebugRecomposeLogger(scope: String, logEvery: Int = 25) {
    if (!BuildConfig.DEBUG) return        
    val counter = remember(scope) { RecomposeCounter() }
    SideEffect {
        // 利用 SideEffect 严格捕捉界面成功重组后的回调
        counter.count += 1
        if (counter.count == 1 || counter.count % logEvery == 0) {
            Log.d("ComposePerf", "$scope recomposed ${counter.count} times")
        }
    }
}

有了这个探针进行排查,我们配合编译器指标进行了一次性能大扫除:我们将核心的数据体全部强制打上不可变标签,阻断了一切跨协程域的状态穿透。最终,AI 在高负荷推理对话时,长列表的单次视图刷新被死死地压制在 16ms 线以下!

绝对核心:提权打造后台“虚拟屏”无感自动化

(这是本版本最疯狂、最硬核的系统级 Hacks,也是真正迈向人机协同的一大步!)

只要你还在用传统的无障碍方案做外挂,手机干活时人就只能干看着。如果未来 AI Agent 是我们的助理,那必须是我聊我的微信,它在后台偷偷干它的活。

因此,我们在内部架构了虚拟显示调度中心。依托于跨进程提权技术,我们在 Java 层面强行反射了系统隐藏服务

代码巧思解密:

下面这段代码是真正实现自动化降维打击的核心机密:

fun getDisplayManager(): Any {
    val binder = getService("display")
    // 利用提权代理,拿到隐藏的系统级显示接口
    val stub = Class.forName("android.hardware.display.IDisplayManager\$Stub")
    val asInterface = stub.getMethod("asInterface", IBinder::class.java)
    return asInterface.invoke(null, binder)
}
// 同样的手法代理获取输入管理器(负责跨层注入事件)和任务管理器!

这意味着什么? 通过拿到这些超高权限的底层管理器,我们欺骗了手机系统,在后台虚空挂载了一块虚拟逻辑屏幕。接着,大模型的画面节点感知、坐标计算、以及注入点击和滑动事件——全部都在这块“虚拟屏幕”上自我派发执行。在你的物理主屏幕上,任何打扰都不会发生!它是真正意义上的双进程平行世界机制,完成了零焦点抢占的无感交互!

交互颠覆:全系机型“灵动岛”状态透出

如果是在后台运行,你怎么知道 AI 进行到哪一步了?传统的硕大悬浮球极其破坏原生界面的美学一致性。基于前后台任务的生命周期,我们定向攻克并适配了大量机型,独家引入了“灵动岛 / 胶囊”机制

当接收指令开始“虚拟屏自动化”干活时:哪怕你切去了桌面,操作卡片也会犹如水滴一般,丝滑收缩进手机顶部的刘海/挖孔区域。它不会遮挡任何文字与操作视线,仅保留呼吸灯态。当你想确认进度时,轻轻点击一下顶部的岛,就会优雅展开实时的状态胶囊(如:“商品比价中...”或“检索时刻表完成”)。

​​

结语:加入开源,进一步提升Aries AI的上限

为了更好地克服不同设备碎片化噩梦,我们在设置页里引进了用户体验改进计划,利用脱敏探针协助我们在云端收集框架崩溃点,持续捍卫代码稳定性。

从最开始验证端侧可行性的小工具,到现在拥有跨进程虚拟隔离栈 + 顶排微秒级前端优化 + 系统级胶囊反馈的现代化工程项目。让 AI 学会思考很容易,但在极度严苛的移动端操作系统环境内,让它兼顾速度、隐藏自己并具备原生般的美感,是一场工程魔法的结晶。

目前开源仓库代码正在全速迭代,如果你也对系统改造、前端极限优化或大模型落地有浓厚兴趣:

🚀 GitHub 开源地址: ZG0704666/Aries-AI: 安卓端强大的AI Agent,仅需简单配置API即可以体验AI自动化操控手机完成跨APP的复杂任务交互。实测部分场景速度较豆包手机提升35%以上https://github.com/ZG0704666/Aries-AI

非常期待各位极客开发者点击链接给我们点一个 Star ⭐️ 支持!有新的点子或遇到问题,我们在 Issue 和社区见!!