Luwi

agent
Security Audit
Warn
Health Warn
  • License — License: Apache-2.0
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 8 GitHub stars
Code Pass
  • Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

DSH for Android, built on LittleWhale (dsh ported to Android by Miuzarte)

README.md

Luwi

DSH for Android —— 把 deepseek-harness(dsh)装进手机的一个应用

一台安卓设备同时当 dsh 的主机与受控端:界面就是 dsh 自己的 Web GUI(装在 WebView 里),原生那一半把屏幕、输入与系统能力做成 dsh 原生工具交给模型。不需要第二台电脑,也不需要 Termux。

一句话:让 AI 像人一样操作你的手机。

系统要求:Android 13(API 33)及以上。 应用声明 minSdk = 33,Android 12 及以下装不上——安装器会直接判为不兼容;历史版本也一路都是 33,没有更低的旧包可以退。

使用虚拟屏需要 Shizuku 或 root(KernelSU / Magisk)之一,二选一。

声明

项 说明
地基 LittleWhale。把 dsh 移植到安卓的架构、特权通道、自建虚拟屏、原生工具、无障碍读屏与端侧 OCR 都是它的工作;Luwi 是在它之上做的应用发行版
灵感与参考 DSHA(MIT)。部分功能与特点取自它
系统要求 Android 13(API 33)及以上(minSdk = 33);Android 12 及以下装不上
权限 Luwi 可以获取手机几乎所有权限,没有沙盒限制;自带的 Linux 沙盒是能力通道,不是安全边界
不联网 Luwi 自身不收集、不上传任何数据。会联网的只有四处:① dsh 调用你自己配置的模型 API;② 你亲手触发的模型下载(语音识别、唤醒词);③ 你自愿启用的 Edge-TTS / API-TTS;④ 你在「插件 → 浏览插件仓库」里亲手点的「刷新索引」与「装它」(取官方索引 JSON 与你选中的那份插件包,其余时候只读缓存)
安全 安全性由用户自行判断(见文末「开源 / 安全声明」)

[!WARNING]
审批是全部放行的,而且这是有意的决定:模型要动主屏时应用自己在后台,审批框没人点得到,摆在那里只会让每次点击卡到超时。所以模型点屏幕不会问任何人;2026-10-08 起连"真人一碰屏幕就停手"那道软停也删了(见下面「已知问题」),主屏现在只靠提示词层的规矩。

v3.0.0之前都是开发版,请不要将它安装到具有重要数据的手机上。

背景

这几年市面上没有任何一款真正的 AI 手机 —— 即使是目前最新的「AI 手机」,也谈不上「完全 AI」:各家软件厂商都在极力限制 AI 自动化,而个人开发者不可能去开发系统层面的 AI。

所以这个应用只从应用层解决:让 AI 像人一样操作手机,完成手机上的自动化。即使有一天 AI 手机真的来了,这个应用也还有用 —— 起码能让旧手机继续发挥作用,大家不必为了一个功能去换更贵的新手机,可以多一个选择。

功能

1. 唤醒:离线,锁屏也能叫

  • 喊一声唤醒词就能把 dsh 叫起来,默认是「肥鱼肥鱼」。

  • 锁屏时也能唤醒:屏幕不会亮,只把语音输入叫起来对话 —— 亮屏本身是一种打扰,所以故意不亮。

  • 唤醒词支持容错读音:一个词可以配多条拼音,每条一行(注意每段都要分行):

    肥鱼肥鱼=fei2 yu2 fei2 yu2
    肥鱼肥鱼=hui2 yu2 hui2 yu2
    肥鱼肥鱼=fei2 yi2 fei2 yi2
    肥鱼肥鱼=hui2 yi2 hui2 yi2
    

    拼音写音调数字(fei2)或带调号的字母都行;词表按音节逐个核对后才写入,写错会指名到是哪一个音节。

  • 唤醒模型(zipformer KWS,约 5.3 MB)不进安装包,第一次用时才下载,识别全程离线。

  • 设置页有「允许唤醒」与「省电模式 / 省电时段」(例如 23:00-07:00):省电时麦克风整个关掉(喊不醒),host、浮标与通知都还在,点球照样能说一句话。

2. 视频、手机:两个模式,一句话就切

  • 手机模式(默认):能看能动的全能模式,屏幕操作默认在自建虚拟屏上后台完成,不占你手里的屏;手机自己那块屏也归它管(「屏幕上写着什么」「有几条未读」「顺手在这块屏上点一下」都是它的活)。
  • 视频模式:用手机自己的摄像头看镜头前的东西(「这是什么」「前面写着什么」),回复会被念出来;这个模式里识别链常驻,接着说话不用再喊唤醒词。

说一句「打开视频模式」或者让模型调 lw_mode 就换;切换只换人设与对应的开关,不从你的手机下面抽走任何东西。
说「这个」「屏幕上」「照片里」这类话时不用先切什么:浮标与语音那条路上,那句话在送出去之前会自动附一张主屏截图(设置页「截图」段可以关),模型直接就看得到你手指着的东西。原来说惯的「打开识屏模式 / 退出识屏模式」不再是一个模式 —— 前者按普通一句话对待(要的就是看那块屏),后者仍然当收工。

3. 浮标 ball:任何应用前台都能对话

  • 常驻浮标取代原来的顶栏菜单按钮:可拖到应用内任意位置,按住微微放大、松手回弹,空闲 5 秒半隐到屏幕边(只留一半在外面、透明度减半),碰一下恢复。
  • 不影响前台正常操作:半隐之后就是屏幕边上一小块半透明图案。
  • 点一下球就能说话,也可以打字输入;球上写着「正在听 / 正在想 / 正在念」,「正在想」时双击它 = 打断那一轮。
  • 输入框还能浮在别的应用上面:那扇窗里装的是同一个 GUI,所以在任何应用里都能直接跟 dsh 说话。

4. 自带虚拟屏:后台跑任务

  • 想开几块开几块,宽高与 dpi 随便给,建完还能换形状;预览是合成器直接画进原生 SurfaceView 的,零 native、不编码不解码。
  • 屏在后台跑着,你可以一边看它一边用 dsh 界面;虚拟屏小窗整条标题栏就是拖动把手,右端减号把整扇窗收掉。
  • 一任务一屏、先到先用:默认规则是一块虚拟屏只给一个任务用,后来的任务轮询等待;这条规则写在模式人设里,可以用提示词改它。
  • 已知缺陷:虚拟屏在后台运行时可能对前台造成误触,使用前请知悉。

5. 语音输入:一套默认 + 一套可选

都不联网、不要密钥、音频不出设备;模型不在包里,第一次用时才下载:

  • SenseVoice(sherpa-onnx,约 240 MB):快,一句话不到 1 秒 —— 会话输入框那个麦克风、浮标对话、唤醒对话与视频模式都走它,缺省就这一套。
  • GLM-ASR-Nano(智谱 1.5 B,MIT,约 1.6 GB):准,中英与粤语/方言、小音量更好,代价是一句话几秒到几十秒 —— 想要它得点名(lw_speech engine=glm),没有任何地方会替你把它下下来。

6. 说话输出:四档引擎

  • 系统 TTS:用手机自带的语音引擎,不联网不要密钥。
  • 导入音色:自己放进来的 sherpa-onnx 音色(设置页「朗读」);这条引擎有自己的音量:以它本来的电平当 100%,往上到 300% 是加增益。
  • Edge-TTS / API-TTS:想用在线音色或自己的接口时选这两档(这两条是你自愿启用的,会联网)。

7. 一整套手机操作工具

屏幕与输入是一套 dsh 原生工具(lw_*,共 61 个):列屏 / 建屏 / 换尺寸 / 关屏 / 点 / 拖 / 长按 / 按键 / 组合键 / 打字 / 滚动 / 启动应用 / 打开链接 / 截图(可分区、可连拍、可拼网格)/ 读无障碍树 / 端侧 OCR / 列应用 / 通知与震动 / 剪贴板 / 文件 / 媒体与照片 / 图片与相册(lw_image)/ 电池与存储 / 音量与媒体 / 网络 / 传感器与定位 / 系统设置读写 / 多指手势与捏合 / 等一件事发生 / 读日程与写日程(lw_calendar)/ 快捷指令(lw_quick)/ 自动指令(lw_automation)/ 插件(lw_plugin)。

主屏也看得到动得了(displayId 0 就是手机自己那块屏)。破坏性操作(卸载 / 清数据 / 停应用 / 装包 / 停用)调用即执行——应用侧已经不再弹确认框,唯一那道闸是模型被要求动手前先问你一次(2026-10-08 起,见 skills/android-device-control)。

8. 日程与快捷指令

lw_calendar 让模型真的读得到、写得进你的日程:列日历 / 查一段时间 / 读一条 / 建一条 / 改一条 / 查空闲(free 按 09:00–22:00 算空档,可以调)。时区就是设备时区,写入落在第一本可写的日历上,一本可写的都没有时会如实拒绝而不是假装写进去了。这一版没有删除 —— 删日程还是去日历应用里删。

「快捷指令」是"点一下就把一段工作流交给模型":一条 = 一个 md 文件(住在 $DSH_HOME/quick-commands/),设置页有一段列表,点一下就把它投进当前会话(没有会话就新建一场);在会话里说或打「用快捷指令: <名字>」是同一件事。新建不用写表单:说一句"这条要做什么",模型自己起名字、自己把步骤写成文件。随包带两条样例:「制定旅游计划」(天气 → 日程空档 → 搜索当地状况 → 落进日历)与「今天要做什么」。技能库里另带四份技能(网络搜索 / 天气 / 日程 / p 图),首次启动会自动放进 $DSH_HOME/skills/。

9. 自动指令

「自动指令」是"到什么时候做什么":一条规则 = 一个 JSON 文件(住在 $DSH_HOME/automations/),条件有六种 —— 通知(哪个应用、正文或标题里有哪几个字)、前台应用(切到某个应用时)、光感(亮过 / 暗过某个亮度,可要求持续几秒)、时间(每天或某几个星期的几点)、地点(到某个地名几百米以内)、天气(某个地方的气温 / 降水 / 天气代码达到某个数)。命中之后它把一句话开进一场新会话:提醒那一种由模型现写一句短话、发一条通知并念出来;干活那一种会真的去动手机,所以它多一道全局总闸「允许它自己动手」,默认关。防骚扰是一整套:静默时段(默认 23:00–07:00)、每条规则的冷却与每天上限,以及设置页里一份"最近做了什么、为什么没响"的账。规则由模型写(说一句"每天八点提醒我带伞"就行),设置页负责开关、新建、改一改与删掉。

功耗是按"没有启用的规则就一个监测器都不注册"做的:通知与前台应用是事件驱动(前台应用只认无障碍事件,不看使用情况统计),时间只排一个闹钟,轮询只有天气(默认 60 分钟)与地点(只用网络定位,默认 10 分钟 · 500 米);省电模式一生效,轮询那两条整个停下来。

10. p 图:把屏幕上那张图改掉

说一句「帮我把这张图的背景改为海边」,它会截下你正看着的那块屏,交给生图模型(图生图)改完,把成图放进相册的 Pictures/Luwi 并直接打开给你看。主人自己发的那张图、工作区里的文件也能当源图;改完不满意就接着说"再改成…",每一版都留一份。

生图那一半是随包发的第三方插件 @dickpy/dsh-imagegen(Apache-2.0,作者 dickpy),渠道与密钥在「设置 → 生图配置」里自己配(OpenAI 兼容接口,以及 grok-imagine / nano-banana / seedream / qwen-image / glm-image / MiniMax 等预置渠道);它自己还带一整套界面:画廊、无限画布、提示词模板库、电商套图、文生图(不带源图时用「生图」面板或让模型调 generate_image)。改图会走你配的那条 API 并花钱,图也会发给那个服务——模型被要求如实说明这一点。

11. 插件:别人写的包,给这台手机加能力

不重编本应用就能加东西的那一层(协议 lw-plugin/1)。在设置页的「插件」段粘一个 https 链接,
装完就能用
—— 它注册的工具与内置的 lw_* 长得一样,模型下一轮就能调;停用、卸载与"最近调了哪些
能力"的账都在同一页上。

三个域,先挑最省的那一个:art(一包资源,零代码,零第二次安装)/ inline(一份 dex 跑在本应用
的 :plugin 进程里)/ companion(另一个 APK,只在"要主 APK 清单里没有的权限与组件"时才用,而且
不许带启动器图标)
。桌面上那两格(动画 / 图文)由主 APK 自己声明成"宿主槽",插件只往里填内容 ——
所以装一份 .lwp 就完了,桌面上不会多一个应用;同一个槽同一时刻只挂一只插件。

  • 粘一个地址就够:那份 .lwp 里写着它要绑的那个包与那个包的 https 地址,所以装完它会顺手把伴侣
    APK 也下下来装上(有 root / Shizuku 时静默装,没有时把文件交给系统安装器让你点一下),再接着启用。
    它要哪几条能力会在装之前列一次(敏感档默认不勾);一条能力都不要的插件连这一次都没有
  • 包里没带地址的老包:.lwp 只说"绑哪个包、哪个 Service",那个伴侣 APK 要另外装;装完之后在
    那个插件的详情里点一下「启用」。设置页里原来那一行「安装伴侣 APK」已经撤掉(2026-10-11)——
    新包都把地址写在 entry.apk 里、装完顺手就装上,那一行只剩给老包兜底,却把每台机器都顶着一行
  • 装一个插件就是信任它:它拿到的能力就是你勾给它的那些,勾了 privileged.shell 就等于把特权交给它;
    inline 那一档与 Luwi 同一个 uid,所以它只对白名单作者开放(与 Luwi 同签名,或把公钥指纹
    写进 $DSH_HOME/plugins/.inline-allow.json),第三方未经审核的提交不要走这条路
  • 必须签名(ECDSA P-256):发布者指纹显示在插件页上,第一次见到一把新公钥会单独提示一句;改过包的会被拒装。没签名的包只在设置页打开「开发者模式」之后才收,界面上常驻红字
  • 样例与写法:零代码那份 samples/art-whale-widget/(鲸鱼娘 2.0.0)、
    dex 那份 samples/inline-timer/、伴侣那份 samples/companion/;
    签包工具是 tools/lw-plugin-sign.mjs,判据是 tools/check-plugins.mjs
  • 这一版接通的能力(设备读数 / 传感器 / 通知 / 朗读 / 剪贴板 / 读自己的目录 / 往会话投一句话 /
    往宿主槽推桌面内容 / 提供浮标外观 / 读指定前缀的文件 / 访问声明的域名);带参数的那两条边界就是声明里
    那一截(files.read:/sdcard/DSH、net.http:api.example.com,只走 https 且重定向每一跳重查),
    其余能力可以声明,调用时会如实回一句"这一版还没接通",不会假装成功

12. 酒馆:一张最多十个人的桌子

它不是会话,是一层独立的小应用:角色卡 + 故事书 + 存档 + 主题。人物卡可以导入 PNG(chara / ccv3 块)、
JSON(V1 / V2 / V3)或 CHARX,故事书认 SillyTavern World Info 的 JSON;一张桌子最多十个人,一轮可以点几个人
按勾选顺序依次回几条(不勾就照旧一轮一人,@名字 优先、其余加权随机)。每个角色能单独配一对
provider + model,也能单独开「主动说话」—— 检查间隔、安静阈值、触发概率三个旋钮都以"轮"为单位,
只在聊天页开着、一轮结束之后才判定,模型回一句 [SILENT] 就是不想说。六套主题可切(玻璃那一套在没有
backdrop-filter 的 WebView 上退成不透明),背景图压在 30% 主题色底下,主题是全局设置、存档跟着主题
(没有存档也能选),首页 / 聊天页顶栏 / 状态栏图标都跟同一套走。

它不建 dsh 会话、不注册工具、不读写记忆,数据只在 $DSH_HOME/lw/tavern;换工作区就锁上(门闸只看
host 的 cwd)。酒馆要登录与有效服务时长:登录走官网的设备码那条路,签到与购买只在官网 /tavern,
应用里没有任何签到或支付写操作(入口叫「去签到」)。

dsh(模型 / 会话 / 技能)
   │  lw_* 原生工具
   ▼
dsh host —— Node 24 随 APK 发布,前台服务常驻
   │  回环通道(随机端口 + 一次性 token)
   ▼
app 进程 —— Kotlin / Compose
   ├─ WebView:dsh 自己的 Web GUI(会话与设置都在这里)
   ├─ 特权通道:Shizuku / root → 屏幕、输入与系统能力
   ├─ 自建虚拟屏:合成器直画 SurfaceView,零 native
   └─ 离线模型:语音识别 / 唤醒词 / OCR
  • dsh 与它的 Web GUI 一起进 APK:Node 24 随包发,前台服务常驻,关掉界面也活着。
  • 特权通道:模型 → dsh 工具 → Node host → app 的 loopback 桥 → binder → 特权进程(uid 0 / 2000)。Shizuku 免 root,root 那条更直接。
  • 工作区在你自己的存储里:/sdcard/DSH/,文件管理器翻得到;dsh 自己的配置与凭据留在应用沙盒(filesDir/dsh-home),自带的 Linux 沙盒也读不到它(沙盒以 shell uid 跑,凭据那条边界是内核的)。另有一个内置的轻量级 Linux 兼容层(Alpine minirootfs + proot,随包发一份 base,装在 /data/local/tmp/lwlinux):可以 apk add 装 python、编译脚本 —— 它不是虚拟机,也不是安全沙盒,沙盒里只看得到工作区、网络是通的(见 AGENTS.md 的「Linux 沙盒」)。
  • 两个模式的人设与技能随应用发布(手机 / 视频两个模式的提示词,加上技能库),模型按模式的人设作业。
  • 可选局域网访问:打开后别的设备用浏览器就能连;手机一套小字体、PC 一套大字体,各存浏览器本地。

开源 / 安全声明

Luwi 完全开源,允许开发者自由开发。

Luwi 完全暴露在手机环境,没有沙盒限制,安全性由用户自行判断;不建议安装在主力机 / 有重要数据的手机中。

内置的 Linux 沙盒只是"手机里多了一个 Linux 命令行",它换来的是 shell 一档的能力(不是更严的一档);不要把它当安全边界用。

和 LittleWhale 的关系

本项目的全部基础来自 LittleWhale —— 把 dsh 移植到安卓这件事是它做的。Luwi 是在它之上做的应用发行版,目前相对上游多了:

  • 应用名改为 Luwi,图标换成 Luwi 自己的标记:一圈水花里一只鲸尾(桌面、通知栏与浮标都是同一个)
  • 常驻浮标取代原来的顶栏菜单按钮(见功能 3)
  • 虚拟屏小窗 —— 屏在后台跑着,一边看它一边用 dsh 界面
  • dsh 升到 0.2 系列(release/2.0.0 现在跟到 0.2.1-alpha.1),并把在安卓上缺预编译的那个原生件换成 --expose-internals 的回退路径
  • 返回键不退出应用 —— 第一下提示「再按一次退出」,第二下把任务放到后台;host 与虚拟屏继续跑
  • 2.0.0 那一系列:唤醒词、GLM-ASR 与语音输出四档、浮窗面板、虚拟屏保活面
  • 2.5.0 那一系列:两个模式(识屏模式摘掉)、指代不明时自动附一张主屏截图、锁屏唤醒与自动解锁、快捷指令、自动指令、p 图(随包的生图插件 + photo-edit 技能)
  • 2.6.0 那一系列:插件(伴侣 APK 那一层)、「正在想」由一份文件说了算、球上手势的防误触档、输入框幂等、双击回复回到"你发话的那一场"、语音输入缺省统一到 SenseVoice
  • 2.7.0 那一系列(收口时定名 2.7.4):插件第二批 —— 鲸鱼娘桌面小组件(可导入自己的 GIF)、从链接装入一份插件包、设置页新加的「技能」那一段(按这台手机上装了的应用,把对应技能装进 dsh 家);以及全仓图标换成 Luwi 自己的标记(桌面 / 通知栏 / 球上那一圈)
  • 2.7.5 那一系列:插件取景「拍到了却报 0 帧」的根因修正、设置页「技能」那一段接上 app-skills 仓库(多了「刷新技能目录」与删除技能)、说的时候真的把麦克风关掉、「说完切模式就听不了话」与「她自己的回答被录回去」两处自愈、视频模式那块预览窗按显示方向摆
  • 2.7.6 那一系列:插件那一层重建 —— 安装即用(桌面组件改由主 APK 的宿主槽声明,多了零代码的 art 域与白名单开放的 inline 域,伴侣收窄成不进桌面的例外;装一份 .lwp 就完了),顺带把"同一场对话"的窗口从 20 分钟收到 10 分钟、「返回应用」与「双击回复框」两扇门的落点分开、修掉取景网格那批图交不出去(以及 R8 剪掉插件 API 的那条真缺陷)
  • 2.7.7 那一系列:手机与电脑的 dsh 连成一套(luwi-dsh-sync:会话镜像 + 工作区镜面 + 互为远端名片 + 投影会话与归属方那条闸,默认关)、手机里的 Linux 沙盒(Alpine + proot,lw_linux 四个动词)、能力沙盒两条接通(files.read:<前缀> / net.http:<域名>)、插件那一层住进 profile patch(顺带修掉应用里"生图保存"必失败)、视频模式能指定另一个模型、浮标能放人物立绘与球尺寸滑条
  • 2.7.8 那一系列:技能两页管全(检测更新 / 升级 / 搜一条装上 / 删一条,模型自己也能装,本地改过的不覆盖)、桌面对话组件(桌面一格有立绘与气泡,点「说一句」浮出输入窗)、探索按点开始(会演进的任务卡、30 分钟 / 60 步、五节摘要落 Luwi 工作区)、自动指令的「且」与「或」(新鲜窗口 + 解锁 / 动手两个读数源)、预设收敛成 Luwi 与 探索模式、设置页缺省只展开省电与常用、球半隐 / 半藏两个开关、手机版 webui 抬到 3.1.0、dsh 升到 0.2.1-rc.2、记忆插件随包与只注 CSS 的覆盖层、右栏浏览器格放开
  • 2.7.9 那一系列:办公文件右栏直接翻(.docx 走 docx-preview、.pptx 自解 OOXML,都进不带脚本的沙箱框,可双指放大)、设置里一键反馈(正文直投作者,交不出去就复制并开页,不假装成功)、开口之前先垫一句(四段预录填音,几十毫秒出声,且跟着当前音色与语速重合成)、更新自己查(冷启动查一次,一天最多一次)、同步插件 0.3.5(扫码配对与 P2P 直连那套)、手机锁竖屏、无障碍与 OCR 并进特权通道、dsh 升到 0.2.1-rc.3
  • 2.7.10 那一系列(当前版本):酒馆(角色卡 / 故事书 / 存档 / 六套主题 / 最多十人一桌 / 每人的模型与主动说话;不建会话也不碰记忆)、账号与签到(官网设备码登录,服务时长门闸只拦进聊天页,签到只在官网,应用里没有写操作)、开屏(图标 + 转圈 + 加载日志 + powered by deepseek harness,splash.json 可换图标 / 动效 / 配色 / 文案)、老 WebView 兼容层(文档开始垫 polyfill,12 秒画不出界面就弹窗让人去更新,弹窗里是四步更新指引)、切后台回来不重载(renderer 钉住、回前台 host 自愈、「省电」段可一键给后台保活)、浮标一档多支动作(frames 收数组,进状态随机起头、每圈换一支)、立绘按高贴满、半隐改一半透明度、鲸鱼娘外观随包发(首启自动装好并挑上)、API 音色库(设计出来的音色可登记、可单次点名)与设置里那份接口文档;探索不再被省电拦(到点照开,只把省电 / Doze 写进读数)

下载

见 Releases。

所有版本(含历史版本)都要求 Android 13(API 33)及以上。

  • 2.7.10 那一版的 APK —— 当前版本:酒馆、账号与签到、开屏、老 WebView 兼容、浮标一档多支动作、鲸鱼娘外观随包。
  • 历史版本(2.7.9 / 2.7.8 / 2.7.7 / 2.7.4 / 2.6.7 / 2.6.0 / 2.5.0 / 2.0.0 / 1.3.0 / 1.0.3 / 1.0.2)都在 Releases 列表里。
  • 语音识别与唤醒词模型不在 APK 里,第一次使用时由应用自己下载。

APK 自带 host 树(3.58 万个文件 / 约 341 MB,打包成 99 MB 的 zip),装上第一次启动要解压几分钟;那几分钟别让设备息屏。

交流与反馈

  • QQ 群:1130917719(Luwi 交流群)—— 官网宣传页结尾有群二维码,手机扫一下就能进。
  • 作者邮箱:[email protected] —— 问题、建议、合作都可以写。

提问请带上 adb logcat 片段与机型 / Android 版本;触摸与手势这类问题截图看不出来。

构建

需要 JDK 21、Android SDK(compileSdk 37 / build-tools 37.0.0)、NDK 29.0.14206865,以及 Node + pnpm。

git clone --recursive https://github.com/yuloong07-star/Luwi.git
cd Luwi
./gradlew assembleDebug

已克隆但没有拉取子模块:

git submodule update --init --recursive

两样东西不在仓库里,缺了它们打出来的 APK 跑不起来:

缺什么 是什么
app/src/main/jniLibs/arm64-v8a/(17 个 .so,109 MiB) Node 24 / bash 5.3 / ripgrep 15.2 的 Termux bionic 构建
app/src/main/assets/ocr/(5.9 MiB) PP-OCRv6 tiny 的 det 与 rec(ONNX)

所以想直接用就下 Release 里的 APK,不要从源码自己打。

已知问题

  • 这个仓库没有自动化测试 —— 每一批改动都是在模拟器上逐条量出来的(命令与结果写在 docs/ 里的各批记录),真机上是 vivo V2417A / Android 16 / arm64 装过跑过。但触摸与手势这类问题截图看不出来,要人点一下才算;遇到问题请带着 adb logcat 说。
  • 侧载安装的 APK 开无障碍要额外的 app op —— 应用会自己 best effort 处理,但每次重装 APK 都会把无障碍踢掉。设置页「无障碍」段显示它现在到底怎么样(在不在设备列表里 / 服务绑没绑 / 能不能写设置);写不动的机器上要电脑跑 tools/lw-install.ps1,它会带 -i 装完立刻把条目写回去并读回校验,没过就非零退出。装完别再用 am start -S 强停 —— 它会把系统那个绑定实例摘掉而把条目留着,现象是「设置里写着开着、服务却没绑上」。
  • root 那条第一次要你手动授权 —— 应用侧查不出来有没有 root(没在名单上的 app 连 su 都看不见),只能试;而且试也不会弹框。
  • 主屏没有任何应用层刹车了 —— 2026-10-08 起触摸软停整个删掉(连同读数),模型在你用手机时照样能操作主屏;虚拟屏那两道闸(暂停接受控制 / 虚拟屏触摸控制)还在。
  • 熄屏是静默失败 —— screencap 交的还是最后一帧,注入的触摸也唤不醒屏,两个都不报错(现在有 lw_power 能点亮它)。
  • 录屏不在这一版 —— 模型读不了视频(读图工具只认 PNG / JPEG / WebP / GIF),要看「一段过程」用连拍加网格。
  • 第一次启动要等几分钟 —— host 树是 3.26 万个文件 / 约 322 MB,首启解压,而且别让设备息屏(应用一进后台就被冻住,解压跟着停在原地)。
  • 读剪贴板要应用在前台 —— Android 10 起只有获得焦点的应用能读,后台读回来是空的(写不受限)。
  • 清单里的权限很多 —— 把能声明的都声明了。其中通讯录 / 短信 / 通话记录这一批应用自己不去读,是留给手机端自己利用与开发的;装的时候授不授权都行。日历不一样:lw_calendar 真的用它(设置页「权限」段里单独一条),不给就只能读到"缺权限"这句回执。
  • 语音转写还没在真机上验过 —— 模拟器是 x86_64 靠 ARM 翻译跑 arm64,而 sherpa 那个原生库在翻译下会段错误,所以这一条只能真机说了算。
  • 语音模型要自己下一次 —— 缺省那套 SenseVoice 约 240 MB,从 hf-mirror 拉(手机上 huggingface.co 连不上)并逐个文件校验 sha256;也可以 adb push 放进应用沙盒的 speech-models/ 对应子目录。GLM-ASR-Nano(约 1.6 GB)只有点名要它时才需要,会话输入框那个麦克风不再等它。「按录音按钮 → 自动下载 → 出字」这条整链还差一次真机实测。
  • p 图要先配渠道 —— 生图那一半走你在「设置 → 生图配置」里配的 API(OpenAI 兼容接口,或 grok-imagine / nano-banana / seedream / qwen-image / glm-image / MiniMax 等预置渠道);没配时它会如实说 image-api-not-configured,不会假装改过。这一版在模拟器上验到的是「截图 → 桥 → 相册 → 打开」那几段;有 key 的整链(真的调一次上游生图)还没跑过。
  • 插件是别人写的代码 —— 能力授权、签名、审计三道都在(见上面「插件」那一节),但它跑起来之后能做的事就是你勾给它的那些;卸载不会回收它自己应用里已有的权限(那要去系统设置里删它的 APK)。
  • 设置页的入口是右上角那颗「菜单」按钮(不是 overlay 那颗球)—— 点它,菜单里那一行「设置」就是设置页;球自己的菜单(长按)只有「Back to the app / Close the ball」两行,设置页不在里面。2026-10-08 那批插件第一次没找到入口,回执里记成了"浮标点不到、进不去";按对的入口一次就进得去,三张截图在 D:\apk\shots\(前缀 2026-10-08-emulator-5554-批次9-)。
  • 插件详情对话框的正文自己带滚动上限 —— 声明的能力多起来(最多 22 条)它会长过一屏,而 Miuix 的 OverlayDialog 自己不滚、也没有 maxHeight 那个口子(参数只有 maxWidth):不封顶时超出一屏的那一截会被窗裁掉,「卸载(删数据 / 留数据)」两个按钮就点不到了。SettingsScreen.PluginDialog 里给它封了屏高六成并挂上 verticalScroll,改这一处别再把它拆掉。
  • 酒馆只看最近 50 条 —— 酒馆(P1)聊天页不分页,摘要每 12 轮写一次;勾两位以上时一轮会真调多次模型,这一条目前只在本地假模型与路由单测上验过,真模型双回还没跑。
  • 浮窗有三条限制 —— 窗可获焦,所以落在窗外的触摸不再穿透;后台起步时 microphone 那半个前台服务类型可能被 ROM 拒(拒了退 specialUse);锁屏之上不碰。
  • shell 那把工具没有开 —— lw_shell 刻意不做:通道的 token 在手就等于 shell 身份,这道墙是留着的。

Credits

License

Apache-2.0,与上游 LittleWhale 相同。

Reviews (0)

No results found