docs: 全量文档同步到 M2.83 (agent-213) — README 能力全景/框架文档消息号+M3M5落地标注/SDK listview+长按+§10.5已实现标注/APPS version_code+媒体键路由/DEVELOPMENT_PLAN 主线进度; devdocs(WORK_STATE/RECOVERY_PROMPT/DEV_NOTES)本地同步

This commit is contained in:
MeowOS committed 2026-08-31 12:30:34 +08:00
1 parent 3e414176c3
commit b81e7438e4
5 files changed
+75 -38

No files matched your search

+5 -2
View File
@@ -59,6 +59,7 @@
"exec": "/usr/data/mnt/sd_0/MeowAPPs/os.meow.hello/hello",
"package": "os.meow.hello",
"version": "0.1",
"version_code": 1,
"author": "whoever"
}
```
@@ -68,7 +69,9 @@
| `name` | ✓ | 列表显示名。**v2 仅支持 ASCII**(UTF-8 中文留待 v3,需完整 UTF-8→UTF-16 转换) |
| `exec` | ✓ | 应用可执行文件绝对路径(必须是**静态** MIPS32r2 ELF,soft/hard-float 均可) |
| `package` | — | 反域名权威标识(如 `os.meow.hello`),launcher 取之为 app_id;**目录名=package**。缺省回退目录名 `de->d_name`;两者存在且不同 → WARN |
| `version` / `author` | — | 保留字段,v2 不解析 |
| `version_code` | — | **纯数字,安装/升级比较的唯一依据**(`nyai`/launcher 全走它;缺 code 拒装、新版<已装拒装),见 §3.8 |
| `version` | — | 显示字符串(versionName 角色,`1.2.3-beta` 等任意形态,**不参与比较**),见 §3.8 |
| `author` | — | 保留字段 |
| `fullscreen` | — | app 级全屏:`1`=进入全屏(状态栏**收合至提示线** + **保留左缘返回/顶部提示线/下滑通知中心**,见 MEOWOS_SPEC_REF §5.1);activity 级用它 `route.<id>.fullscreen`。**app.json `fullscreen` 字段此前未解析/已定未做 → 本次实现**(launcher 启动/切 activity 据声明预设 SDK 全屏,env `MEOW_FULLSCREEN`)[源:用户 2026-08-30] |
| `fonts` | — | 字库档位声明:`"full"` / `"gbk"` / `"common"`(app 需大字库时可声明 `"full"`,默认小字库 `common`≈4k;launcher 据此为该 app 加载大字库 `gbk`≈20k,从已扫描的 `MeowOS/fonts/<family>/<weight>/` 里按同 family(其次同 weight)选大字库,M2.6)。**注意**:与 `"fonts":["<handle>"]`(应用自带字库句柄数组)**同名二义**,见 MEOWOS_SPEC_REF §7 A-14 [源:用户 2026-08-30] |
@@ -456,7 +459,7 @@ Description: A simulated app
### 3.7 音频通路与媒体键(2026-08-31 实测定案,覆盖 §5 旧推论)
- **MeowOS 常驻模式(boot 直进,hiby_player 未运行)声卡空闲**:真机实测 `fuser /dev/snd/pcmC0D0p /dev/snd/controlC0` 无任何占用、`pidof hiby_player` 不存在——**MeowAPP 可直接 open `hw:0,0` 出声**(audio.output 设置键即此);无混音,后开者失败,音频焦点=先占先得(媒体会话/MPRIS 落地后再规范抢占语义)。
- **会话覆盖模式(HibyOS 运行中热键唤起)**:SIGSTOP 冻结播放器,声卡仍被其持有,App 无声(§5 旧结论,仅适用该模式)。
- **物理媒体键路由**:MeowOS 与 HibyOS 不同时运行,不存在「转发给 hiby」问题;MeowOS 界面下播放/上下曲 = 全局媒体控制,路由给**最近活跃媒体会话**(媒体会话/MPRIS 落地后接线),无会话时「抓住」不动作。
- **物理媒体键路由**:MeowOS 与 HibyOS 不同时运行,不存在「转发给 hiby」问题;MeowOS 界面下播放/上下曲 = 全局媒体控制,路由给**最近活跃媒体会话**(**媒体会话已落地** M2.81:`MSG_META`(0x72)/`MSG_PLAYCTL`(0x73) + meow_media 最近活跃源(active_seq,30s 超时回收)+ 通知中心媒体卡片 + Now Playing 大页;OS.meow.ncm 是首真实媒体源),无会话时「抓住」不动作。
### 3.8 版本号规则(2026-08-31 定案,对齐 Android)
- `app.json` 增加 **`version_code`**(纯数字,单调递增,**安装/升级比较的唯一依据**);`version` 仅作显示字符串(versionName 角色,可为 `1.2.3-beta` 等任意形态)。
+2 -1
View File
@@ -2,13 +2,14 @@
> 目标:把 R3 Pro II 打造成可扩展的"第二系统"。**MeowOS 作为主控层优先启动、拥有屏幕与输入;HibyOS 播放器降级为 MeowOS 启动的一个内置系统应用**(Android home/launcher 模型)。MeowLauncher(即 MeowOS 核心)、MeowAPPs、MeowPanel 均为其组成部分。
> 本文档是路线图与分阶段计划。当前技术档案见 `ANALYSIS.md`,应用规范见 `APPS.md`,框架协议见 `FRAMEWORK_DESIGN.md`。
> **⚠️ 本文档为公开路线图,自身已过时**:里程碑/阶段划分以**实际进度为准**(权威现状见 `devdocs/WORK_STATE.md`,本仓库 gitignore 不入库)。截至 **M2.61(0.7.56)** 已达成;下方「当前主线」为实际推进序列,**按依赖因果排列,非平行**;旧「阶段拓扑序」仅作背景参考,勿按它安排开发。
> **⚠️ 本文档为公开路线图,自身已过时**:里程碑/阶段划分以**实际进度为准**(权威现状见 `devdocs/WORK_STATE.md`,本仓库 gitignore 不入库)。截至 **M2.83(0.7.78)** 已达成(M2.69→M2.83 全链路:launcher 拆分/控件库/系统框架专项服务/主界面 MD3 双布局/M3 导航栈+M5 通知跳转/媒体会话+Now Playing/SDK nav+media 封装/字库启动竞态修复);下方「当前主线」为实际推进序列,**按依赖因果排列,非平行**;旧「阶段拓扑序」仅作背景参考,勿按它安排开发。
---
## 当前主线(按依赖因果 [源:2026-08-30])
> 每项必须在其依赖落地后才推进(不在依赖未满足时抢先实现上层)。✅=已达成。
> **进度注(2026-08-31)**:主线 1-7 已基本达成——阶段 B 通知中心 UI(M2.65+39)、启动器 SDK 改造(M2.69 拆分 + M2.79 主界面 MD3 双布局 + 视图框架)、系统基建线(M2.67+ svcd 子进程化 + sysui 总监 + 专项服务)、M3 导航栈+M5 通知整合+媒体会话(M2.80/M2.81)、SDK 缺失件(meow_ui_nav/media/config)、蓝牙/WiFi 子页(M2.76)、MeowPanel(M2.72+)。当前新主线见 `devdocs/WORK_STATE.md`(**在跑 agent-212 amsd 一期**)。
1. **阶段 B 通知中心 UI(进行中)** —— 依赖 M2 通知存储 + SDK 控件基座 + B2a 后端。顶部快捷按钮/亮度滑条走 `meow_settings_*` 零旁路;通知列表读 launcher `meow_notif`;手势(状态栏下拉开、上滑/点外关、左缘返回关)。
2. **启动器 SDK 改造** —— 依赖上游 SDK 控件基座(阶段 B 沉淀的 MD3 基座)。状态栏收敛单一 SDK 全局(launcher 退役 `draw_statusbar`);主界面/设置页/电源菜单迁到 SDK 控件;MD3 化、日/夜主题、全局 UI 统一。(见 FRAMEWORK_DESIGN §10.4)
+18 -7
View File
@@ -47,16 +47,24 @@ struct ipc_hdr { /* LE */
| 0x0021 | MSG_NOTIFY_ACK | ↓ | 落库结果 |
| 0x0022 | MSG_NOTIFY_DISMISS | ↑ | 撤下通知 |
| 0x0023 | MSG_NOTIFY_LIST | ↓ | 下发通知清单(重同步) |
| 0x0025 | MSG_NOTIF_OPEN | ↑ | **(拟,号待 `meow_ipc.h` 回填)** App 检测到顶部下滑→请求 launcher 展开通知中心叠加会话(App 前台,见 §10.5) |
| 0x0026 | MSG_NOTIF_CLOSE | ↑ | **(拟,号待 `meow_ipc.h` 回填,可选用途)** App 告知结束/退出→launcher 收尾兜底(见 §10.5) |
| 0x0024 | MSG_NOTIFY_PROGRESS | ↑ | 实时更新通知进度(仅改内存活跃槽,不落盘) |
| 0x0025 | MSG_NOTIFY_QUERY | ↑ | 查询内存活跃通知集(MeowPanel 实时化前置) |
| 0x0026 | MSG_NOTIFY_DISMISS_ALL | ↑ | 一键清除(保留 ongoing/media/progress 进行中,同通知中心 UI) |
| 0x0027 | MSG_NOTIFY_QUERY_RESULT | ↓ | 活跃通知集序列化文本(JSON,字段同 TF 归档) |
| 0x0028 | MSG_NOTIF_OPEN | ↑ | **(已实现,号以 `meow_ipc.h` 为准)** App 检测到顶部下滑→请求 launcher 展开通知中心叠加会话(App 前台,见 §10.5) |
| 0x0029 | MSG_NOTIF_CLOSE | ↑ | **(已实现,可选用途)** App 告知结束/退出→launcher 收尾兜底(见 §10.5) |
| 0x0030 | MSG_ACT_DECLARE | ↑ | (重)声明路由表 |
| 0x0031 | MSG_ACT_QUERY | ↑ | 解析 activity 链路 |
| 0x0032 | MSG_ACT_RESULT | ↓ | 返回链路 |
| 0x0040 | MSG_NAV | ↑ | 上报导航/请求退出 |
| 0x0040 | MSG_NAV | ↑ | 上报导航/请求退出(**M3 导航栈已落地**) |
| 0x0041 | MSG_SHOW_ACTIVITY | ↓ | 令前端应用显示某屏 |
| 0x0070 | MSG_PICKER_CALL | ↑ | 请求跨 App picker 调用(发起方 A → 持有方 B;**仅预留协议位**,本期不实现) |
| 0x0071 | MSG_PICKER_RESULT | ↓ | picker 返回值(候选结果回 A;仅预留协议位) |
| 0x0072 | MSG_META | ↑ | 媒体会话上报元数据/进度/状态(**附录 B 已落地**,最近活跃源回收) |
| 0x0073 | MSG_PLAYCTL | ↓ | 播放控制下发 / ↑ 控制器转发到最近活跃媒体会话(**已落地**) |
| 0x00F0 | MSG_SYS | ↓ | 系统事件(守护关闭/服务死亡/播放器状态) |
负载结构体见设计稿正文(m_hello/m_notify/m_register/m_act_* 等,定长多字节 LE)。
负载结构体见设计稿正文(m_hello/m_notify/m_register/m_act_* 等,定长多字节 LE)。消息号**一律以 `patch_v2/meow_launcherd/meow_ipc.h` 为准**,本节为引用性摘要。
## 2. Activity 路由表
@@ -70,7 +78,7 @@ struct ipc_hdr { /* LE */
## 3. 导航栈
- `struct nav_stack`(每应用一个,≤16 深度),`active` 前台标记。v1 同一时刻单前台应用。
- `struct nav_stack`(每应用一个,≤16 深度),`active` 前台标记。v1 同一时刻单前台应用。**(M3 已落地,M2.80:`nav_stack` + `MSG_NAV` report/exit + `launch_activity` 链路注入 env `MEOW_ACTIVITY`/`MEOW_CHAIN`,栈根退出回主屏;通知点击按 `route_status`:0 拉起 / 1 NO ROUTE / 2 SOURCE NOT FOUND / -1 NONE 关面板不动作;裸 App 兼容。)**
- push/pop;**回退**:应用弹自己的屏并上报 `MSG_NAV{REPORT,depth,current}`;应用在根屏再按返回→`MSG_NAV{EXIT}`→启动器终止应用、恢复播放器、回列表。
- **冷启动通知跳转**:`resolve_chain` → 设栈深 → `launch_activity(app, chain)`,环境 `MEOW_ACTIVITY=<target>` + `MEOW_CHAIN=<id0>;<id1>;...;<top>`。
- 向下兼容:应用若不发 MSG_NAV,启动器保持初始深度;应用在根屏 `exit(0)` 即退出到列表(旧版行为)。
@@ -107,7 +115,10 @@ M0 IPC 骨架(含 meow_ipc 测试钩子)→ M1 路由表+解析 → M2 通
### 进度(阶段 D)
- ✅ **M0 IPC 骨架**(0.7.10,M2.15):`meow_launcherd` 加 IPC 线程 + AF_UNIX `/usr/data/meow_ipc.sock`(unlink+bind+chmod0666+listen4)+ 帧解析(16B 头 magic=0x4D4F5701/version=1/type/req_id/len,LE)+ `MSG_HELLO/ACK/ERR` + eventfd 唤醒主循环 + 无锁 SPSC 内存环(`__sync`)+ 日志埋点。遵守 §1/§6.2:IPC 线程只读帧+解析+入队,主循环 `meow_ipc_process()` 单写者改状态,跨线程 eventfd,主循环 10ms 热键轮询每圈非阻塞排空(eventfd 失败时 10ms 轮询兜底)。测试钩子:`meow_ipc`(`patch_v2/meow_launcherd/meow_ipc.c`,静态 MIPS,与 evtool 同定位)+ launcher `--ipc-only N [--ipc-sock <path>]`。验证:`meow_ipc hello`→ACK、播放器不动(MeowOS 模式下无播放器即满足)。
- ✅ **M1 路由表 + 解析**(0.7.10,M2.15):`app.json` 扁平行 `route.<id>=path` / `framework=true` / `service.<svc>=mode:restart:max:window_ms` / `icon` 解析入 `g_accts` 注册表(主循环单写者);`MSG_ACT_DECLARE`(运行时并集覆盖静态)/`MSG_ACT_QUERY`/`MSG_ACT_RESULT`(深度+链路);`resolve_chain(app,activity)` 返回 `[root..target]` 链路与深度——`route` 缺失(app 未声明路由)→ 深度 1 兜底 `chain=activity`;声明了路由但 activity 非 route 键 → `MEOW_ERR_NOENT`(activity 未注册)。验证:`meow_ipc query <app> <activity>` 返回链路(qemu + 真机 MeowOS 模式均通)。
- ⬜ **M2 通知存储+分发**、**M3 导航+前台会话改造**、**M4 后台服务保活**、**M5 通知中心 UI**、**M6 加固**:后续里程碑,本轮未做。
- ✅ **M2 通知存储+分发**、**M3 导航+前台会话改造+看门狗返回**、**M5 通知中心 UI 整合**(详见下,M2.65-M2.82 已落地);⬜ **M4 后台服务保活**(`MSG_REGISTER` 后台服务登记)、**M6 加固**:待排期。
- **M3 已落地(M2.80,agent-202 · 85b4aea)**:`nav_stack`(≤16 深)+ `MSG_NAV` REPORT/EXIT + `launch_activity` 链路注入(env `MEOW_ACTIVITY`/`MEOW_CHAIN`)+ 栈根退出回主屏;通知点击按 `route_status`(0 拉起/1 NO ROUTE/2 SOURCE NOT FOUND/-1 NONE 关面板不动作);picker 协议位预留(0x0070/0x0071);裸 App 兼容。
- **M5 通知中心 UI 整合已落地(M2.65-M2.81)**:通知中心 + 媒体卡片 + Now Playing(媒体会话见附录 B,已落地:`meow_media.c` 最近活跃源、30s 超时回收、`MSG_META`/`MSG_PLAYCTL`)。
- **§10.5 App 前台唤起通知中心已落地(M2.82,agent-206 · 9b41957)**:`MSG_NOTIF_OPEN=0x28`/`CLOSE=0x29` + SDK `meow_ui_nav`/`meow_ui_media` 封装。
- ✅ **渲染地基(0.7.11,M2.16,前置基座)**:所有 UI 统一走 **RAM 离屏后备缓冲 `back_buf`(480×720×2=691,200B) + `meow_present`(dirty)** = `FBIO_WAITFORVSYNC` 等垂直同步 + 单次原子 memcpy(脏区或全帧)到 fb0(buffer0,yoffset=0)——无渐进/无中间态/无撕裂。脏区 `meow_dirty_add`(矩形合并集、相交吸 bbox、>12 转全屏、裁可视区);状态栏时钟/右侧格按需局部标脏。整合铺垫:框架后续 LAUNCH/NOTIFY/前台会话的绘制复用该机制(而非旧「全屏 clear→重绘到 buffer0」路径)。详情见 ANALYSIS.md §18.43。刷新率调度(display.refresh_rate 60/30/15 + refresh_always_max + 自适应降档 governor)归口 PERF_SCHEDULER.md。
- 测试钩子说明:`meow_launcherd --appinfo <app.json>`(打印单个 app.json 解析结果)、`--ipc-only N`(免 fb/输入跑 IPC)、`--ipc-sock <path>`(覆盖 socket 路径供 qemu sim);`meow_ipc hello|ping|query|declare`(客户端)。
@@ -202,7 +213,7 @@ meow_sysui(系统进程总监,meow_svcd 托管;最小依赖/不渲染/最
- `MSG_NOTIF_OPEN`(App→launcher):App 检测到顶部下滑→请求展开通知中心叠加会话;负载 `m_notif_open_t`
(app_id/event_seq/origin_x/origin_y/hotzone/flags)。launcher 回 `MSG_ACK` 受理(best-effort,App 不强依赖)。
- `MSG_NOTIF_CLOSE`(App→launcher,可选用途):App 告知结束/退出→launcher 收尾(清 active/SIGCONT 兜底)。
- 号段/结构以 `meow_ipc.h` 回填为准(拟 `0x0025/0x0026`,见 §13 决策点)。
- 号段/结构以 `meow_ipc.h` 回填为准。**已实现(M2.82,agent-206 · 9b41957)**:`MSG_NOTIF_OPEN=0x0028` / `MSG_NOTIF_CLOSE=0x0029`(`0x0025/0x0026` 已被通知查询/清除 IPC 占用);SDK 侧 `meow_ui_nav`/`meow_ui_media` 封装同步落地,顶部下滑手势→IPC、launcher SIGSTOP→读帧→叠加→接管输入→SIGCONT(面板内 App 崩溃即关)。
- **launcher 叠加会话(复用电源菜单对 App 的冻结模板)**:收到 `MSG_NOTIF_OPEN`(且当前在 App 前台会话,
`launch_app` waitpid 循环内)→ **SIGSTOP App** → 读回 App 帧(`memcpy` fb0 buffer0 → back_buf,App 帧恒
buffer0 不走 `fb_backup_player`;同 `pm_capture_app_frame`)→ 写 `/tmp/meow_notif_active`(同
+5 -4
View File
@@ -342,7 +342,7 @@ int meow_ui_setform_hit_row(meow_widget *f, int x, int y);/* 命中行号(-1=
### 5.5 设计模板 A② 列表+选择 [源:2026-08-30]
> **性质**:SDK 设计模板,供 App 主页/子页按需选用;对既有 `meow_list_create`(B1 最小集,§5,仅 label 文本)做**结构化扩展**(行=图标+标题+副标题+右侧操作 + 选中态)。API「草案/待定案」,不实现。
> **性质**:SDK 设计模板,供 App 主页/子页按需选用;对既有 `meow_list_create`(B1 最小集,§5,仅 label 文本)做**结构化扩展**(行=图标+标题+副标题+右侧操作 + 选中态)。API「草案/待定案」,不实现。**(✅ 已实现:结构化列表控件 `W_LISTVIEW`,M2.76 · agent-186 · 243148e,见 §5.8.8 分批;长按事件 `MEOW_EV_LONG_PRESS` + `meow_ui_set_long_press_cb/ms`,M2.77 · agent-191 · e95552b。)**
**摘要**:可滚动选择容器。**行数据源回调**逐行给出(图标 / 标题 / 副标题 / 右侧操作 / 是否可选),容器负责绘制/滚动/选中/命中;支持**单选、多选、长按**(上下文操作)。适合「已保存网络 / 附近WiFi / 蓝牙设备 / 歌曲列表 / 设置子菜单」等。
@@ -813,9 +813,10 @@ void meow_ui_global_remove(int id);
- **SDK 提供系统组件 API 仅供系统进程链接调用**:SDK 保留系统级控件内部接口位(上面 ③);**用户 App 拿不到**、**不可自建悬浮层/全局叠加**——App 这类需求只能走 SDK 标准能力。
- **进程隔离(核心)**:SDK 负责**系统组件渲染**的进程(launcher)与负责 **APP 渲染**的进程**相互独立**——APP 卡死/崩溃时,系统 UI(launcher)**不崩**,始终可息屏/返回/下拉通知中心(对应 APPS §3.4.1 物理键全局接管、APP 禁映射)。
- **APP 侧职责**:只画自己的内容;经 IPC 上报**全屏声明**(`fullscreen`/`route.<id>.fullscreen`)、**内容区域**(inset)与**前台 activity**;系统 UI 据此做叠画 + 命中分流(§6.1 交互分层:③ 系统全局 → ② App 全局 → ① 当前 Activity 页面控件)。
- **App 前台划出通知中心(跨进程,[源:2026-08-30])**:全屏 App 前台时顶部下滑——**App 进程 SDK 只检测手势
(`MEOW_EV_NOTIF_PULL`→`meow_ui_sys_notif_pull()`)并经 IPC 上报**(`MSG_NOTIF_OPEN`),**不渲染系统 UI**;
通知中心由 launcher 渲染(SIGSTOP App+读回其帧+叠加 `run_notif_center`+接管输入+关闭恢复),
- **App 前台划出通知中心(跨进程,[源:2026-08-30],M2.82 已实现)**:全屏 App 前台时顶部下滑——**App 进程 SDK 只检测手势
(`MEOW_EV_NOTIF_PULL`→`meow_ui_sys_notif_pull()`)并经 IPC 上报**(`MSG_NOTIF_OPEN=0x0028`/`MSG_NOTIF_CLOSE=0x0029`,号以 `meow_ipc.h` 为准),**不渲染系统 UI**;
通知中心由 launcher 渲染(SIGSTOP App+读回其帧+叠加 `run_notif_center`+接管输入+关闭恢复,面板内 App 崩溃即关),
SDK 侧 `meow_ui_nav.c`/`meow_ui_media.c` 封装同步落地(**agent-206 · 9b41957**)。
见 `FRAMEWORK_DESIGN §10.5` / `devdocs/plan/NOTIF_CENTER_APP_OVERLAY_PLAN.md`。
---
+45 -24
View File
@@ -3,7 +3,7 @@
> 把 HiBy R3 Pro II 便携播放器(君正 X1600,MIPS32r2 / mipsel / musl 静态软浮点,480×720,无 GPU 软渲染)变成一个可扩展的「第二系统 + 应用框架」。
> MeowOS 与官方 HibyOS 共存于同一台设备:开机由引导选单二选一;启动后 MeowOS 作为主控层,提供自己的桌面 UI、应用框架、服务管理与系统组件。
>
> 版本:**M2.73(0.7.68)**(M2.73 已推卡真机验收;M2.74 / 0.7.69 待打)。版本号单点 = 板上 `/etc/meowos_version`,见「构建」。
> 版本:**M2.83(0.7.78)**(M2.69→M2.83 全链路自刷验收:控件库/主界面 MD3 双布局/M3 导航栈/M5 通知跳转/媒体会话/Now Playing/SDK nav+media 封装/字库启动竞态修复)。版本号单点 = 板上 `/etc/meowos_version`,见「构建」。本仓库是一个**自带 SDK、包管理、媒体会话、网页面板、网易云客户端的完整第三方系统**。
>
> 许可证:Apache-2.0(见 [`LICENSE`](LICENSE))。本仓库为非官方第三方项目。
@@ -15,8 +15,11 @@
- **双系统共存**:官方 HibyOS 原样保留;开机引导选单决定本次进入哪个系统(MeowOS / HibyOS),两者互斥运行,任一时刻只跑一个。
- **应用框架**:一套 C 应用 SDK(`meow_ui`),第三方 App 用统一控件 / 输入 / 主题 / 字体 / 通知 API 开发,无需自读帧缓冲、自读输入、自管返回——把每个 App 都要踩一遍的坑收口到框架里。
- **系统组件**:状态栏、通知中心、电源菜单、全局左缘返回手势、主界面(应用列表)、设置页、服务管理器、mDNS 广播;系统进程总监 `meow_sysui`(M2.71);专项子服务 `meow_svc_perf` / `meow_svc_power`(M2.73 已落地:perf 含 network 采集、power 含升级写保护 + dac 真实音量,见 §2.9);MeowPanel 外部管理面板(SDK 控件库 M2.73 修复 W_LIST 视口裁剪 / 残影脏区 / IME 行为,见 §2.4)。
- **系统组件**:状态栏、通知中心、电源菜单、全局左缘返回手势、主界面(应用列表,**MD3 卡片宫格/列表双布局**)、设置页、服务管理器、mDNS 广播;系统进程总监 `meow_sysui`;专项子服务 `meow_svc_perf`(性能/系统只读聚合,含真实 network)与 `meow_svc_power`(关机/重启/升级/回 HiBy,含升级写保护 + dac 真实音量 + 读级鉴权放宽);系统级崩溃捕获 `meow_crash` + App 崩溃直报;.mpk **Ed25519 签名验签** `meow_verify`(见 §2.9);MeowPanel 外部管理面板(HTTP/JSON 后端 + Web 前端,支持可选密码鉴权,见 §2.10)。
- **媒体会话 / Now Playing**:`MSG_META`/`MSG_PLAYCTL`(0x72/0x73)媒体会话(最近活跃源,30s 超时回收)+ 通知中心**媒体卡片** + 主界面左滑 **Now Playing 大页**;媒体键路由到最近活跃媒体会话。
- **应用生态**:**网易云 os.meow.ncm**(`core/`:mbedtls+jsmn+qrcodegen+minimp3 ≈438KB;v1 复古 UI:登录二维码/我创建的·我收藏的双页签/搜索/歌单详情/黑胶播放页/设置,ALSA 直开 hw:0,0 播放,登录 803 已通);外置**系统文件管理器 os.meow.files**;`meow_ui` SDK 配套结构化列表 `W_LISTVIEW`、通用长按、SDK nav/media 封装、视图框架(可嵌套 view + 事件路由 + 绘制期 clip);App 通知查询/清除 IPC(0x25-27)与**点击通知跳转路由**(route_status)。
- **进程隔离**:系统 UI 渲染进程与 App 进程相互独立,App 卡死不会冻结整个 UI。
- **包管理**:`nyai`(固件内置 `/usr/bin/nyai`)支持 .mpk 安装/升级/导出/列表/索引,走 **version_code 安卓式版本规则**(缺 code 拒装、防降级)+ 签名分级(有签必验、`os.meow.*` 无签拒装、第三方直装告警)+ 导出过滤与体检。
**面向谁**:
@@ -64,7 +67,7 @@ init (rcS)
### 2.3 launcher —— 系统 UI 渲染宿主
`/usr/bin/meow_launcherd`是 MeowOS 的核心进程,负责渲染**系统级 UI**。**二进制名不变**(`/usr/bin/meow_launcherd`,bootmenu `LAUNCHER_BIN` 指向它),源码 M2.69 起由单文件 `patch_v2/meow_launcherd/meow_launcherd.c`(9778 行)**拆分为多模块**(`patch_v2/meow_launcherd/`,14 模块:`main_menu/statusbar/settings_page/power_menu/notif_center/app_launcher/fb_compositor/audio/backlight/net/about/font_theme/keys/util` + 共享头 `meow_launcher_internal.h`;`build_launcher.sh` 列模块)——逻辑更清晰、便于并行开发,行为不变。
`/usr/bin/meow_launcherd`是 MeowOS 的核心进程,负责渲染**系统级 UI**。**二进制名不变**(`/usr/bin/meow_launcherd`,bootmenu `LAUNCHER_BIN` 指向它),源码 M2.69 起由单文件 `patch_v2/meow_launcherd/meow_launcherd.c`(9778 行)**拆分为多模块**(`patch_v2/meow_launcherd/`,当前含 `main_menu/statusbar/settings_page/power_menu/notif_center/app_launcher/fb_compositor/audio/backlight/net/about/font_theme/keys/util` + 后期新增 `subpage/wifi_page/bt_page`(蓝牙/WiFi 独立子页)、`now_playing`(Now Playing 大页)、`meow_media`(媒体会话,最近活跃源 + 30s 超时回收)+ 共享头 `meow_launcher_internal.h`;`build_launcher.sh` 列模块)——逻辑更清晰、便于并行开发,行为不变。
负责渲染:
@@ -100,7 +103,9 @@ init (rcS)
**SDK 控件库(统一控件架构,M2.70/M2.71 两批落地,见 `MEOW_APP_SDK.md` §5.8)**:
- **第一批 = 通用基座(M2.70/0.7.65)**:`meow_widget` 基座统一标准控件与自定义画布;`meow_widget_opts`(Modifier 式通用 Options,`meow_widget_set_opts`);统一状态机 `MEOW_WS_ENABLED/SELECTED/FOCUSED/PRESSED`(`meow_widget_set_state`);`meow_widget_custom_create`(自定义画布,App 提供 render/hit 回调);布局 `meow_row/column/box` + `meow_layout_add/arrange` + `spacer`;主题接口 `meow_ui_set_style` / `meow_theme_get`(MD3/MIUIx × 明暗 + 背景全局源)。
- **第二批 = Material 组件子集(M2.71/0.7.66)**:Button 五型(`meow_btn_create_variant`)/ TextField(IME)/ Card / Divider / Badge / Checkbox / Radio / ProgressBar / FAB / TopAppBar / NavigationBar / TabBar / LazyColumn/LazyRow / Dialog / BottomSheet。
- **M2.73 控件库修复(`meow_ui.a` md5 `e8341975`,见 `MEOW_APP_SDK.md` §5.8)**:`W_LIST`(含 LazyColumn/LazyRow)**视口裁剪**——滚动时只绘制落在视口内的行/分隔线/文本,杜绝「行滚出视口把内容画到视口外并标脏上屏」导致的标题栏/底部脏区(SDK 全局生效,非 App 侧)。z 序:**App 侧 `d_paint_region`**(`hello_app`)局部刷新时按 z 栈重画(内容→标题→slider 值→chrome),根治「层动态控件实时重绘盖住/抹掉上层 FAB」;**SDK 级全局 z 序方案在评估,暂未落定(标注)**。IME(`meow_ui_ime.c`):键盘区背景快照/恢复(无残影)、配色走主题、shift 大小写、阻塞 `meow_ui_text_input` 喂 `on_tick`(避免进度条卡死)、OK(回车)= 提交并关闭 / ESC = 取消并关闭、回显条=实时输入回显(非候选/联想,候选框留中文输入法)。渲染:局部刷新不再清底重画单个控件(改 z 栈重画),消除重叠区残留。
- **M2.73 控件库修复(`meow_ui.a` md5 `e8341975`,见 `MEOW_APP_SDK.md` §5.8)**:`W_LIST`(含 LazyColumn/LazyRow)**视口裁剪**——滚动时只绘制落在视口内的行/分隔线/文本,杜绝「行滚出视口把内容画到视口外并标脏上屏」导致的标题栏/底部脏区(SDK 全局生效,非 App 侧)。IME(`meow_ui_ime.c`):键盘区背景快照/恢复(无残影)、配色走主题、shift 大小写、阻塞 `meow_ui_text_input` 喂 `on_tick`(避免进度条卡死)、OK(回车)= 提交并关闭 / ESC = 取消并关闭、回显条=实时输入回显(非候选/联想,候选框留中文输入法)。渲染:局部刷新不再清底重画单个控件(改 z 栈重画),消除重叠区残留。
- **M2.76+ 新增**:`W_LISTVIEW` **结构化列表控件**(§5.5 A②落地:图标/标题/副标题/右侧操作 arrow·switch·check·more、单选/多选/禁态、行右 1/3 操作区命中、视口裁剪、全语义色);**通用长按事件** `MEOW_EV_LONG_PRESS`(坐标式 + `meow_ui_set_long_press_cb/ms` opt-in,默认 500ms,移动>12px 取消、长按后抬手抑制 TAP/SWIPE);**视图框架**(`meow_ui_view.c`:可嵌套容器 + 六生命周期 + `page_push/pop/replace` 包装 activity 栈 + 广播注册表 z 序 + `meow_view_dispatch_event` z 降序子>父命中即消费 + **绘制期通用 clip**`g_clip_stack[16]` 根除越界脏区);**SDK 级 z 序已并入视图框架**(自动注册 + 子>父 + `set_z(999)` 置顶 + 收敛 live_btn),hello App 层 `d_paint_region` 临时方案退役。
- **M2.82 新增**:SDK **nav/media 封装**——`meow_ui_nav.c`(env 栈初始化 + report/request_exit)、`meow_ui_media.c`(懒连断线重连,meta 上报 + playctl 接收);SDK 顶部下滑手势→IPC 请求 launcher 展开通知中心(§10.5,App 进程不渲染系统 UI)。
- 既有 `meow_btn/slider/switch/list_create` 签名一字不改(向后兼容),Options/状态机走新增挂载器。
### 2.5 服务
@@ -112,7 +117,10 @@ init (rcS)
- **M2.73 悬垂指针修复(md5 `da6ebc66`)**:`scan_and_reconcile` 用 `*s=tmp` 整体拷贝后 `s->argv[]` 曾指向已销毁栈帧 → `execv`/`/proc/pid/cmdline` 错乱;新增 `svc_rebuild_argv` 重定位到服务自身 `exec`/`argbuf`(删除服务后同 tick 拉起不再错位)。
- **meow_mdns(mDNS 应答器,自研)**:`/usr/bin/meow_mdns`,**IPv4-only**(该设备内核无 IPv6,完整 mDNSResponder/SAResponder 均无法运行),应答 `<host>.local` 的 A 记录与 `_ssh._tcp` 的 PTR/SRV/TXT。由 `meow_svcd` 托管(板载 `services.d/mdnsd.conf`,`trigger=boot`)。
- **hostname = `meowos`**(设置键 `system.hostname`,缺省 `meowos`;`S89meow_svcd` 开机 `sethostname`)→ 即 `meowos.local`。
- **M2.78 竞态修复**:无可用 IPv4 不再 `exit(2)`(改内部 2s 等待重试,SIGTERM 可打断);5s 周期检测掉线/换 IP → 重新 join 组播 + A 记录实时刷新(修 IP 变更还带旧地址);接口 down 时零应答守卫;`MEOW_MDNS_IF` 落地。
- 注:手机热点会丢弃设备→主机的组播应答,`avahi-resolve meowos.local` 在上网热点下会超时(网络层热点隔离,非应答器缺陷),主机可用 DNS 兜底。
- **meow_crash(系统级崩溃捕获)**:svcd 服务异常退出上报(AF_UNIX best-effort,不崩 svcd)+ dmesg 增量扫 segfault/oops;落盘 TF `MeowOS/logs/crash_<bootts>.log`(无卡回退 /tmp + 迁移);CLI `dump`/`tail`;`S89` 预置 `crash.conf`。launcher 另在 `launch_app` waitpid 回收处 **notify_app_crash**(信号杀/非0退出上报,干净 exit 不报)。
- **meow_verify / meow_sign(包签名,二期 2A 最小闭环)**:`meow_verify`(Ed25519 验签 CLI,公钥固化固件,TweetNaCl+SHA256 单文件);`meow_sign`(宿主 keygen/sign,尾部 180B footer 签名块,私钥仅 `.keys/` 不入库);nyai 与 launcher `meow_pkg_install` **验签分级**(有签必验 / `os.meow.*` 无签拒装 / 第三方直装告警 / 三重绑定 / 原签存 `.mpk.src` 导出保留);svc_power IPC 鉴权(SO_PEERCRED→/proc/pid/exe→包名/系统身份 allowlist)。
### 2.6 通知系统
@@ -123,12 +131,17 @@ init (rcS)
- **TTL / 转储**:通知创建 **10s** 后追加写入 TF `MeowOS/notifications/`(CSV 行,滚动保留**最新 10MB**,不被电源事件清);正常关机先转储再清板载;开机清板载残留 + 清内存表;**无 TF 卡可运行**(仅内存态)。`urgency`(0-3)、`icon`、`progress`(实时进度仅改内存活跃槽,里程碑落盘,不每帧写卡)。
- 通知数据模型补全(SDK→IPC→存储→dump 全链路):`meow_notify_send` 返回 id、`meow_notify_update_progress`、`urgency`/`icon` 字段。通知中心 UI 由系统进程(launcher)渲染,数据经 IPC 从存储读取。
- **通知中心 UI(系统进程 launcher 渲染,M2.65 已实现)**:顶部下滑展开。含**快捷行 5 chip**〔WiFi / 蓝牙 / 主题 / 亮度 / **电源菜单**——电源菜单 chip 点击唤起**真电源菜单**〕、**勿扰开关**(面板内小 toggle,开=只显示高优先级 `urgency>=2`,设置键 `notify.dnd`)、**通知列表滚动**、**单条通知左滑删除**(跟手、半程可回、过阈值滑出删除)、**一键清除**(与勿扰对称的清除按钮,仅清**非活动**通知,先转储留档再清显示;ongoing / 媒体 / 进度条进行中一律保留)、**面板跟手下拉 / 半程可回**(1:1 跟手、松手 40% 锚定,与行左滑 / 列表滚动 / 左缘返回互斥)、面板/开关带**滑条平移动画**(复用设置页方案)。交互细节见 `NOTIFICATION_SYSTEM.md §9`。
- **App 前台唤起通知中心(§10.5,M2.82 落地)**:全屏 App 前台时顶部下滑,**App 进程只负责检测手势 + 经 IPC 上报**(`MSG_NOTIF_OPEN=0x28`),launcher **SIGSTOP App → 读回帧 → 叠加渲染通知中心 → 接管输入 → SIGCONT App**(面板内 App 崩溃即关);`MSG_NOTIF_CLOSE=0x29` 收尾。App 进程不渲染系统 UI。
- **媒体卡片 / Now Playing(M2.81 落地)**:通知中心顶部**媒体卡片**(封面缓存 + 进度 seek + 控制键);主界面中部/右缘左滑进 **Now Playing 大页**(封面 + 元数据 + 进度 + 控制 + 歌词占位),左缘返回;空态完备。
- **通知查询/清除 IPC(0x25-27)**:`MSG_NOTIFY_QUERY(0x25)`/`MSG_NOTIFY_QUERY_RESULT(0x27)`(活跃通知集 JSON)/`MSG_NOTIFY_DISMISS_ALL(0x26)`(保留媒体/进度/常驻红线);序列化在主循环单写者做;MeowPanel `/api/notifications` 实时化前置。
### 2.7 字体系统
- 多字体库在 TF 卡 **`MeowOS/fonts/<family>/<weight>/`**(每套三件套:`font.png` + `font.idx` + `font.json`),由 `font/gen/gen_font.py` 生成(`--weight` 写字重、`--charset` 档位)。
- 字体列表索引 **`MeowOS/config/fonts/index`**:launcher 扫描后落盘(`family,weight,path,label,tier,glyph_count` CSV);SDK 读该文件枚举字库,**不自行发现**。
- 多字体库在 TF 卡 **`MeowOS/fonts/<family>/<weight>/<tier>/`**(**三级目录,M2.78 落地,两级向后兼容**;每套三件套:`font.png` + `font.idx` + `font.json`),由 `font/gen/gen_font.py` 生成(`--weight` 写字重、`--tier` 档位、`--json-name`)。
- **思源黑体 `source_han_sans_cn` 7 字重 10 套已入卡**(common + regular/medium/bold gbk 等)。
- 字体列表索引 **`MeowOS/config/fonts/index`**:launcher 扫描后落盘(`family,weight,path,label,tier,glyph_count` CSV,含三级条目);SDK 读该文件枚举字库,**不自行发现**。
- `font.file` 设置键选默认套(缺省 `MeowOS/fonts/default/regular/font.png`);`font.json` 标 `weight` / `charset`(`common`≈4k / `gbk`≈20k+ / `full`)/ `glyph_count`;缺失件 → 该套跳过 + 日志。
- **M2.83 启动竞态修复**:卡就绪(热插拔轮询)后**重扫字库 presets**(开机早扫时卡未挂载只剩默认项,App 大字库声明落空→豆腐块);扫描根目录不可读且仅默认项时不写 index(防开机覆盖掉卡上既有索引)。
- 字库档位:默认用小字库(`common`≈4k);App 声明需大字库(`app.json "fonts":"full"`)才加载大字库;`font.load_full` 强制全系统大字库。
- 多字体(`display.multi_font`):按字符类别(CJK/LATIN/NUM/…)逐字符路由,可各选一套。
- **App 未自带字库 → 跟随系统 `font.file`**:launcher 启动 App 前把当前生效字体注入为 env `MEOW_FONT_PNG`/`MEOW_FONT_IDX`(绝对路径),SDK 优先读 env;无 env 回退卡默认 → 固件内置。SDK `meow_font_has_glyph(cp)` 预判当前字库是否含某码位(缺字回退/提示)。
@@ -142,9 +155,9 @@ init (rcS)
### 2.9 系统框架 / 专项服务
把**系统复用功能收敛到系统框架**(`devdocs/plan/SYSTEM_FRAMEWORK_SERVICES.md`,一期在跑):meow_sysui 派生 → meow_svcd 托管 → IPC。新增两个 **svcd 托管、板载 `trigger=boot`** 的专项子服务:
把**系统复用功能收敛到系统框架**(`devdocs/plan/SYSTEM_FRAMEWORK_SERVICES.md`,一期已落地):meow_sysui 派生 → meow_svcd 托管 → IPC。新增两个 **svcd 托管、板载 `trigger=boot`** 的专项子服务:
- **`meow_svc_perf`**(性能 / 系统只读聚合,IPC `/usr/data/meow_perf.sock`,`MSG_PERF_QUERY(0x0050)→MSG_PERF_RESULT(0x0051)`);**`meow_svc_power`**(关机 / 重启 / 升级 / 回 HiBy 系统动作,IPC `/usr/data/meow_power.sock`,`MSG_POWER_ACTION(0x0060)→MSG_POWER_STATUS(0x0061)`,服务端 `SO_PEERCRED uid==0` 基础鉴权)。**M2.73 已落地**:`meow_svc_perf` 增 **network** 子集(真实 WiFi `wpa_cli`/`ip` + 蓝牙 `hci0`/sysfs + `hostname_local`),并入 SYSTEM 子集输出;`meow_svc_power` **升级写保护**(`upgrade` 写 mtd5 前校验卡根 `r3proii.upt` 存在+可读+常规文件+size>0,失败不写 mtd5/不重启——**只完整性、不签名**,海贝官方固件无签名,签名会挡自刷)与 **`dac status` 读板载 `settings.conf` 的 `audio.volume` 真实值**(弃 amixer dummy)。新 md5:perf `fa073bf9`、power `f3e653d5`。
- **`meow_svc_perf`**(性能 / 系统只读聚合,IPC `/usr/data/meow_perf.sock`,`MSG_PERF_QUERY(0x0050)→MSG_PERF_RESULT(0x0051)`);**`meow_svc_power`**(关机 / 重启 / 升级 / 回 HiBy 系统动作,IPC `/usr/data/meow_power.sock`,`MSG_POWER_ACTION(0x0060)→MSG_POWER_STATUS(0x0061)`,服务端 `SO_PEERCRED uid==0` 基础鉴权)。**M2.73 已落地**:`meow_svc_perf` 增 **network** 子集(真实 WiFi `wpa_cli`/`ip` + 蓝牙 `hci0`/sysfs + `hostname_local`),并入 SYSTEM 子集输出;`meow_svc_power` **升级写保护**(`upgrade` 写 mtd5 前校验卡根 `r3proii.upt` 存在+可读+常规文件+size>0,失败不写 mtd5/不重启——**只完整性、不签名**,海贝官方固件无签名,签名会挡自刷)与 **`dac status` 读板载 `settings.conf` 的 `audio.volume` 真实值**(弃 amixer dummy)。**M2.78 读级鉴权放宽(agent-189)**:`STATUS`/`BATTERY`/`REBOOT_REASON`/`UPGRADE_STATUS`/`dac status` 读级不再查 uid(任意调用者);动作级维持 `os.meow.*`/系统身份白名单。当前 md5:perf `7ea196de`、power `c6ddf3f8`。
- **电源 CLI `meow_svc_power <cmd>`**(root 免鉴权、单一命令、**不覆盖**系统 shutdown/reboot):`shutdown` / `reboot[--hiby]`(强制回 MeowOS)/ `upgrade`(写 mtd5,含升级写保护)/ `set-default-meow` / `set-default-hiby` + `status` / `battery` / `reboot-reason` / `upgrade-status` / `screen on|off|timeout<秒>` / `dac on|off|status`。
- launcher 电源菜单与 MeowPanel 均**改为经这些服务 IPC 触发**,不再直连 `sys_do_reboot` / 爬 `/proc`。
- **二期**:关键 IPC 只接受 `os.meow.*` 鉴权 + `.mpk` 打包签名验签(防伪造包名,解包验签 / 导出保留签名)。
@@ -154,9 +167,10 @@ init (rcS)
- **定位/部署**:**外置 TF 卡系统组件**(`MeowOS/opt/MeowPanel/` + `MeowOS/services.d/meowpanel.conf`,svcd 托管、无卡跳过、系统核心不依赖),**不进固件**。
- **后端**:`patch_v2/meowpanel/meowpanel.c` 单进程零第三方依赖 C 静态二进制,内嵌 HTTP/JSON 服务器(8080)+ 静态托管(`/`→index.html、`/assets/*`)+ 框架专项服务 IPC 客户端 + `settings.conf` 设置镜像。**读侧透传** `meow_svc_perf` IPC(`/api/{status,perf,system}`,单一权威源,不各自爬 /proc)、**动作侧**经 `meow_svc_power` IPC(`/api/system/{reboot,shutdown,ota}`)。
- **能力**:设置镜像(`settings.conf` 解析 `key = value` 带空格 + 精确匹配,防 `audio.volume` 误配 `audio.volume_max`)、文件白名单(`MeowOS/Music/MeowData/MeowAPPs/book`,`..` 逃逸→403)、应用(`nyai install/export/remove`,包名 = `app.json.package`)、按键注入(`/dev/input/event*` evdev,只注入音量/电源/播放/上下曲,**禁返回(158)/主页(172)/确认(28)/退出(96)**)、日志(`MeowOS/logs`)。
- **M2.73**:系统页「以太网」→「**蓝牙**」栏(无网口有蓝牙);**OTA 检查升级 bug 已修**(改读 `GET /api/system` 返回的 `ota` 字段,不再误触 `POST /api/system/ota` 触发升级)。新后端 md5 `11ed76ec`。
- **⚠️ 无鉴权**:内网信任模型(`reboot/shutdown/ota/apps/删除/上传` 等危险端点无鉴权,**勿把 8080 暴露到不可信网络**);`meow_svc_power` 服务端做 `SO_PEERCRED uid==0` 基础校验。
- **能力**:设置镜像(`settings.conf` 解析 `key = value` 带空格 + 精确匹配,防 `audio.volume` 误配 `audio.volume_max`)、文件管理(白名单 `MeowOS/Music/MeowData/MeowAPPs/book`,`..` 逃逸→403;**目录优先+名称不区分大小写排序、条目上限 1024**;上传 8MB 上限、文件名净化、双重白名单、`read>1MB` 截断)、**通知中心后端**(`/api/notifications` 读 TF 归档环形 200 条 + 单删 + dismiss_all)、应用(`nyai install/export/remove`,包名=`app.json.package`;`nyai` 路径固件内置 `/usr/bin/nyai` 优先+卡上回退)、按键注入(`/dev/input/event*` evdev,只注入音量/电源/播放/上下曲,**禁返回(158)/主页(172)/确认(28)/退出(96)**)、日志(`MeowOS/logs`)。
- **OTA 检查升级 bug 已修**:改读 `GET /api/system` 返回的 `ota` 字段,不再误触 `POST /api/system/ota` 触发升级。
- **M2.78 可选密码鉴权(agent-196,默认关)**:`panel.auth_enabled`(默认0) + `panel.auth_pass`(带盐 sha256 不明文);token 会话(`/dev/urandom`,TTL 12h,内存+卡持久化,静态屏蔽 session 文件);未启用零回归,启用后 `/api/*` 全要会话;前端登录页 + 401 回跳 + 设置卡片。
- **⚠️ 鉴权默认关**:内网信任模型(`reboot/shutdown/ota/apps/删除/上传` 等危险端点默认无鉴权,**勿把 8080 暴露到不可信网络**);`meow_svc_power` 服务端做 `SO_PEERCRED uid==0` 基础校验。
- **前端**:`patch_v2/meowpanel/web/`(MD3/MIUIx 双主题 + 宝塔式 + 浏览日夜);`/usr/bin/nyai` 装 `.mpk`;launcher 的 `meow_pkg_export` / `nyai export` 导出 tar.gz(busybox tar + gzip,不需 zip)。详见 `patch_v2/meowpanel/README.md`。
---
@@ -167,11 +181,14 @@ init (rcS)
- **`patch_v2/`(入库)**—— MeowOS 核心源码:
- `bootmenu/` 引导选单 + Supervisor(`meow_bootmenu`,`LAUNCHER_BIN=/usr/bin/meow_launcherd`)
- `meow_launcherd/` launcher(系统 UI 宿主,**多模块**:`main_menu/statusbar/settings_page/power_menu/notif_center/app_launcher/fb_compositor/audio/backlight/net/about/font_theme/keys/util` + `meow_launcher_internal.h` + `build_launcher.sh`)、`meow_ipc`、`meow_settings`、`meow_font`、`meow_notif`、`meow_card_path.sh`
- `sdk/` meow_ui SDK 源码 + `build_sdk.sh`(→ `meow_ui.a`;含**统一控件库**:widget/theme/activity/global/dialog/ime/img/input/log/notify/sys/vol)
- `hello_app/` 示例 App(`hello.c` + `build_hello.sh`)
- `meow_launcherd/` launcher(系统 UI 宿主,**多模块**:`main_menu/statusbar/settings_page/power_menu/notif_center/app_launcher/fb_compositor/audio/backlight/net/about/font_theme/keys/util` + `subpage/wifi_page/bt_page`(蓝牙/WiFi 子页)`now_playing`(Now Playing)`meow_media`(媒体会话)`meow_ipc`/`meow_settings`),+ `meow_launcher_internal.h` + `build_launcher.sh`
- `sdk/` meow_ui SDK 源码 + `build_sdk.sh`(→ `meow_ui.a`;含**统一控件库**:widget/theme/activity/global/dialog/ime/img/input/log/notify/sys/vol/view(视图框架)draw(绘制 z 序/注册表)nav/media(导航/媒体会话封装))
- `hello_app/` 示例 App(`app.c` + `ui/{home,full,demo}.c` + `ui/common/chrome.c` + `logic/{notify,state}.c` + `build_hello.sh`)
- `ncm_app/` 网易云客户端源码(`core/`:mbedtls 裁剪+jsmn+qrcodegen+minimp3;UI v1 + 复古配色;vendor/ 与 out/ gitignore 不入库)
- `files_app/` 外置系统文件管理器 os.meow.files(app.c + ui/{browser,viewer}.c + ui/common/chrome.c + logic/fsx.c)
- `meow_sysui/` 系统进程总监(`meow_sysui` + `S70meow_sysui` + `meow_sysui.md`)
- `meow_svcd/` 服务管理器;`meow_watchdog/` 应用看门狗;`meowpkg/` 包管理(`nyai.c`);`uinput_tap/`
- `meow_crash/` 系统级崩溃捕获;`meow_verify/` `.mpk` Ed25519 验签;`meow_sign/` 宿主签名工具;`meow_svc_perf/`、`meow_svc_power/` 专项子服务;`meowpanel/` MeowPanel 外置面板后端 + `web/` 前端;`meow_amsd/` amsd 活动管理器(agent-212 规划,设计见 `devdocs/plan/AMSD_DESIGN.md`)
- **`mips-repo/`(入库)**—— mipsel 交叉编译软件仓库:`bins/`(`meow_mdns` / `mdnsd` 等二进制工具 + `build.sh` + `manifest.md`)、`mpk/`(`.mpk` 应用包)。
- **`docs/`(入库)**—— `MEOWOS_SPEC_REF.md` 权威速查总索引。
- **`font/`(入库)**—— 字形系统:`gen/gen_font.py` 生成器、`meow_font.c/.h` 渲染库、`demo/`、`src/`(字体源文件)。
@@ -224,7 +241,7 @@ patch_v2/hello_app/build_hello.sh # 链 meow_ui.a + libz.a + -lpthread → hel
- TF 卡布局见 `TF_CARD_LAYOUT.md`。App 目录 `MeowAPPs/<package>/`(`package` = `app.json` 的 `package`,如 `os.meow.hello`):`app.json` + 静态 MIPS 二进制 + 资源;数据在 `MeowData/<package>/{data,cache}`。
- **热更新**:把构建产物放入 `MeowAPPs/os.meow.hello/` 即可;launcher 每次打开菜单重扫卡,立即可见。App 二进制/资源在卡上;拔卡会优雅降级(应用列表"未插卡"/字体回退/日志回退内存环),不崩系统。
- 应用日志:`MeowOS/logs/apps/<package>/logs/<ts>_<pid>.log`(每次启动新文件,单文件 2MB 轮转、每 App 总量上限)。包管理 CLI `nyai`(放 `MeowOS/opt/bin/nyai`):`nyai install <pkg>/<file.mpk>` 等。**`.mpk` = tar.gz**(app.json + 二进制 + 资源,不含 data/cache);launcher 的 `meow_pkg_export` / `nyai export` 导出 tar.gz(busybox tar + gzip,不需 zip);二期加打包签名验签(见 APPS.md)。
- 应用日志:`MeowOS/logs/<package>/<ts>_<pid>.log`(**M2.78 日志目录扁平化**去 `apps/` 嵌套,卡可用时旧 `logs/apps/*` 一次性迁移并入;每次启动新文件,单文件 2MB 轮转、每 App 总量上限)。包管理 CLI `nyai`(固件内置 `/usr/bin/nyai`):`nyai install <pkg>/<file.mpk>` 等。**`.mpk` = tar.gz**(app.json + 二进制 + 资源,不含 data/cache);launcher 的 `meow_pkg_export` / `nyai export` 导出 tar.gz(busybox tar + gzip,不需 zip);**二期签名验签已落地(agent-185)**:`meow_verify` 验签、`meow_sign` 宿主签名、有签必验 / `os.meow.*` 无签拒装 / 第三方直装告警(见 APPS.md)。
**TF 卡目录(关键)**
```
@@ -233,12 +250,12 @@ patch_v2/hello_app/build_hello.sh # 链 meow_ui.a + libz.a + -lpthread → hel
├── MeowData/<pkg>/{data,cache}
├── MeowAPPs/<pkg>/ # 应用(app.json + 二进制 + 资源)
└── MeowOS/
├── fonts/<family>/<weight>/ # 多字体库
├── config/fonts/index # 字体列表索引
├── fonts/<family>/<weight>/<tier>/ # 多字体库(三级,M2.78)
├── config/fonts/index # 字体列表索引(含三级条目)
├── notifications/ # 通知转储(10MB 滚动)
├── logs/ # 系统 / 应用日志
├── logs/<package>/ # 应用日志(扁平化);crash_<bootts>.log 崩溃转储
├── services.d/<name>.conf # 服务配置(TF 源,与板载双源)
└── opt/bin/ … # 外围工具(nyai/curl/…)
└── opt/ # MeowPanel + opt/bin 外围工具(nyai/curl/…)
```
---
@@ -253,6 +270,7 @@ patch_v2/hello_app/build_hello.sh # 链 meow_ui.a + libz.a + -lpthread → hel
"exec": "/usr/data/mnt/sd_0/MeowAPPs/os.meow.hello/hello",
"package": "os.meow.hello",
"version": "0.1",
"version_code": 1,
"author": "whoever"
}
```
@@ -262,11 +280,13 @@ patch_v2/hello_app/build_hello.sh # 链 meow_ui.a + libz.a + -lpthread → hel
| `name` | ✓ | 列表显示名(v2 仅支持 ASCII) |
| `exec` | ✓ | 可执行文件绝对路径(必须为**静态** MIPS32r2 ELF) |
| `package` | — | 反域名权威 app_id(= 目录名;缺省回退目录名,两者不同 → WARN) |
| `version` / `author` | — | 保留字段 |
| `version` | — | 显示字符串(versionName 角色,如 `1.2.3-beta`,**不参与比较**) |
| `version_code` | — | **纯数字,安装/升级比较唯一依据**(缺 code 拒装;新版 < 已装拒装);`version` 仅显示 |
| `author` | — | 保留字段 |
| `fullscreen` | — | app 级全屏:状态栏**收合至提示线** + 保留左缘返回 / 顶部提示线 / 下滑通知中心(activity 级用 `route.<id>.fullscreen`) |
| `fonts` | — | 字库档位声明 `"full" | "gbk" | "common"`(默认 `common`≈4k) |
其他扩展(launcher 极简解析、不校验 JSON):`icon` / `framework` / `immersive` / `route.<id>`(路由表)/ `awake.<id>`(keep_awake)/ `service.<svc>`。应用数上限 8,扫描深度 1 级。
其他扩展(launcher 极简解析、不校验 JSON):`icon` / `framework`(导航栈承载)/ `immersive` / `route.<id>`(路由表,`framework=1` 时看门狗返回发 SIGUSR1)/ `awake.<id>`(keep_awake)/ `service.<svc>`。应用数上限 8,扫描深度 1 级。
### 6.2 链接与入口
@@ -287,13 +307,14 @@ patch_v2/hello_app/build_hello.sh # 链 meow_ui.a + libz.a + -lpthread → hel
### 6.4 控件 / 主题 / 字体 / 通知 API
- **控件**:`meow_btn_create` / `meow_slider_create` / `meow_switch_create` / `meow_list_create(count, src, ctx)` + `meow_widget_draw/hit`;`meow_ui_activity_push/pop`(Activity 栈,控件归属当前 Activity)、`meow_ui_global_add/remove`(② 层 App 跨 Activity 全局控件)。
- **控件**:`meow_btn_create` / `meow_slider_create` / `meow_switch_create` / `meow_list_create(count, src, ctx)` + `meow_widget_draw/hit`;结构化列表 `W_LISTVIEW`(图标/标题/副标题/右侧操作、单选/多选/禁态、视口裁剪);通用长按 `meow_ui_set_long_press_cb/ms`(`MEOW_EV_LONG_PRESS`);`meow_ui_activity_push/pop`(Activity 栈,控件归属当前 Activity)、`meow_ui_global_add/remove`(② 层 App 跨 Activity 全局控件);视图框架 `meow_view`(可嵌套容器 + 生命周期 + `page_push/pop/replace`)。
- **导航 / 媒体会话**:`meow_ui_nav`(env 栈初始化 + report/request_exit,接 M3 导航栈)、`meow_ui_media`(懒连断线重连,`MSG_META` 上报 + `MSG_PLAYCTL` 接收,接媒体会话)。
- **图片**:`meow_img_load_file/mem` + `meow_ui_img/scaled/alpha/cover`(stb_image 解 PNG/JPEG/BMP;`cover` = 居中裁方)。
- **IME**:`meow_ui_text_input` / `_async`(仅英文/数字 ASCII,键盘占底部)。
- **主题**:`meow_theme_set_mode(light/dark/auto)` + `meow_theme{bg,fg,accent,dim}`,切换即时生效。
- **字体**:`meow_font_get_available_count/enumerate`(读 `MeowOS/config/fonts/index`)、`meow_font_select_by_id`、`meow_font_has_glyph(cp)`;多字体 `meow_font_config_multifont` / `meow_font_load_slot`。
- **通知**:`meow_notify_register_type(cat)`(每 App ≤4 类)/ `meow_notify_send(const meow_notify*)`(返回 id)/ `meow_notify_cancel(id)` / `meow_notify_update_progress`;常量 `MEOW_NOTIFY_MAX_TYPES=4`、`MEOW_NOTIFY_MAX_PER_TYPE=4`、`MEOW_NOTIFY_MAX_MEDIA=1`。
- **日志**:`meow_log(lvl, fmt, ...)`(`MEOW_LOG_DEBUG/INFO/WARN/ERROR`)→ `MeowOS/logs/apps/<package>/logs/`。
- **通知**:`meow_notify_register_type(cat)`(每 App ≤4 类)/ `meow_notify_send(const meow_notify*)`(返回 id)/ `meow_notify_cancel(id)` / `meow_notify_update_progress`;常量 `MEOW_NOTIFY_MAX_TYPES=4`、`MEOW_NOTIFY_MAX_PER_TYPE=4`、`MEOW_NOTIFY_MAX_MEDIA=1`。查询/清除走 launcher IPC(`MSG_NOTIFY_QUERY(0x25)`/`DISMISS_ALL(0x26)`/`QUERY_RESULT(0x27)`);点击通知按 `route_status` 跳转。
- **日志**:`meow_log(lvl, fmt, ...)`(`MEOW_LOG_DEBUG/INFO/WARN/ERROR`)→ `MeowOS/logs/<package>/`(M2.78 扁平化);App 崩溃直报 `meow_crash`(信号杀/非0退出 best-effort 上报)。
### 6.5 物理键规范(红线)