WIP checkpoint (M2.53→M2.54 工作区): 字体归MeowOS/fonts+SDK跟随+多字体(进行中)+boot板载+状态栏28+亮度/音量修复+文档刷新
This commit is contained in:
1 parent
245bee2946
commit
064635b3c4
44 files changed
+2834
-308
No files matched your search
@@ -42,19 +42,21 @@
|
||||
```
|
||||
/usr/data/mnt/sd_0/ # TF 卡挂载点
|
||||
└── MeowAPPs/
|
||||
├── <app_id>/
|
||||
│ ├── app.json # 应用描述(必填)
|
||||
├── <package>/ # 目录名 = app.json 的 package(权威 app_id)
|
||||
│ ├── app.json # 应用描述(必填;package 字段为权威 app_id)
|
||||
│ ├── <binary> # 静态 MIPS32r2 ELF(exec 指向)
|
||||
│ └── icon.png # 预留:列表图标(v2 未用)
|
||||
└── ...
|
||||
```
|
||||
`<package>` 即 `app.json` 的 `package` 字段(反域名权威标识,如 `os.meow.hello`);**目录名必须等于 package**,launcher 以 package 为 app_id,缺失时回退目录名。
|
||||
|
||||
### 2.1 app.json 字段
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Hello App",
|
||||
"exec": "/usr/data/mnt/sd_0/MeowAPPs/hello/hello",
|
||||
"exec": "/usr/data/mnt/sd_0/MeowAPPs/os.meow.hello/hello",
|
||||
"package": "os.meow.hello",
|
||||
"version": "0.1",
|
||||
"author": "whoever"
|
||||
}
|
||||
@@ -64,11 +66,12 @@
|
||||
|---|---|---|
|
||||
| `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 不解析 |
|
||||
|
||||
- 目录扫描深度 1 级:只枚举 `MeowAPPs/` 下的直接子目录
|
||||
- 应用计数上限 **8**(超出忽略;单屏 8 行)
|
||||
- app.json 解析器极简(launcher 内实现):仅匹配 `"name":` 与 `"exec":` 后的引号字符串,不做 JSON 校验(多行/单行均可)
|
||||
- app.json 解析器极简(launcher 内实现):仅匹配 `"name":`、`"exec":`、`"package":` 后的引号字符串(及扩展 icon/framework/immersive/route./`awake.<id>`(keep_awake)/service.),不做 JSON 校验(多行/单行均可)[源:审计 2026-08-30]
|
||||
- 列表刷新时机:每次菜单打开时重新扫描(TF 卡热插拔后立即可见)
|
||||
|
||||
### 2.2 边界情况行为(launcher 实现,全部真机验证)
|
||||
@@ -92,7 +95,7 @@
|
||||
### 3.1 启动流程(meow_launcherd 侧)
|
||||
|
||||
```
|
||||
热键(按住电源 + 单击音量减;电源按下后 300ms~2.5s 内收到音量减按下边沿触发)
|
||||
热键(按住电源 + 单击音量减;电源按下后 60ms~2.5s 内收到音量减按下边沿触发;v6.7 起窗口下限由 300ms 改为 60ms,窗口 60–2500ms)
|
||||
→ meow_launcherd 检测(EVIOCGKEY 状态轮询,10ms;电源按下即 arm,窗口外或松开即 disarm)
|
||||
→ SIGSTOP hiby_player(/proc/N/exe == /usr/bin/hiby_player;等待状态 T)
|
||||
→ 背光仅在面板灭时拉回(brightness==0 才写 saved/60,绝不无脑拉亮度)+ unblank 面板(先 SIGSTOP 再 unblank)→ fb0 直绘应用列表
|
||||
@@ -188,7 +191,7 @@
|
||||
- **⚠️ 应用启动后须防 goodix 幽灵触摸**(v6.8,Bug 2 根因):goodix 在启动触摸的尾部发出一段幽灵触摸(实测启动后 1.2-2.25s,§18.16),无防护时应用会**误把幽灵当下按而立即退出画 BYE**,且 launcher 菜单会把同一幽灵重放成行点击而**重开应用**(用户看到「bye 后又回 hello 主界面、需再点一次」)。hello v6.8 增加 `COOLDOWN_MS=2500`:启动后前 2.5s 忽略一切按下边沿,只有用户**真正**的下按才触发退出。launcher 侧同步在应用退出后 drain + 冷却(见 §4.7)。
|
||||
- 沉浸应用写 `/tmp/meowapp_state`,处理 `SIGUSR1` 作为「返回事件」
|
||||
- 应用异常卡死 → 虚拟返回键(若可见)→ SIGKILL;沉浸态卡死 → 音量减连按 3 次(强杀序列)
|
||||
- **应用日志**:launcher 通过环境变量 `MEOW_LOG_DIR` 告知 TF 卡日志目录(无卡时不设),应用自行决定文件名(示例 hello 写 `hello.log`);启动时先 drain 输入队列、只响应"按下边沿"退出(释放事件/轨迹事件忽略)
|
||||
- **应用日志**:launcher 通过环境变量 `MEOW_LOG_DIR` 告知 TF 卡日志目录(无卡时不设),应用自行决定文件名(示例 hello 写 `apps/<app_id>/logs/<ts>_<pid>.log`;[源:审计 2026-08-30]);启动时先 drain 输入队列、只响应"按下边沿"退出(释放事件/轨迹事件忽略)
|
||||
|
||||
### 3.6 应用运行期卡移除(M2.11 最佳努力)
|
||||
|
||||
@@ -232,11 +235,11 @@
|
||||
| 下一曲 | event2 | 163 | (未用) |
|
||||
| 上一曲 | event0 | 165 | (弃用——GPIO PC28 硬件链断,§18.12) |
|
||||
|
||||
**热键判定(v6.5 定案)**:**按住电源 → 电源按下后 300ms~2.5s 内单击音量减**(在窗口内收到音量减的**按下边沿**且电源仍被按住)⇒ 开菜单。电源按下会触发播放器息屏流程(**已接受的副作用**,用 v6.2/v6.3 已验证时序保证菜单可见:SIGSTOP 播放器 → unblank 面板 → 仅灭屏时拉背光);音量减单击副作用 = **音量 -1**(可接受)。电源松开或窗口超时(>2.5s)即 disarm;音量减在窗口外(<300ms 或 >2.5s)按下视为普通音量键,不触发。**纯单键序列**(v6 volup×3)与组合键(上一曲+音量加,GPIO 断,§18.12)均已退役,仅保留在 `meow.conf hotkey=seq`(历史备选,不推荐)。
|
||||
**热键判定(v6.5 定案;v6.7 起窗口下限 300ms→60ms)**:**按住电源 → 电源按下后 60ms~2.5s 内单击音量减**(在窗口内收到音量减的**按下边沿**且电源仍被按住)⇒ 开菜单。电源按下会触发播放器息屏流程(**已接受的副作用**,用 v6.2/v6.3 已验证时序保证菜单可见:SIGSTOP 播放器 → unblank 面板 → 仅灭屏时拉背光);音量减单击副作用 = **音量 -1**(可接受)。电源松开或窗口超时(>2.5s)即 disarm;音量减在窗口外(<60ms 或 >2.5s)按下视为普通音量键,不触发。**纯单键序列**(v6 volup×3)与组合键(上一曲+音量加,GPIO 断,§18.12)均已退役,仅保留在 `meow.conf hotkey=seq`(历史备选,不推荐)。
|
||||
|
||||
热键 `meow.conf` 配置:
|
||||
```
|
||||
hotkey=power_voldown # 默认:电源按住 + 单击音量减(300-2500ms 窗口)
|
||||
hotkey=power_voldown # 默认:电源按住 + 单击音量减(60-2500ms 窗口;v6.7 起下限 300ms→60ms)
|
||||
hotkey=seq # 历史序列热键(单键连按 N 次,不推荐)
|
||||
```
|
||||
(`hotkey_seq=`/`hotkey_seq_gap=` 仅在 `hotkey=seq` 时生效。)
|
||||
@@ -269,12 +272,12 @@ meow_launcherd --sim-exit N # 菜单打开 N 毫秒后模拟退出
|
||||
|
||||
### 4.5 统一日志系统(MeowAPPs 组件共用)
|
||||
|
||||
- **默认位置**:TF 卡 `/usr/data/mnt/sd_0/MeowAPPs/logs/meow_<boot时间戳>.log`(如 `meow_20260828_020123.log`;boot 时间戳 = 当前墙钟 − /proc/uptime,同一 boot 会话内多次启动共用同一文件)
|
||||
- **默认位置**:TF 卡 `/usr/data/mnt/sd_0/MeowOS/logs/meow_<bootts>.log`(如 `meow_20260828_020123.log`;`bootts` = 当前墙钟 − /proc/uptime,同一 boot 会话内多次启动共用同一文件)。**系统日志**(launcher/watchdog 等 MeowOS 组件)写此文件;**应用日志**另按 `apps/<app_id>/logs/<ts>_<pid>.log` 分文件(见本 §4.5「组件环境变量」)。⚠️ `meow_bootmenu` 仍用 `MeowAPPs/logs`(代码侧不一致;bootmenu 与 launcher 日志目录**待统一为 `MeowOS/logs`**,[源:审计 2026-08-30])
|
||||
- **无 TF 卡 / 卡晚挂载(S90 早于卡挂载)**:**开不了卡日志**——日志落 **/tmp 启动缓冲**(`/tmp/meow_boot.log`,上限 256KB 滚动),**绝不写板载存储**(/usr/data 只剩 ~10MB);**卡出现后自动迁移**(主循环 ~1s 周期重试 + 输入设备重试循环内也检查;无需开菜单)——`log_poll_card()` 打开卡日志并把 /tmp 缓冲整段搬入后删除 /tmp 文件
|
||||
- **容量上限**:logs/ 目录总量 1GB,开机时超限按 mtime 删最旧
|
||||
- **组件环境变量**:
|
||||
- `MEOW_LOG_FILE` → meow_watchdog:追加写同一 boot 日志文件(无该变量则走 stderr)
|
||||
- `MEOW_LOG_DIR` → 应用:日志目录(示例 hello 写 `<dir>/hello.log`)
|
||||
- `MEOW_LOG_DIR` → 应用:日志目录(每 App `MeowOS/logs/apps/<app_id>/logs/`,应用写 `<ts>_<pid>.log`;[源:审计 2026-08-30])
|
||||
- 内容:时间戳 + 全部按键边沿/菜单/应用事件(真机按键证据)
|
||||
- PID 文件:`/usr/data/meow_launcherd.pid`;播放器发现:扫描 `/proc/N/exe` == `/usr/bin/hiby_player`
|
||||
|
||||
@@ -319,7 +322,7 @@ meow_launcherd --sim-exit N # 菜单打开 N 毫秒后模拟退出
|
||||
> 所有设备操作遵守纪律:动播放器前数实例;重启前 `rm -f /data/recovery_all`;息屏测试后恢复背光;结束恢复设备干净。
|
||||
|
||||
0. **轮前检查**:`ls /data/recovery_all`(存在即删+告警);`ps | grep hiby_player | wc -l` 应=1。
|
||||
1. **推送**:`meow_launcherd/meow_launcherd` → `/data/meow_launcherd`(测试期直接跑 `/data/...`);`meow_watchdog` → `/usr/data/meow_watchdog`;`hello` → `/usr/data/mnt/sd_0/MeowAPPs/hello/hello`。
|
||||
1. **推送**:`meow_launcherd/meow_launcherd` → `/data/meow_launcherd`(测试期直接跑 `/data/...`);`meow_watchdog` → `/usr/data/meow_watchdog`;`hello` → `/usr/data/mnt/sd_0/MeowAPPs/os.meow.hello/hello`。
|
||||
2. **验证输入路径**(无物理按键时的替代证据):
|
||||
- `meow_launcherd --scan` → 列出应用
|
||||
- `meow_launcherd --dumpkeys 6000` + 物理按键 → 日志出现 `key VOL_DOWN/VOL_UP DOWN/UP`
|
||||
@@ -350,20 +353,22 @@ meow_launcherd --sim-exit N # 菜单打开 N 毫秒后模拟退出
|
||||
### 1. 应用目录结构
|
||||
|
||||
```
|
||||
MeowAPPs/<包名>/
|
||||
├── app.json # 应用配置(名称/exec/路由/图标/框架声明等)
|
||||
MeowAPPs/<package>/ # 目录名 = app.json 的 package(权威 app_id)
|
||||
├── app.json # 应用配置(name/exec/package/路由/图标/框架声明等)
|
||||
├── meow # 程序主体(静态 MIPS 二进制;也可多文件/脚本)
|
||||
└── <资源文件/图标…> # 只读程序资源
|
||||
|
||||
MeowData/<包名>/
|
||||
MeowData/<package>/
|
||||
├── data/ # 持久应用数据(配置、播放列表、登录态…)
|
||||
└── cache/ # 缓存(可清)
|
||||
```
|
||||
|
||||
> `<package>` = `app.json` 的 `package`(反域名,如 `os.meow.hello`),与目录名一致;launcher/app 数据/日志/`.mpk` 均以它为包名。
|
||||
> 注:TF 卡为 exFAT,**不支持符号链接**,故数据目录不用链接,改由 MeowOS 通过**环境变量**注入(见 §2)。
|
||||
|
||||
### 2. 数据目录(MeowOS 负责,用环境变量注入)
|
||||
|
||||
- 本文档 `<包名>` = `app.json` 的 `package`(反域名权威标识,如 `os.meow.hello`),与目录名一致。
|
||||
- **程序主体 + 必要配置文件** 放 `MeowAPPs/<包名>/`(可替换/可升级)。
|
||||
- **软件数据** 放 `MeowData/<包名>/{data,cache}`(独立于程序,重装/升级保留数据)。
|
||||
- **MeowOS 每次启动应用前**:验证 `MeowData/<包名>/{data,cache}` 存在(否则建)。
|
||||
@@ -376,6 +381,7 @@ MeowData/<包名>/
|
||||
|
||||
### 3. 软件包 `.mpk`
|
||||
|
||||
- **包名 = 文件名茎 = `app.json` 的 `package`**(如 `os.meow.hello` → `os.meow.hello.mpk`)。
|
||||
- **格式**:`.mpk` = tar.gz(含 `app.json` + `meow` 二进制 + 资源),**不含 data/cache**(运行时按设备生成)。
|
||||
- **导出**:打包 `MeowAPPs/<包名>/`(**不含 data/cache 目录**)→ `<包名>.mpk`。
|
||||
- **导入/安装**(MeowOS 软件包安装程序 `meow_pkg_install()`):
|
||||
@@ -392,8 +398,8 @@ MeowData/<包名>/
|
||||
|
||||
### 5. 软件包管理器 CLI `nyai`(静态 MIPS,apt/yum 风格,含镜像源)
|
||||
|
||||
`nyai` 是 MeowOS 的包管理 CLI(静态 MIPS32r2/musl,无外部依赖;tar.gz 用 `gzip -dc | tar -x` 管道,与 launcher 一致)。**部署**:`MeowOS/opt/bin/nyai`(卡,随 TF_CARD_LAYOUT 外围工具目录)。
|
||||
**调用**:当前固件(M2.11,无 `/etc/profile.d/meow_card_path.sh`)SSH 需绝对路径
|
||||
`nyai` 是 MeowOS 的包管理 CLI(静态 MIPS32r2/musl,无外部依赖;tar.gz 用 `gzip -dc | tar -x` 管道,与 launcher 一致)。**包名 `<pkg>` = `app.json` 的 `package`(= `.mpk` 文件名茎 = 目录名)**。**部署**:`MeowOS/opt/bin/nyai`(卡,随 TF_CARD_LAYOUT 外围工具目录)。
|
||||
**调用**:M2.12+ 固件 `meow_card_path.sh` 已将 `MeowOS/opt/bin` 前插 PATH,`nyai` 可直接调用;更早固件(M2.11 及以前,无 `/etc/profile.d/meow_card_path.sh`)SSH 需绝对路径[源:审计 2026-08-30]
|
||||
`/usr/data/mnt/sd_0/MeowOS/opt/bin/nyai` 或 `export PATH=/usr/data/mnt/sd_0/MeowOS/opt/bin:$PATH`;
|
||||
M2.12+ 固件该目录已由 `meow_card_path.sh` 前插,`nyai` 可直接调用。
|
||||
|
||||
@@ -426,7 +432,7 @@ file:///usr/data/mnt/sd_0/MeowOS/opt/repo # file:// 等价本
|
||||
**索引 `Packages`**(`nyai index <dir>` 生成,行式、空行分隔记录):
|
||||
|
||||
```
|
||||
Package: simtest # 包名 = .mpk 文件名茎
|
||||
Package: simtest # 包名 = .mpk 文件名茎 = app.json.package
|
||||
Version: 1.2.3 # 来自该 .mpk 内 app.json
|
||||
Filename: simtest.mpk
|
||||
Size: 388 # 字节
|
||||
|
||||
Reference in new issue
Block a user