Luwi

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

Bu listing icin henuz AI raporu yok.

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 相同。

Yorumlar (0)

Sonuc bulunamadi