From 5aabede0cd19a1a9aa0742285d4667fdeaf1bdd1 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Tue, 1 Sep 2026 18:09:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(launcher):=20M4=20=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=BF=9D=E6=B4=BB+=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E6=92=AD=E6=94=BE=EF=BC=88FRAMEWORK=5FDESIGN=20=C2=A75/=C2=A79?= =?UTF-8?q?=20=E8=90=BD=E5=9C=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - app.json 新字段 background/background_audio 解析入 struct app/meow_acct 注册表 - meow_ipc.h:MSG_REGISTER(m_register_t)/SERVICE_OK(m_ack_t.status=pid)/SERVICE_STOP/ MSG_SYS(m_sys_t, SHUTDOWN=1/SVC_DEAD=2) 负载结构落地 - 新模块 meow_bgplay.c/h(自包含+ops 注入,仿 meow_media,宿主可单测): · 后台播放保活——声明 background_audio 且媒体会话 PLAYING 的 App nav-exit 不终止, 进程+音频流保留;UI 冻结走 §10.5 /tmp/meow_notif_active SDK present 自抑(非字面 SIGSTOP:冻结同进程播放线程断供 PCM,§10.5 真机实证);点图标/媒体卡片回前台= 原进程恢复(chain/picker 忽略),停播后再退出=真退 SIGTERM · 无头后台服务——MSG_REGISTER spawn/stop/reap + 退避重启 1/2/4/10s cap + max_restart 熔断(清该 App 通知 + 注册连接广播 MSG_SYS{SVC_DEAD},重注册复位) · 卡拔例外(卡上二进制后台 App/服务仍 SIGTERM 防 SIGBUS)、崩溃照收、 关机前 meow_bgplay_kill_all 有界回收(含 MSG_SYS{SHUTDOWN} 广播) - util.c:MSG_REGISTER/MSG_SERVICE_STOP 分发(权限/声明校验链)+ ipc_conn_alive 连接 存活查询 + meow_ipc_process 末尾挂 meow_bg_housekeep(drain/reap/退避 tick) - app_launcher.c:launch_app_chain 入口 resume(bg_take 原进程回前台)+ nav-exit 保活分支 + 转后台出口(杀看门狗/写自抑标记/复位顶条,跳过退出尾)+ 冷启动自动 拉起静态 keepalive(mode=0) 服务(exec 路径约定=App 同目录 文件) - main_menu.c:应用列表「·后台」标注(宫格/列表,1s tick 按 change_seq 刷新)+ 两条退出尾 kill_all + unlink NOTIF_ACTIVE - 宿主单测 test_bgplay.c 50 项全过(真 fork 子进程走状态机 + 假时钟退避熔断); test_media/test_notif_panel/test_notif_tf/test_vol_ramp_jack 回归全过; zig-mipsel-cc -Wall -Wextra 0 warning。launcher md5=c07d011c0769fca14d3bfb752d735463 --- FRAMEWORK_DESIGN.md | 5 +- docs/MEOWOS_SPEC_REF.md | 8 +- patch_v2/meow_launcherd/app_launcher.c | 283 +++++++++- patch_v2/meow_launcherd/build_launcher.sh | 2 +- patch_v2/meow_launcherd/main_menu.c | 25 +- patch_v2/meow_launcherd/meow_bgplay.c | 509 ++++++++++++++++++ patch_v2/meow_launcherd/meow_bgplay.h | 139 +++++ patch_v2/meow_launcherd/meow_ipc.h | 39 +- .../meow_launcherd/meow_launcher_internal.h | 23 + patch_v2/meow_launcherd/meow_launcherd | Bin 590156 -> 603308 bytes patch_v2/meow_launcherd/test_bgplay.c | 376 +++++++++++++ patch_v2/meow_launcherd/util.c | 90 ++++ scripts/build/fw_content.conf | 2 +- 13 files changed, 1461 insertions(+), 40 deletions(-) create mode 100644 patch_v2/meow_launcherd/meow_bgplay.c create mode 100644 patch_v2/meow_launcherd/meow_bgplay.h create mode 100644 patch_v2/meow_launcherd/test_bgplay.c diff --git a/FRAMEWORK_DESIGN.md b/FRAMEWORK_DESIGN.md index 044fe32..ac0848a 100644 --- a/FRAMEWORK_DESIGN.md +++ b/FRAMEWORK_DESIGN.md @@ -1,6 +1,6 @@ # MeowOS 阶段 D:Activity / 通知 IPC 框架设计文档 -> 状态:协议/架构参考稿(2026-08-28 起草;**以下协议已随 M2.15-M2.96 各里程碑落地**,消息号以 `patch_v2/meow_launcherd/meow_ipc.h` 为准)。本阶段的「只设计、不实现」为起草期口径;M0-M3/M5/§10.5/媒体会话/amsd/meow_audiod(独占音频守护,规范 `devdocs/plan/AUDIOD_DESIGN.md`)已实现,M4 后台服务保活与 M6 加固待排期(见 §9 进度)。 +> 状态:协议/架构参考稿(2026-08-28 起草;**以下协议已随 M2.15-M2.96 各里程碑落地**,消息号以 `patch_v2/meow_launcherd/meow_ipc.h` 为准)。本阶段的「只设计、不实现」为起草期口径;M0-M3/M5/§10.5/媒体会话/amsd/meow_audiod(独占音频守护,规范 `devdocs/plan/AUDIOD_DESIGN.md`)已实现,**M4 后台服务保活+后台播放已落地(2026-09-01,见 §9 进度)**,M6 加固待排期。 > 前置:ANALYSIS.md §18(Launcher 全架构)、§11(播放器 unix socket 先例)、APPS.md、DEVELOPMENT_PLAN.md 阶段 0/D。 > 实现语言:启动器 C(musl 静态 MIPS32r2,zig-mipsel-cc);应用同为 C 静态 MIPS。 > 补充:本文件由 plan 子代理产出设计,主会话落盘,并附「后台运行/后台播放权限」(用户追加)。 @@ -117,7 +117,8 @@ 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 ]`。验证:`meow_ipc hello`→ACK、播放器不动(MeowOS 模式下无播放器即满足)。 - ✅ **M1 路由表 + 解析**(0.7.10,M2.15):`app.json` 扁平行 `route.=path` / `framework=true` / `service.=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 ` 返回链路(qemu + 真机 MeowOS 模式均通)。 -- ✅ **M2 通知存储+分发**、**M3 导航+前台会话改造+看门狗返回**、**M5 通知中心 UI 整合**(详见下,M2.65-M2.82 已落地);⬜ **M4 后台服务保活**(`MSG_REGISTER` 后台服务登记)、**M6 加固**:待排期。 +- ✅ **M2 通知存储+分发**、**M3 导航+前台会话改造+看门狗返回**、**M5 通知中心 UI 整合**(详见下,M2.65-M2.82 已落地);✅ **M4 后台服务保活**(2026-09-01 落地,见下);⬜ **M6 加固**:待排期。 + - **M4 已落地(2026-09-01)**:`app.json` 新增 `background`/`background_audio` 解析入注册表(`struct app`/`meow_acct` 同名字段);`MSG_REGISTER`/`MSG_SERVICE_OK`/`MSG_SERVICE_STOP`/`MSG_SYS` 负载结构落地(`m_register_t`/`m_service_stop_t`/`m_sys_t`,MEOW_SYS_SHUTDOWN=1/SVC_DEAD=2);新模块 `meow_bgplay.c/h`(自包含+ops 注入,宿主可单测):**后台播放保活**——声明 `background_audio` 且媒体会话 PLAYING 的 App nav-exit 时**不终止**,进程+音频流保留(UI 冻结走 §10.5 `/tmp/meow_notif_active` SDK present 自抑,**非字面 SIGSTOP**:冻结同进程播放线程会断供 PCM,§10.5 真机实证),点图标/媒体卡片回前台=原进程恢复(chain/picker 忽略),停播后再退出=真退 SIGTERM;**无头后台服务**——MSG_REGISTER spawn/stop/reap + 退避重启 1/2/4/10s cap + `max_restart` 熔断(清该 App 通知 + 注册连接广播 MSG_SYS{SVC_DEAD},重注册复位熔断);卡拔例外(二进制在卡上的后台 App/服务仍 SIGTERM 防 SIGBUS)、崩溃照收、关机前 `meow_bgplay_kill_all` 有界回收(含 MSG_SYS{SHUTDOWN} 广播);主界面应用列表「·后台」标注(1s tick 按 change_seq 刷新);tick 挂载点=`meow_ipc_process` 末尾(主循环单写者排空点)。宿主单测 `test_bgplay.c` 50 项全过;amsd 侧 BG 状态展示=§6.3 顺延。 - **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 关面板不动作);裸 App 兼容。 - **amsd(一期 agent-212 · 5fbf307 + 二期 agent-225)已落地**:活动管理器守护(svcd 托管 `trigger=boot`)+ `am` CLI(status/list/history/start/kill/`resolve`/`picker`)。二期将路由表迁 amsd(amsd 路由权威)+ **picker 契约**(`MSG_PICKER_CALL=0x70`/`MSG_PICKER_RESULT=0x71`,`am picker`/`picker-status`;files_app 注册 `picker.pick_file` 选文件返回路径)+ `MSG_AMS_START/KILL=0x00A0/0x00A1`(amsd→launcher 决策执行)。参见 `devdocs/plan/AMSD_DESIGN.md`。 - **M5 通知中心 UI 整合已落地(M2.65-M2.81)**:通知中心 + 媒体卡片 + Now Playing(媒体会话见附录 B,已落地:`meow_media.c` 最近活跃源、30s 超时回收、`MSG_META`/`MSG_PLAYCTL`)。 diff --git a/docs/MEOWOS_SPEC_REF.md b/docs/MEOWOS_SPEC_REF.md index b1fcb22..05002fb 100644 --- a/docs/MEOWOS_SPEC_REF.md +++ b/docs/MEOWOS_SPEC_REF.md @@ -57,7 +57,7 @@ ### 2.2 meow_ipc 消息协议(AF_UNIX,全小端 LE) - 帧头 16B:`magic=0x4D4F5701`('MEOW'|1)/`version=1`/`type`/`req_id`/`len`;`len` 上限 **MEOW_IPC_MAX=4096**;列表编码 `[u16 count]`+NUL 串 `[FRAMEWORK_DESIGN §1]` -- 消息类型:`MSG_HELLO 0x0001↑ / ACK 0x0002↓ / ERR 0x0003↓ / REGISTER 0x0010↑ / SERVICE_OK 0x0011↓ / SERVICE_STOP 0x0012↑ / MSG_NOTIFY 0x0020↑ / NOTIFY_ACK 0x0021↓ / NOTIFY_DISMISS 0x0022↑ / NOTIFY_LIST 0x0023↓ / NOTIFY_PROGRESS 0x0024↑ / ACT_DECLARE 0x0030↑ / ACT_QUERY 0x0031↑ / ACT_RESULT 0x0032↓ / ACT_FOCUS 0x0033↑ / ACT_BACK 0x0034↑ / NAV 0x0040↑ / SHOW_ACTIVITY 0x0041↓ / PERF_QUERY 0x0050↑ / PERF_RESULT 0x0051↓ / POWER_ACTION 0x0060↑ / POWER_STATUS 0x0061↓ / SYS 0x00F0↓` `[FRAMEWORK_DESIGN §1][meow_ipc.h]` +- 消息类型:`MSG_HELLO 0x0001↑ / ACK 0x0002↓ / ERR 0x0003↓ / REGISTER 0x0010↑(M4 已落地:无头后台服务注册,m_register_t,保持连接)/ SERVICE_OK 0x0011↓(M4:m_ack_t status=服务 pid)/ SERVICE_STOP 0x0012↑(M4:SIGTERM 不重启)/ MSG_NOTIFY 0x0020↑ / NOTIFY_ACK 0x0021↓ / NOTIFY_DISMISS 0x0022↑ / NOTIFY_LIST 0x0023↓ / NOTIFY_PROGRESS 0x0024↑ / ACT_DECLARE 0x0030↑ / ACT_QUERY 0x0031↑ / ACT_RESULT 0x0032↓ / ACT_FOCUS 0x0033↑ / ACT_BACK 0x0034↑ / NAV 0x0040↑ / SHOW_ACTIVITY 0x0041↓ / PERF_QUERY 0x0050↑ / PERF_RESULT 0x0051↓ / POWER_ACTION 0x0060↑ / POWER_STATUS 0x0061↓ / SYS 0x00F0↓(M4:m_sys_t,SHUTDOWN=1/SVC_DEAD=2 熔断广播)` `[FRAMEWORK_DESIGN §1][meow_ipc.h]` - 媒体:`MSG_META`(元数据)、`MSG_PLAYCTL`(cmd 1=播放2=暂停3=上一首4=下一首5=seek6=播放/暂停toggle——物理键164恒发6由源侧按当前态翻转,launcher 透传)、`MSG_PROGRESS` `[附录 B]` - IPC 线程**只读帧+解析+入队**;状态变更主循环单写者(eventfd 唤醒,10ms 热键轮询非阻塞排空)`[FRAMEWORK_DESIGN §0][§6]` @@ -152,7 +152,7 @@ - `meow_settings_*`(设置后端,已定)/`meowcli`/`meow_sys_devattr`/`meow_devattr_set` `[MEOWOS_API]` - **独占音频守护 `meow_audiod`(M2.90 已落地,规范 `devdocs/plan/AUDIOD_DESIGN.md`)**:板载 `/usr/bin/meow_audiod`,svcd 托管(板载 `services.d/audiod.conf`,trigger=manual;launcher 确认 MeowOS 模式后拉起;**启动门控:mode≠meow → exit(0),HibyOS 下不存在**)。IPC `/usr/data/meow_audio.sock`(帧层复用 meow_ipc.h,号段 0x00C0-0x00CA:OPEN/OPEN_ACK/WRITE/PAUSE/RESUME/STOP/PREEMPTED/QUERY/STATE/ROUTE/VOLUME)。**独占+抢占**(后开赢,旧流收 PREEMPTED;socket EOF=回收;软混音已否决,留接口位)。**DAC 原生率跟随不做 SRC**;格式归一 S16 直通/S32 升位/mono 复制;切率 mute-重配-恢复。**meow_route 已并入为路由线程并退役独立服务**(⚠️ 退役服务要清板载+TF 双源 conf,否则旧 conf 会双写路由)。**CLI `meow_audio`**(root 免鉴权):`status`/`tone [freq] [ms] [rate]`(正弦测试音,排查无声不开 App)/`route <0|2|3>`/`vol [0-100]`。SDK 客户端 `meow_audio_open/write/pause/close/query/on_preempt`(`meow_ui_audio.c`,懒连接+EPIPE 标死;无 audiod → -ENOENT 不隐式直开,`MEOW_AUDIO_DIRECT=1` 仅调试)。**M2.91-97 加固批**:①**开机武装 hbc3000 FPGA**(M2.91:路由线程启动无条件写 Output Port Switch 4.4→3/3.5→2/无→4,同值先写 5 强制重烧——根治「未烧 FPGA 时 PCM 第二次 `hbc3000_start` 内核硬挂死」,调查底稿 `devdocs/plan/AUDIO_HANG_INVESTIGATION.md`)②**长流护栏**(M2.93:ring 有界等待/cond timedwait/popen 有界收割/O_NONBLOCK+poll 写/wedge 自救/心跳 watchdog)+**几何收窄 period=1024×4**(M2.94:驱动默认巨 buffer 致桥周期中断稀缺 wedge、播 ~12s 停摆;tonepcm2 矩阵 60s 零 stall 实证)③**音量反转**(M2.95:CS43198 音量寄存器=衰减量,四路统一 `dac=255-pct*255/100`)④**炸耳安全**(M2.96:`dac_vol_mute` 写 255 真静音,旧写 0=最大响度)⑤**电平监控**(261,待 M2.97 固件化:播放线程 ~100ms 窗口整数 RMS/peak dBFS(deci-dB,逐帧判边界,-990=-inf)、`MSG_AUDIO_STATE` 追加 `rms=/peak=/lvlseq=`(ABI 兼容)、流活跃时 1s 节拍写 TF `MeowOS/logs/audio_monitor_.log`、CLI `meow_audio monitor [秒]` 文本电平条)。`[patch_v2/meow_audiod/]` - **音频硬件事实(sndprobe/tonepcm2 真机实测,2026-08-31)**:播放 PCM = `/dev/snd/pcmC0D0p`(`cs43198-hifi-0`);`pcmC0D1p`=snd-soc-dummy(勿用)。能力:S16_LE/S24_LE、1-2ch、8k-768k、buffer 2048-1048576 帧、period 512-262144。⚠️ **ALSA UAPI 两坑**(ncm 无声根因,勿再踩):①hw_params 必须「全放行」初始化(mask 全 1、interval [0,UINT_MAX],params_any 语义)再收窄——memset 0 的 interval=「只能取 0」求交必空 → HW_PARAMS 恒 EINVAL;②access/format/subformat mask 必须**先清零再单点**——留全 1 会被内核 choose 成 MMAP_INTERLEAVED,ch>1 时 write 恒 EINVAL。**CS43198 音量寄存器=衰减量(官方数据手册 DS1039 实证,用户供)**:PCM_VOLUME_A/B(0x0B/0x0C),0=0dB 满幅最大声、255=-127.5dB≈静音(0.5dB/步;DSD 通道独立 DSD_VOLUME_A/B)。**混音器 L/R Playback Volume 读回恒 0 是死镜像**(官方播放器走 sa_hgl_dma 硬直通不经此控制,HibyOS 对照实测同读 0),勿据此判音量。**音量寄存器=衰减量(0=最响 255=静音,M2.95 真机实测方向)**:四路(launcher/audio.c+audiod+watchdog+SDK vol)统一 `dac=255-pct*255/100`;mute 必须写 255 真静音(M2.96 炸耳修复)。混音器清单:numid=1/2 L/R Vol、3 Mute Output、4 Digital Filter、5 Soft Mute、6 NOS_EN、7 DRE_EN、8 Balance Lineout En、9 Output Port Switch(0 空闲/1 lineout/2 3.5/3 4.4/4 SPDIF;0 危险勿写;**5 = audiod 内部「强制重烧 FPGA」约定值**(M2.91 开机武装同值改写路径),非常规路由值,App/面板勿写)、10 DOP_EN。`[patch_v2/tools/sndprobe.c][tonepcm2.c][APPS §3.7]` -- 后台权限:`MSG_HELLO/MSG_REGISTER.flags` 扩展 `MF_BACKGROUND`/`MF_PLAYBACK`;`PERF_BACKGROUND`/`PERF_AUDIO_BACKGROUND`(规划)`[FRAMEWORK_DESIGN 附录 A]` +- 后台权限:`MSG_HELLO/MSG_REGISTER.flags` 扩展 `MF_BACKGROUND`/`MF_PLAYBACK`(**已落地 M4**:app.json `background`/`background_audio` 字段 + MSG_REGISTER 校验链;播放中退出转后台保活见 FRAMEWORK_DESIGN §9);`PERF_BACKGROUND`/`PERF_AUDIO_BACKGROUND`(规划)`[FRAMEWORK_DESIGN 附录 A]` --- @@ -215,7 +215,7 @@ - `/` = 程序主体+app.json+资源;`MeowData//{data,cache}` = 数据;首次启动自动建 data/cache 并经 env 注入,exFAT 无软链 `[APPS 附录 §1/§2]` - `.mpk` = tar.gz(app.json + meow 二进制 + 资源),**不含 data/cache**;导入校验 app.json/哈希→解压→数据 init→登入列表 `[APPS 附录 §3]` - 包管理 **CLI `nyai`**(静态 MIPS,部署 `MeowOS/opt/bin/nyai`):install/remove/list/info/search/index/export/upgrade/scan;源 `MeowOS/opt/nyai/sources.list`;索引 `Packages`(Package/Version/Filename/Size/SHA256/Depends/Description)`[APPS 附录 §5]` -- 应用数上限 **8**(单屏 8 行);扫描深度 1 级;`app.json` 字段:name(仅 ASCII)/exec(静态 MIPS32r2 ELF)/version/author + **`package`(反域名权威 app_id;==目录名;缺省回退目录名)** + 扩展 `framework`/`immersive`/`icon`/`route.`/`awake.`(keep_awake)/`service.`/`fullscreen`(app 级;`route..fullscreen`=activity 级;**本次实现**:launcher 启动/切 activity 据声明预设 SDK 全屏,见 §5.1/§3.1/§A-12)/`fonts`(字体档位 `"full"|"gbk"|"common"`,需大字库时声明,见 §5.7.8) `[APPS §2][MEOW_APP_SDK §9][FRAMEWORK_DESIGN §2][源:审计 2026-08-30][源:用户 2026-08-30]` +- 应用数上限 **8**(单屏 8 行);扫描深度 1 级;`app.json` 字段:name(仅 ASCII)/exec(静态 MIPS32r2 ELF)/version/author + **`package`(反域名权威 app_id;==目录名;缺省回退目录名)** + 扩展 `framework`/`immersive`/`icon`/`route.`/`awake.`(keep_awake)/`service.`(M4 起服务二进制=App 同目录 `` 文件)/**`background`/`background_audio`(M4 已落地:无头服务注册权限/后台播放保活)**/`fullscreen`(app 级;`route..fullscreen`=activity 级;**本次实现**:launcher 启动/切 activity 据声明预设 SDK 全屏,见 §5.1/§3.1/§A-12)/`fonts`(字体档位 `"full"|"gbk"|"common"`,需大字库时声明,见 §5.7.8) `[APPS §2][MEOW_APP_SDK §9][FRAMEWORK_DESIGN §2][源:审计 2026-08-30][源:用户 2026-08-30]` ### 5.6 冷启动充电屏 - 触发(**三者同时**):冷启动(`poweroff` 写 `/data/meow_cold_boot=1`;`reboot` 写 0)+ 在充电(AC online=1 或 battery status=Charging)+(开机瞬间一次性快照,判定后不回头)`[CHARGING_SCREEN §0]` @@ -350,7 +350,7 @@ ## 6. 标志性 TODO / 未决(文档未定,勿凭猜实现) - OPEN_QUESTIONS.md 待定 ❓:多数已由后续定案/落地覆盖——#1 背景图加载(「启动加载一次+预渲染快照不每帧缩放」已落地)、#2 图处理(**cover 居中裁剪**)、#3 叠加层颜色(**固定跟明暗主题**)、#4 背景色板枚举(**已清结**:MD3+MIUIx 色板 M2.90 落地,`display.background` 按 style×mode 派生)、#7 应用图标(**已做,app.json icon 加载缓存+首字母占位**)、#8 通知来源(**系统事件 + MeowAPP IPC + D-Bus 桥 三路**,中心 UI 已落地)、#9 下拉手势(**顶部下滑=通知中心**,与左滑返回按起始位置分流)、#10 通知存储(**TF 归档 CSV + 10MB 滚动 + 环形 200 条**)、#11 媒体活跃会话(**active_seq 最近活跃源,30s 超时回收**)、#12 多 app 音频(**已被 meow_audiod 取代(M2.90):守护独占 hw:0,0 + 抢占,App 经 SDK meow_audio_*,软混音否决**)、#13 web 实时画面(**`/api/screen.jpeg` + 增量帧**)、#14 输入注入(**本机触摸优先 5s 仲裁**)、#16 主页左滑=侧边栏 vs 返回(**Now Playing 横划页,左缘返回保留**)、#17 音频输出设置(**底层已由 audiod 收口:路由自动+CLI;设置页 UI 项留后续**)。**仍待定**:#5 浅色文字对比度(待实机观感验收)+ 2026-09-01 新增批(~~PCM 内核挂死~~**已根治**:M2.91 FPGA 开机武装 + M2.94 几何收窄/WiFi 录入 UI/amsd DECLARE 残余(`am start` ACK 后 launcher 未真拉起 App)/流媒体客户端出声终验(链路技术指标已全绿:FPGA 武装+几何+监控 hwrate 健康,待用户耳机终验)/流媒体客户端 UI 专项/感知音量曲线 dB taper) `[OPEN_QUESTIONS]` -- DEVELOPMENT_PLAN:**阶段 0(bootmenu 双系统)已落地(现网即运行中)**;阶段 B/E/F 达成;阶段 D M0-M3/M5 已落地、**M4 后台服务保活 / M6 加固 待排期** `[DEVELOPMENT_PLAN]` +- DEVELOPMENT_PLAN:**阶段 0(bootmenu 双系统)已落地(现网即运行中)**;阶段 B/E/F 达成;阶段 D M0-M5 已落地(**M4 后台服务保活+后台播放 2026-09-01 落地**:MSG_REGISTER/SERVICE_STOP/MSG_SYS + 退避熔断 + nav-exit 后台保活,见 FRAMEWORK_DESIGN §9)、**M6 加固 待排期** `[DEVELOPMENT_PLAN]` - 未定/待拍板:MeowOS 音频输出设置(只读还是可配,OPEN_QUESTIONS #17);OTA 在线「检查更新/下载」依赖 MeowPanel(本地/检查升级已可用,URL 下载待定案 #18)`[WORK_STATE][OPEN_QUESTIONS #17/#18]` - **meow_svcd 后续(M2.54 已落地大部分)**:~~接入 supervisor 启动链~~(已改 `etc/init.d/S89meow_svcd` 开机自启;bootmenu/launcher `fork+exec`+`waitpid` 仍为备选);~~写 `MeowOS/services.d/mdnsd.conf` 落地 mDNS~~(已改**板载** `/usr/data/meow/services.d/mdnsd.conf` 预置,`trigger=boot`)。剩余:`cap` setcap 真机实装(cap_net_bind_service,cap_net_raw);`wifi-up` 判定收紧。**services.d/svcd 已接入开机链(S89)**,但真机行为待验证。 `[WORK_STATE][meow_svcd.md]` diff --git a/patch_v2/meow_launcherd/app_launcher.c b/patch_v2/meow_launcherd/app_launcher.c index 2b26e06..7aa047f 100644 --- a/patch_v2/meow_launcherd/app_launcher.c +++ b/patch_v2/meow_launcherd/app_launcher.c @@ -89,20 +89,27 @@ static void ams_report_launch(const struct app *a, const char *chain, pid_t pid) if (l > 0) ams_send(line, l); } -/* exit 上报:kind(exit|sig)/code/dur_ms。异常退出由 amsd 判 crash + 转发 meow_crash。 */ -static void ams_report_exit(const struct app *a, int status, long long dur_ms) +/* exit 上报:kind(exit|sig)/code/dur_ms。异常退出由 amsd 判 crash + 转发 meow_crash。 + * _id 变体供 M4 后台保活回收路径用(彼时 struct app 可能已不在手边)。 */ +static void ams_report_exit_id(const char *app_id, int status, long long dur_ms) { - if (!a) return; + if (!app_id || !app_id[0]) return; const char *kind; int code; if (WIFSIGNALED(status)) { kind = "sig"; code = WTERMSIG(status); } else { kind = "exit"; code = WIFEXITED(status) ? WEXITSTATUS(status) : 1; } char line[256]; int l = snprintf(line, sizeof line, "EV EXIT %s %s %d %lld %ld %ld\n", - a->id, kind, code, dur_ms, (long)time(NULL), ams_uptime()); + app_id, kind, code, dur_ms, (long)time(NULL), ams_uptime()); if (l > 0) ams_send(line, l); } +static void ams_report_exit(const struct app *a, int status, long long dur_ms) +{ + if (!a) return; + ams_report_exit_id(a->id, status, dur_ms); +} + /* ---- stdout/stderr 管道捕获(AMSD_DESIGN §5):前台 waitpid 循环排空 + 按行转发 ---- */ static char g_ams_out_line[1024]; /* 未完结行缓冲(无 \n) */ static int g_ams_out_n = 0; @@ -119,17 +126,17 @@ static void ams_out_flush(void) } /* 追加一行(line 为无 \n 的 NUL 串)到 flush 缓冲;满了先 flush。 */ -static void ams_out_line(const struct app *a, pid_t pid, const char *line) +static void ams_out_line(const char *app_id, pid_t pid, const char *line) { - if (!a || !line) return; + if (!app_id || !line) return; int need = snprintf(NULL, 0, "EV OUT %s %d %ld %ld %s\n", - a->id, (int)pid, (long)time(NULL), ams_uptime(), line); + app_id, (int)pid, (long)time(NULL), ams_uptime(), line); if (g_ams_out_flush_n + need + 1 > (int)sizeof g_ams_out_flush) ams_out_flush(); if (need < (int)sizeof g_ams_out_flush - 1 - g_ams_out_flush_n) g_ams_out_flush_n += snprintf(g_ams_out_flush + g_ams_out_flush_n, sizeof g_ams_out_flush - g_ams_out_flush_n, "EV OUT %s %d %ld %ld %s\n", - a->id, (int)pid, (long)time(NULL), ams_uptime(), line); + app_id, (int)pid, (long)time(NULL), ams_uptime(), line); } /* 单次排空上限:App 被 OOM/信号杀后,其子孙进程可能仍继承持有 out_pipe 写端 @@ -143,8 +150,11 @@ static void ams_out_line(const struct app *a, pid_t pid, const char *line) #define EXEC_CONFIRM_MS 2000 /* 排空读端尽可能多的字节,按行切分转发;超长行截断标记。有界:单次调用最多 - * 读 AMS_DRAIN_MAX 字节(见上)。读端已 O_NONBLOCK;App 死且写端全关 → read 返 0=EOF。 */ -static void ams_drain_stdout(const struct app *a, int fd, pid_t pid) + * 读 AMS_DRAIN_MAX 字节(见上)。读端已 O_NONBLOCK;App 死且写端全关 → read 返 0=EOF。 + * linebuf/line_n:未完结行缓冲外提——前台会话用全局 g_ams_out_line/g_ams_out_n; + * M4 后台保活 drain(meow_bg_housekeep)用独立缓冲,防与前台未完结行串扰。 */ +static void ams_drain_stdout(const char *app_id, int fd, pid_t pid, + char *linebuf, int *line_n) { char tmp[2048]; ssize_t n; @@ -155,19 +165,19 @@ static void ams_drain_stdout(const struct app *a, int fd, pid_t pid) for (ssize_t i = 0; i < n; i++) { char c = tmp[i]; if (c == '\n') { - g_ams_out_line[g_ams_out_n] = '\0'; - ams_out_line(a, pid, g_ams_out_line); - g_ams_out_n = 0; + linebuf[*line_n] = '\0'; + ams_out_line(app_id, pid, linebuf); + *line_n = 0; } else if (c == '\r') { /* 去尾 \r */ - } else if (g_ams_out_n < (int)sizeof g_ams_out_line - 1) { - g_ams_out_line[g_ams_out_n++] = c; + } else if (*line_n < 1024 - 1) { + linebuf[(*line_n)++] = c; } else { /* 超长行:截断标记 + 重置(当前字符丢弃) */ - g_ams_out_line[ (int)sizeof g_ams_out_line - 2 ] = '\0'; - ams_out_line(a, pid, g_ams_out_line); - ams_out_line(a, pid, "[...trunc]"); - g_ams_out_n = 0; + linebuf[1024 - 2] = '\0'; + ams_out_line(app_id, pid, linebuf); + ams_out_line(app_id, pid, "[...trunc]"); + *line_n = 0; } } if (drained >= AMS_DRAIN_MAX) break; /* 有界:孤儿持续写也不卡死主循环 */ @@ -311,6 +321,8 @@ static void meow_acct_sync(const char *app_id, const struct app *ap) struct meow_acct *a = meow_acct_upsert(app_id); if (!a) return; a->framework = ap->framework; + a->background = ap->background; /* M4 */ + a->background_audio = ap->background_audio; strncpy(a->icon, ap->icon, 128); strncpy(a->name, ap->name, 16); strncpy(a->exec, ap->exec, 128); @@ -361,6 +373,119 @@ void meow_acct_declare(const char *app_id, const char *entries, int count) } +/* ---- M4 后台保活 / 无头后台服务胶水(meow_bgplay ops 注入实现)---- + * 挂载:meow_bgplay_launcher_init() 由 util.c meow_ipc_init 末尾调一次; + * meow_bg_housekeep() 挂 meow_ipc_process 末尾(主循环单写者排空点,四处循环都经它)。 */ +static void notify_app_crash(const char *pkg, int status); /* 定义见下(MEOW_CRASH_SOCK) */ + +/* 查静态声明的 service.(app.json 解析进 meow_acct.svcs);无返回 NULL。 */ +const struct meow_svc *meow_acct_svc_find(const struct meow_acct *ac, const char *svc) +{ + if (!ac || !svc || !svc[0]) return NULL; + for (int i = 0; i < ac->nsvc; i++) + if (!strcmp(ac->svcs[i].name, svc)) return &ac->svcs[i]; + return NULL; +} + +/* 后台权限位:bit0=background(可注册无头服务)bit1=background_audio(后台音频)。 */ +int meow_acct_background_perm(const struct meow_acct *ac) +{ + if (!ac) return 0; + return (ac->background == '1' ? 1 : 0) | (ac->background_audio == '1' ? 2 : 0); +} + +/* M4 服务可执行路径约定:App 二进制同目录下的 名文件 + * (app.json `service.=...` 只声明策略,二进制位置由此约定派生)。 */ +void meow_svc_exec_path(const char *app_exec, const char *svc, char *out, int olen) +{ + char dir[144]; + char *sl; + + snprintf(dir, sizeof(dir), "%s", app_exec ? app_exec : ""); + sl = strrchr(dir, '/'); + if (sl) sl[1] = 0; + else dir[0] = 0; + snprintf(out, (size_t)olen, "%s%s", dir, svc ? svc : ""); +} + +/* 后台保活 drain 的独立行缓冲(防与前台会话的 g_ams_out_line 未完结行串扰,一 App 一组) */ +static char g_bg_out_line[MEOW_BG_MAX][1024]; +static int g_bg_out_n[MEOW_BG_MAX]; + +/* meow_bgplay on_bg_dead:后台保活 App 进程退出(崩溃照收/停播后自退/卡拔 SIGTERM 走完)。 */ +static void bg_on_dead(const char *app_id, pid_t pid, int status) +{ + (void)pid; + ams_report_exit_id(app_id, status, 0); /* dur 未知(保活起点未记),记 0 */ + if (WIFSIGNALED(status) || + (WIFEXITED(status) && WEXITSTATUS(status) != 0)) + notify_app_crash(app_id, status); /* 崩溃照收(SIGTERM=卡拔/关机回收也算信号, + * meow_crash 侧自行判重;与前台同口径) */ + meow_media_clear(app_id); /* 媒体会话随源死清槽 */ + /* §10.5 自抑标记:仅当「再无后台保活 App 且无通知中心叠加会话」才清—— + * 多 bg App 共存时标记粒度为全局(v1 定案:叠加会话与后台保活共用同一标记)。 */ + if (meow_bg_count() == 0 && g_notif_ctrl_pid <= 0) + unlink(NOTIF_ACTIVE); +} + +/* meow_bgplay notif_clear_app:熔断时清该 App 全部活跃通知(先收集 id 再 dismiss, + * 防遍历时改表)。返回清除条数。 */ +struct bg_clear_ctx { uint32_t ids[16]; int n; }; +static int bg_notif_collect_cb(const meow_notif_t *nt, void *ctx) +{ + struct bg_clear_ctx *c = ctx; + if (c->n < 16) c->ids[c->n++] = nt->id; + return c->n >= 16; /* 集满即中止遍历 */ +} +static int bg_notif_clear_app(const char *app_id) +{ + struct bg_clear_ctx c; + + memset(&c, 0, sizeof(c)); + meow_notif_list(app_id, bg_notif_collect_cb, &c); + for (int i = 0; i < c.n; i++) meow_notif_dismiss(c.ids[i]); + return c.n; +} + +/* meow_bgplay send_frame:熔断广播投递前判 IPC 连接存活(注册方可能已断开)。 */ +static size_t bg_send_frame(int fd, uint16_t type, uint32_t req_id, + const void *payload, uint32_t len) +{ + if (!meow_ipc_conn_alive(fd)) return 0; + return meow_ipc_send_pub(fd, type, req_id, payload, len); +} + +void meow_bgplay_launcher_init(void) +{ + meow_bgplay_ops ops; + + memset(&ops, 0, sizeof(ops)); + ops.log = logmsg; + ops.now_ms = NULL; /* 内部 CLOCK_MONOTONIC */ + ops.card_present = sd_device_present; + ops.on_bg_dead = bg_on_dead; + ops.on_svc_dead = NULL; /* 服务消亡日志 meow_bgplay 内已记 */ + ops.notif_clear_app = bg_notif_clear_app; + ops.send_frame = bg_send_frame; + ops.log_dir = log_dir[0] ? log_dir : NULL; + meow_bgplay_init(&ops); +} + +/* 后台表周期维护(meow_ipc_process 末尾调):drain 各 bg App stdout(防写满管道阻塞 + * 播放线程)+ 回收/卡拔 tick + 服务退避重启 tick。 */ +void meow_bg_housekeep(void) +{ + for (int i = 0; i < MEOW_BG_MAX; i++) { + const meow_bg_entry_t *e = meow_bg_at(i); + if (e && e->out_fd >= 0) + ams_drain_stdout(e->app_id, e->out_fd, e->pid, + g_bg_out_line[i], &g_bg_out_n[i]); + } + meow_bg_tick(); + meow_svc_tick(); +} + + /* 链路深度 = ';' 分隔段数(根屏→目标屏的逻辑链长)。 */ int chain_depth(const char *c) { @@ -525,6 +650,8 @@ void meow_parse_app_json(FILE *f, struct app *a) int fram = 0, immersive = 0; int fullscreen = 0; /* app.json fullscreen=(注入 MEOW_FULLSCREEN env,SDK 预先设全屏) */ int fonts = 0, fonts_set = 0; /* app.json "fonts":<档>(0=默认4K常用 1=大字库GBK 2=Full;缺省 0) */ + int background = 0; /* M4:app.json background=true(可注册无头后台服务) */ + int bg_audio = 0; /* M4:app.json background_audio=true(播放中退出转后台保活) */ struct app tmp; memset(&tmp, 0, sizeof tmp); while (fgets(buf, sizeof buf, f)) { @@ -638,6 +765,24 @@ void meow_parse_app_json(FILE *f, struct app *a) fonts_set = 1; } } + /* "background":true(M4:可注册无头后台服务,MSG_REGISTER 权限位0)。 + * 注意 "background" 是 "background_audio" 的前缀:反向误命中(本 key 匹配到 + * background_audio 行)时 json_str 读出 "_audio…" ≠ true,判定自然为 0,无害。 */ + if (!background && strstr(buf, "background")) { + char v[8] = ""; + if (json_str(buf, "background", v, sizeof v) > 0) { + if (!strcmp(v, "true") || !strcmp(v, "1") || !strcmp(v, "yes")) + background = 1; + } + } + /* "background_audio":true(M4:播放中退出转后台保活,进程+音频流保留,§9) */ + if (!bg_audio && strstr(buf, "background_audio")) { + char v[8] = ""; + if (json_str(buf, "background_audio", v, sizeof v) > 0) { + if (!strcmp(v, "true") || !strcmp(v, "1") || !strcmp(v, "yes")) + bg_audio = 1; + } + } /* service.=mode:restart:max:window_ms(M1 解析存储,保活 M4) */ char *sp = strstr(buf, "service."); if (sp && tmp.nsvc < MEOW_MAX_SVCS) { @@ -670,6 +815,8 @@ void meow_parse_app_json(FILE *f, struct app *a) a->immersive = immersive ? '1' : 0; a->fullscreen = fullscreen ? '1' : 0; /* 注入 MEOW_FULLSCREEN env */ a->fonts = (char)(fonts < 0 ? 0 : (fonts > 2 ? 2 : fonts)); /* 注入 MEOW_FONT_TIER env */ + a->background = background ? '1' : 0; /* M4:后台服务注册权限 */ + a->background_audio = bg_audio ? '1' : 0; /* M4:后台播放保活 */ strncpy(a->icon, icon, 128); a->nroute = tmp.nroute; if (tmp.nroute) memcpy(a->routes, tmp.routes, sizeof(a->routes[0]) * (size_t)tmp.nroute); @@ -1295,6 +1442,25 @@ static int launch_app_chain(struct app *a, const char *chain) g_ams_pick_armed = 0; } if (!a->ok) { logmsg("launch blocked: exec not ok"); return -1; } + + /* M4 后台保活恢复:该 App 驻留后台(播放中经 nav-exit 转过)→ 原进程回前台, + * 不 fork/exec(进程仍存无法注入新 env:chain/picker 上下文忽略,记日志)。 + * pid/out_fd 外提:冷启动与恢复两路填充,其后 watchdog/waitpid 循环共用。 */ + pid_t pid = 0; + int out_fd = -1; + int resumed = 0; + if (meow_bg_take(a->id, &out_fd, &pid) == 0) { + resumed = 1; + logmsg("launch: %s resume from background (pid=%d)", a->name, (int)pid); + if (chain && chain[0]) logmsg("launch: resume ignores chain=\"%s\"", chain); + if (pick_action[0]) logmsg("launch: resume ignores picker action=%s", pick_action); + /* 回前台:清 §10.5 SDK present 自抑标记(无其他 bg App 且无叠加会话时) */ + if (meow_bg_count() == 0 && g_notif_ctrl_pid <= 0) + unlink(NOTIF_ACTIVE); + drain_input(); + meow_nav_begin(a->id, NULL); /* 转后台时导航栈已清;回前台从裸态重建 */ + } + if (!resumed) { meow_nav_begin(a->id, chain); /* M3:冷启动/裸启动都以当前链深初始化导航栈(chain 空→depth 0) */ /* M2.12:启动前准备 MeowData//{data,cache}(幂等;卡不在/失败只 log 不崩)。 @@ -1331,7 +1497,7 @@ static int launch_app_chain(struct app *a, const char *chain) fcntl(out_pipe[1], F_SETFD, FD_CLOEXEC); } - pid_t pid = fork(); + pid = fork(); if (pid < 0) { close(execpipe[0]); close(execpipe[1]); if (out_pipe[0] >= 0) close(out_pipe[0]); @@ -1494,7 +1660,7 @@ static int launch_app_chain(struct app *a, const char *chain) } close(execpipe[1]); if (out_pipe[1] >= 0) close(out_pipe[1]); /* parent: 关闭写端 */ - int out_fd = out_pipe[0]; /* parent 保留读端,前台循环排空 */ + out_fd = out_pipe[0]; /* parent 保留读端,前台循环排空 */ if (out_fd >= 0) { int fl = fcntl(out_fd, F_GETFL, 0); if (fl >= 0) fcntl(out_fd, F_SETFL, fl | O_NONBLOCK); @@ -1527,13 +1693,35 @@ static int launch_app_chain(struct app *a, const char *chain) if (out_fd >= 0) close(out_fd); return -1; } + } /* end if (!resumed):冷启动分支(prepare/fork/exec/确认) */ - /* AMSD_DESIGN §4.1:启动上报(pkg/activity/chain/pid),amsd 建表项 + 开 stdout 捕获会话。 */ - ams_report_launch(a, chain, pid); + /* AMSD_DESIGN §4.1:启动上报(pkg/activity/chain/pid),amsd 建表项 + 开 stdout 捕获会话。 + * M4:两路都报(恢复路径诚实记为新一次 LAUNCH;chain 被忽略故报 NULL)。 */ + ams_report_launch(a, resumed ? NULL : chain, pid); /* GESTURE_BACK §2.4:应用启动即写 immersive 状态,watchdog 依此隐藏/保留虚拟返回键 */ meow_write_app_state(a->immersive == '1' ? 1 : 0); + /* M4:冷启动成功且声明 background=true → 自动拉起其静态声明的 keepalive(mode=0) + * 无头服务(reg_fd=-1=静态拉起无注册连接;同名在跑/退避排程中 → EXISTS 静默跳过)。 + * 服务 exec 路径约定 = App 二进制同目录下的 名文件(见 meow_svc_exec_path)。 */ + if (!resumed && a->background == '1') { + for (int i = 0; i < a->nsvc; i++) { + char sexec[160]; + int rc; + if (a->svcs[i].mode != 0) continue; + meow_svc_exec_path(a->exec, a->svcs[i].name, sexec, sizeof sexec); + rc = meow_svc_register(a->id, a->svcs[i].name, sexec, + a->svcs[i].restart, a->svcs[i].max, + a->svcs[i].window_ms, + strncmp(sexec, MEOWAPPS, strlen(MEOWAPPS)) == 0, + -1); + if (rc == MEOW_ERR_EXISTS) continue; /* 在跑/排程中:静默跳过 */ + logmsg("launch: auto-svc %s/%s -> %s", a->id, a->svcs[i].name, + rc > 0 ? "spawned" : "FAILED"); + } + } + /* watchdog for virtual back key / gestures */ char wd1[192], pidstr[16]; pid_t wpid = 0; @@ -1580,6 +1768,7 @@ static int launch_app_chain(struct app *a, const char *chain) unsigned long long ams_t0 = now_ms(); /* AMSD_DESIGN §4.1:运行时长起点 */ int ams_status_valid = 0; /* 仅真实 waitpid 回收才置 1(规避 sigterm/重启路径 status=0 假干净退出) */ int nav_clean_exit = 0; /* M3:MSG_NAV{EXIT} 主动退出 → 不按崩溃上报 */ + int to_background = 0; /* M4:nav-exit 转后台保活(进程保留,跳过退出尾) */ int app_prev_vold = 0; int app_seq_hits = 0; unsigned long long app_seq_last = 0; @@ -1621,7 +1810,7 @@ static int launch_app_chain(struct app *a, const char *chain) if (sigterm_flag) { logmsg("sigterm during app"); kill(pid, SIGTERM); break; } /* AMSD_DESIGN §5.1:排空 App stdout/stderr 管道(非阻塞),按行转发 amsd;App 写满不阻塞。 */ g_ams_out_had = 0; - if (out_fd >= 0) ams_drain_stdout(a, out_fd, pid); + if (out_fd >= 0) ams_drain_stdout(a->id, out_fd, pid, g_ams_out_line, &g_ams_out_n); /* M3 导航栈:前台会话排空 IPC(App 经 MSG_NAV REPORT/EXIT 上报导航/请求退出)。 * REPORT 更新 nav_stack(meow_ipc_process 内单写者);EXIT → 终止应用回主屏。 */ meow_ipc_process(); @@ -1635,6 +1824,18 @@ static int launch_app_chain(struct app *a, const char *chain) break; } if (meow_nav_exit_pending()) { + /* M4 后台播放保活:声明 background_audio 且该 App 媒体会话 PLAYING → 不终止, + * 进程+音频流保留转后台(UI 冻结走 §10.5 SDK present 自抑,**非 SIGSTOP**—— + * SIGSTOP 会冻结同进程播放线程断供 PCM,§10.5 真机实证)。登记失败 + *(槽满/已存在)回落下方真退序列。卡拔例外不适用保活(bg 表 tick 照杀)。 */ + if (meow_bg_should_keep(a->background_audio == '1', + meow_media_app_playing(a->id)) && + meow_bg_add(a->id, pid, out_fd, app_on_card) == 0) { + logmsg("bg: app %s nav-exit -> 后台保活(播放中,pid=%d 保留,SDK present 自抑)", + a->name, (int)pid); + to_background = 1; + break; + } logmsg("nav: app %s MSG_NAV{EXIT} -> terminate, return to home", a->name); nav_clean_exit = 1; kill(pid, SIGTERM); @@ -1791,6 +1992,36 @@ static int launch_app_chain(struct app *a, const char *chain) * AMSD_DESIGN §5.1:本轮排空到 stdout 数据 → 也睡短些,防止 App 写满管道被阻塞。 */ usleep((meow_ui_statusbar_animating() || g_ams_out_had) ? 20000 : 100000); } + /* M4:转后台保活出口 —— 跳过退出尾(不 ams EXIT/不 crash 上报/不清媒体会话/ + * 不关 out_fd:进程仍存活,out_fd 归 bg 表由 meow_bg_housekeep 继续 drain)。 + * 停播后再退出走上方正常退出尾 = 真退。 */ + if (to_background) { + g_app_session_active = 0; /* 前台会话结束(ipc_dispatch 不再受理 NOTIF_OPEN) */ + meow_notif_open_clear(); + if (wpid > 0) { + /* 看门狗随前台会话结束回收(后台无手势监听;有界等防挂死) */ + kill(wpid, SIGTERM); + unsigned long long wstart = now_ms(); + while (now_ms() - wstart < 2000) { + if (waitpid(wpid, NULL, WNOHANG) == wpid) break; + usleep(50000); + } + } + /* 写 §10.5 SDK 自抑标记:App 进程见 /tmp/meow_notif_active → present 画进 + * back_buf 不上屏 + 输入线程排空(=UI 冻结);音频经 audiod socket 天然续播。 */ + int nfd = open(NOTIF_ACTIVE, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (nfd >= 0) { write(nfd, "1", 1); close(nfd); } + meow_write_app_state(-1); + unlink(MEOW_SBAR_MODE_FILE); /* 顶条模式文件由 App SDK 写;转后台清理复位菜单整条 */ + g_sb_mode_last = -1; + meow_ui_statusbar_set_collapsed(0); + meow_ui_statusbar_animate(0); + meow_ui_set_fullscreen(0); + meow_dirty_add(0, SB_BAR_Y, fb_xres, SB_BAR_H); + settings_load(); + meow_nav_exit(); /* 前台会话导航栈清栈(App 本体栈内存活;回前台时裸态重建) */ + return 0; + } /* §10.5:App 前台会话结束,清会话标记(ipc_dispatch 不再受理 MSG_NOTIF_OPEN) */ g_app_session_active = 0; meow_notif_open_clear(); @@ -1798,10 +2029,10 @@ static int launch_app_chain(struct app *a, const char *chain) * 先转发 amsd,再报 EXIT / crash。仅当有读端(管道建立成功)才 drain。 */ if (out_fd >= 0) { g_ams_out_had = 0; - ams_drain_stdout(a, out_fd, pid); /* 排空全部剩余(App 死 → read 返回 0=EOF) */ + ams_drain_stdout(a->id, out_fd, pid, g_ams_out_line, &g_ams_out_n); /* 排空全部剩余(App 死 → read 返回 0=EOF) */ if (g_ams_out_n > 0) { /* 未完结尾行:强制提交 */ g_ams_out_line[g_ams_out_n] = '\0'; - ams_out_line(a, pid, g_ams_out_line); + ams_out_line(a->id, pid, g_ams_out_line); g_ams_out_n = 0; } ams_out_flush(); diff --git a/patch_v2/meow_launcherd/build_launcher.sh b/patch_v2/meow_launcherd/build_launcher.sh index 2e4434c..094e887 100755 --- a/patch_v2/meow_launcherd/build_launcher.sh +++ b/patch_v2/meow_launcherd/build_launcher.sh @@ -27,7 +27,7 @@ SYSROOT="$ROOT/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf" notif_center.c app_launcher.c audio.c backlight.c net.c about.c \ subpage.c wifi_page.c bt_page.c now_playing.c \ font_theme.c keys.c util.c \ - meow_touch.c meow_settings.c meow_notif.c meow_media.c \ + meow_touch.c meow_settings.c meow_notif.c meow_media.c meow_bgplay.c \ "../sdk/meow_ui.a" "$SYSROOT/lib/libz.a" -lpthread -o meow_launcherd echo "== meow_launcherd ==" ls -la meow_launcherd diff --git a/patch_v2/meow_launcherd/main_menu.c b/patch_v2/meow_launcherd/main_menu.c index b6551ef..1e63a3d 100644 --- a/patch_v2/meow_launcherd/main_menu.c +++ b/patch_v2/meow_launcherd/main_menu.c @@ -467,6 +467,11 @@ static void menu_draw_grid_cell(const struct app *a, meow_img *icon, int x, int if (!a->ok) { int ew = ui_width("[缺失]", 14); ui_draw(x + (w - ew) / 2, name_y + meow_font_line_height(18) + 2, "[缺失]", th->error, 14); + } else if (meow_bg_is_backgrounded(a->id)) { + /* M4:后台保活中标注(播放中转后台的 App;run_menu 1s tick 按 change_seq 刷新) */ + int bw = ui_width("·后台", 14); + ui_draw(x + (w - bw) / 2, name_y + meow_font_line_height(18) + 2, "·后台", + th->on_surface_variant, 14); } } @@ -496,9 +501,11 @@ static void menu_draw_list_cell(const struct app *a, meow_img *icon, int x, int sub_y = y + 30; } ui_draw(tx, name_y, nm, a->ok ? th->on_surface : th->error, 20); - /* 副标题:package(无则 id),on_surface_variant */ - char sub[40]; - snprintf(sub, sizeof sub, "%s", a->package[0] ? a->package : (a->id[0] ? a->id : "")); + /* 副标题:package(无则 id),on_surface_variant;M4 后台保活中前缀「·后台 」 */ + char sub[48]; + snprintf(sub, sizeof sub, "%s%s", + meow_bg_is_backgrounded(a->id) ? "·后台 " : "", + a->package[0] ? a->package : (a->id[0] ? a->id : "")); if (sub[0]) { char subf[44]; menu_name_fit(sub, w - (tx - x) - 12, 14, subf, sizeof subf); @@ -1621,6 +1628,12 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state, draw_clock(); /* Stage-One:喂 SDK 全局状态栏 + 标脏顶条;SDK present() 重绘 */ fb_norm_buf0(); meow_ui_flush(); /* blit 状态栏整条,不动列表 */ + /* M4:后台保活表变化(转后台/回前台/回收)→ 重绘列表刷新「·后台」标注 */ + { + static uint32_t bg_seq_last = 0; + uint32_t seq = meow_bgplay_change_seq(); + if (seq != bg_seq_last) { bg_seq_last = seq; dirty = 1; } + } } usleep(POLL_MS * 1000); @@ -1964,6 +1977,10 @@ int main(int argc, char **argv) "(state=%d napps=%d), drain-to-home immediately", state, napps); run_menu(apps, napps, state, sim_tap, sim_exit); logmsg("=== meow_launcherd exit (MeowOS mode) ==="); + /* M4:关机/退出前回收后台保活 App + 无头服务(有界 SIGTERM→SIGKILL→reap); + * 清 §10.5 自抑标记,防 launcher 重启后残留标记抑制后续 App present。 */ + meow_bgplay_kill_all(); + unlink(NOTIF_ACTIVE); if (log_fd >= 0) { close(log_fd); log_fd = -1; } ipc_shutdown = 1; unlink(ipc_sock_path); unlink(PID_PATH); @@ -2168,6 +2185,8 @@ int main(int argc, char **argv) if (player_stopped) { fb_restore_player(); restore_backlight(); } cont_player(); logmsg("=== meow_launcherd exit ==="); + meow_bgplay_kill_all(); /* M4:退出前回收后台保活 App + 无头服务(有界) */ + unlink(NOTIF_ACTIVE); /* M4:清 §10.5 自抑标记,防残留抑制后续 App present */ if (log_fd >= 0) { close(log_fd); log_fd = -1; } ipc_shutdown = 1; unlink(ipc_sock_path); unlink(PID_PATH); diff --git a/patch_v2/meow_launcherd/meow_bgplay.c b/patch_v2/meow_launcherd/meow_bgplay.c new file mode 100644 index 0000000..94367bc --- /dev/null +++ b/patch_v2/meow_launcherd/meow_bgplay.c @@ -0,0 +1,509 @@ +/* meow_bgplay.c — M4 后台播放保活 + 无头后台服务运行时表(见 meow_bgplay.h 头注释)。 */ +#include "meow_bgplay.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static meow_bgplay_ops g_ops; +static meow_bg_entry_t g_bg[MEOW_BG_MAX]; +static meow_svc_rt_t g_svc[MEOW_SVC_RT_MAX]; +static uint32_t g_change_seq; + +static const uint32_t k_backoff[] = { + MEOW_SVC_BACKOFF_1, MEOW_SVC_BACKOFF_2, MEOW_SVC_BACKOFF_4, MEOW_SVC_BACKOFF_10 +}; +#define BACKOFF_STEPS ((int)(sizeof(k_backoff) / sizeof(k_backoff[0]))) + +/* SIGTERM 后 SIGKILL 兜底宽限(ms) */ +#define TERM_GRACE_MS 500u + +/* ------------------------------------------------------------------ */ + +static void bg_log(const char *fmt, ...) +{ + va_list ap; + char buf[384]; + + if (!g_ops.log) return; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + g_ops.log("%s", buf); +} + +static uint64_t bg_now_ms(void) +{ + struct timespec ts; + + if (g_ops.now_ms) return g_ops.now_ms(); + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000u + (uint64_t)ts.tv_nsec / 1000000u; +} + +static int bg_card_present(void) +{ + return g_ops.card_present ? g_ops.card_present() : 1; +} + +void meow_bgplay_init(const meow_bgplay_ops *ops) +{ + memset(&g_ops, 0, sizeof(g_ops)); + memset(g_bg, 0, sizeof(g_bg)); + memset(g_svc, 0, sizeof(g_svc)); + g_change_seq = 0; + if (ops) g_ops = *ops; +} + +/* ================= 后台播放保活 ================= */ + +int meow_bg_should_keep(int bg_audio_declared, int media_playing) +{ + return bg_audio_declared && media_playing; +} + +static meow_bg_entry_t *bg_find(const char *app_id) +{ + int i; + + for (i = 0; i < MEOW_BG_MAX; i++) + if (g_bg[i].used && strcmp(g_bg[i].app_id, app_id) == 0) + return &g_bg[i]; + return NULL; +} + +int meow_bg_add(const char *app_id, pid_t pid, int out_fd, int on_card) +{ + int i; + + if (!app_id || !app_id[0] || pid <= 0) return MEOW_ERR_INVAL; + if (bg_find(app_id)) return MEOW_ERR_EXISTS; + for (i = 0; i < MEOW_BG_MAX; i++) { + if (!g_bg[i].used) { + meow_bg_entry_t *e = &g_bg[i]; + + memset(e, 0, sizeof(*e)); + e->used = 1; + snprintf(e->app_id, sizeof(e->app_id), "%s", app_id); + e->pid = pid; + e->out_fd = out_fd; + e->on_card = on_card; + g_change_seq++; + bg_log("[bgplay] 转后台保活: %s pid=%d on_card=%d", app_id, (int)pid, on_card); + return 0; + } + } + return MEOW_ERR_NOMEM; +} + +int meow_bg_take(const char *app_id, int *out_fd, pid_t *pid) +{ + meow_bg_entry_t *e; + + if (!app_id || !app_id[0]) return -1; + e = bg_find(app_id); + if (!e) return -1; + if (out_fd) *out_fd = e->out_fd; + if (pid) *pid = e->pid; + bg_log("[bgplay] 回前台: %s pid=%d", app_id, (int)e->pid); + memset(e, 0, sizeof(*e)); + g_change_seq++; + return 0; +} + +int meow_bg_is_backgrounded(const char *app_id) +{ + return app_id && app_id[0] && bg_find(app_id) != NULL; +} + +int meow_bg_count(void) +{ + int i, n = 0; + + for (i = 0; i < MEOW_BG_MAX; i++) + if (g_bg[i].used) n++; + return n; +} + +const meow_bg_entry_t *meow_bg_at(int i) +{ + if (i < 0 || i >= MEOW_BG_MAX || !g_bg[i].used) return NULL; + return &g_bg[i]; +} + +uint32_t meow_bgplay_change_seq(void) +{ + return g_change_seq; +} + +void meow_bg_tick(void) +{ + uint64_t now = bg_now_ms(); + int i; + + for (i = 0; i < MEOW_BG_MAX; i++) { + meow_bg_entry_t *e = &g_bg[i]; + int st; + pid_t r; + + if (!e->used) continue; + + /* 卡拔例外:二进制在卡上 → SIGTERM(防 SIGBUS),500ms 未死 SIGKILL */ + if (e->on_card && !bg_card_present()) { + if (e->term_at_ms == 0) { + bg_log("[bgplay] 卡拔出,终止卡上后台 App: %s pid=%d", + e->app_id, (int)e->pid); + kill(e->pid, SIGTERM); + e->term_at_ms = now; + } else if (now - e->term_at_ms >= TERM_GRACE_MS) { + kill(e->pid, SIGKILL); + e->term_at_ms = now; /* 500ms 节流重复 SIGKILL 直至 reap */ + } + } + + r = waitpid(e->pid, &st, WNOHANG); + if (r == e->pid) { + char id[MEOW_APP_ID_MAX]; + pid_t pid = e->pid; + + snprintf(id, sizeof(id), "%s", e->app_id); + memset(e, 0, sizeof(*e)); + g_change_seq++; + bg_log("[bgplay] 后台 App 退出: %s pid=%d status=0x%x", id, (int)pid, st); + if (g_ops.on_bg_dead) g_ops.on_bg_dead(id, pid, st); + } + } +} + +/* ================= 无头后台服务 ================= */ + +static meow_svc_rt_t *svc_find_mut(const char *app_id, const char *svc) +{ + int i; + + for (i = 0; i < MEOW_SVC_RT_MAX; i++) + if (g_svc[i].used && strcmp(g_svc[i].app_id, app_id) == 0 && + strcmp(g_svc[i].svc, svc) == 0) + return &g_svc[i]; + return NULL; +} + +const meow_svc_rt_t *meow_svc_find(const char *app_id, const char *svc) +{ + if (!app_id || !svc) return NULL; + return svc_find_mut(app_id, svc); +} + +/* spawn 服务子进程:stdio→/dev/null,env={PATH,HOME,MEOW_SERVICE[,MEOW_LOG_DIR/MEOW_LOG_APP]}。 + * 父进程返回 pid;子进程不返回(execve 或 _exit(127))。 */ +static pid_t svc_spawn(meow_svc_rt_t *s) +{ + char env_service[32]; + char env_logdir[160]; + char env_logapp[64]; + char *envp[6]; + int n = 0; + pid_t pid; + + envp[n++] = (char *)"PATH=/usr/bin:/bin:/usr/sbin:/sbin"; + envp[n++] = (char *)"HOME=/root"; + snprintf(env_service, sizeof(env_service), "MEOW_SERVICE=%s", s->svc); + envp[n++] = env_service; + if (g_ops.log_dir && g_ops.log_dir[0]) { + snprintf(env_logdir, sizeof(env_logdir), "MEOW_LOG_DIR=%s", g_ops.log_dir); + envp[n++] = env_logdir; + snprintf(env_logapp, sizeof(env_logapp), "MEOW_LOG_APP=%s", s->app_id); + envp[n++] = env_logapp; + } + envp[n] = NULL; + + pid = fork(); + if (pid != 0) return pid; /* 父:pid 或 -1 */ + + /* 子进程:脱离终端会话,stdio 全部重定向 /dev/null(无头服务) */ + setsid(); + { + int dn = open("/dev/null", O_RDWR); + if (dn >= 0) { + dup2(dn, STDIN_FILENO); + dup2(dn, STDOUT_FILENO); + dup2(dn, STDERR_FILENO); + if (dn > STDERR_FILENO) close(dn); + } + } + { + char *argv[2]; + + argv[0] = s->exec; + argv[1] = NULL; + execve(s->exec, argv, envp); + } + _exit(127); /* exec 失败:父进程 tick 回收后按退避/熔断处理 */ +} + +int meow_svc_register(const char *app_id, const char *svc, const char *exec, + int restart, int max_restart, int window_ms, + int on_card, int reg_fd) +{ + meow_svc_rt_t *s; + pid_t pid; + int i; + + if (!app_id || !app_id[0] || !svc || !svc[0] || !exec || !exec[0]) + return MEOW_ERR_INVAL; + if (access(exec, X_OK) != 0) return MEOW_ERR_NOENT; + + s = svc_find_mut(app_id, svc); + if (s) { + if (s->pid > 0) return MEOW_ERR_EXISTS; + if (!s->circuit) return MEOW_ERR_EXISTS; /* 退避排程中也视为在册 */ + /* 熔断槽重注册:复位熔断,重新武装 */ + bg_log("[bgplay] 服务熔断复位重注册: %s/%s", app_id, svc); + s->circuit = 0; + s->stopping = 0; + s->restart_count = 0; + s->window_start_ms = bg_now_ms(); + s->next_retry_ms = 0; + s->reg_fd = reg_fd; + s->on_card = on_card; + } else { + for (i = 0; i < MEOW_SVC_RT_MAX; i++) + if (!g_svc[i].used) break; + if (i >= MEOW_SVC_RT_MAX) return MEOW_ERR_NOMEM; + s = &g_svc[i]; + memset(s, 0, sizeof(*s)); + s->used = 1; + snprintf(s->app_id, sizeof(s->app_id), "%s", app_id); + snprintf(s->svc, sizeof(s->svc), "%s", svc); + snprintf(s->exec, sizeof(s->exec), "%s", exec); + s->restart = restart; + s->max_restart = max_restart; + s->window_ms = window_ms; + s->on_card = on_card; + s->reg_fd = reg_fd; + s->window_start_ms = bg_now_ms(); + } + + pid = svc_spawn(s); + if (pid < 0) { + if (s->pid == 0 && s->restart_count == 0 && !s->circuit) + memset(s, 0, sizeof(*s)); /* 新槽首次 fork 即败:不留尸槽 */ + return MEOW_ERR_IO; + } + s->pid = pid; + s->term_at_ms = 0; + bg_log("[bgplay] 服务拉起: %s/%s pid=%d restart=%d max=%d", + app_id, svc, (int)pid, restart, max_restart); + return (int)pid; +} + +int meow_svc_stop(const char *app_id, const char *svc) +{ + meow_svc_rt_t *s; + + if (!app_id || !svc) return MEOW_ERR_INVAL; + s = svc_find_mut(app_id, svc); + if (!s) return MEOW_ERR_NOENT; + bg_log("[bgplay] 服务停止: %s/%s pid=%d", app_id, svc, (int)s->pid); + if (s->pid > 0) { + s->stopping = 1; + kill(s->pid, SIGTERM); + s->term_at_ms = bg_now_ms(); + } else { + /* 未在跑(退避中/熔断):直接清槽 */ + if (g_ops.on_svc_dead) g_ops.on_svc_dead(s->app_id, s->svc); + memset(s, 0, sizeof(*s)); + } + return 0; +} + +/* 服务死亡后的退避/熔断判定。返回 1=已排程重启;0=槽已清或熔断。 */ +static int svc_on_exit(meow_svc_rt_t *s, int st) +{ + uint64_t now = bg_now_ms(); + + bg_log("[bgplay] 服务退出: %s/%s pid=%d status=0x%x stopping=%d", + s->app_id, s->svc, (int)s->pid, st, s->stopping); + s->pid = 0; + + if (s->stopping || !s->restart) { + if (g_ops.on_svc_dead) g_ops.on_svc_dead(s->app_id, s->svc); + memset(s, 0, sizeof(*s)); + return 0; + } + + /* 滑窗:超窗复位计数 */ + if (s->window_ms > 0 && now - s->window_start_ms >= (uint64_t)s->window_ms) { + s->restart_count = 0; + s->window_start_ms = now; + } + s->restart_count++; + + if (s->max_restart > 0 && s->restart_count > s->max_restart) { + /* 熔断:清通知 + 广播 MSG_SYS{SVC_DEAD},槽保留待重注册复位 */ + m_sys_t m; + + s->circuit = 1; + s->next_retry_ms = 0; + bg_log("[bgplay] 服务熔断: %s/%s 窗口内重启 %d 次超 max=%d", + s->app_id, s->svc, s->restart_count, s->max_restart); + if (g_ops.notif_clear_app) + g_ops.notif_clear_app(s->app_id); + if (g_ops.send_frame && s->reg_fd >= 0) { + memset(&m, 0, sizeof(m)); + m.event = MEOW_SYS_SVC_DEAD; + snprintf(m.app_id, sizeof(m.app_id), "%s", s->app_id); + snprintf(m.svc, sizeof(m.svc), "%s", s->svc); + g_ops.send_frame(s->reg_fd, MSG_SYS, 0, &m, sizeof(m)); + } + if (g_ops.on_svc_dead) g_ops.on_svc_dead(s->app_id, s->svc); + return 0; + } + + { + int step = s->restart_count - 1; + uint32_t dly; + + if (step >= BACKOFF_STEPS) step = BACKOFF_STEPS - 1; + dly = k_backoff[step]; + s->next_retry_ms = now + dly; + bg_log("[bgplay] 服务退避重启: %s/%s 第 %d 次,%ums 后拉起", + s->app_id, s->svc, s->restart_count, (unsigned)dly); + } + return 1; +} + +void meow_svc_tick(void) +{ + uint64_t now = bg_now_ms(); + int i; + + for (i = 0; i < MEOW_SVC_RT_MAX; i++) { + meow_svc_rt_t *s = &g_svc[i]; + + if (!s->used) continue; + + /* 卡拔例外:exec 在卡上 → SIGTERM + stopping=1(不重启防空转死循环) */ + if (s->on_card && s->pid > 0 && !bg_card_present() && !s->stopping) { + bg_log("[bgplay] 卡拔出,终止卡上服务: %s/%s pid=%d", + s->app_id, s->svc, (int)s->pid); + s->stopping = 1; + kill(s->pid, SIGTERM); + s->term_at_ms = now; + } + /* SIGTERM 宽限超时 → SIGKILL */ + if (s->stopping && s->pid > 0 && s->term_at_ms && + now - s->term_at_ms >= TERM_GRACE_MS) { + kill(s->pid, SIGKILL); + s->term_at_ms = now; + } + + if (s->pid > 0) { + int st; + pid_t r = waitpid(s->pid, &st, WNOHANG); + + if (r == s->pid) svc_on_exit(s, st); + continue; + } + + /* 退避到点 → 重新拉起 */ + if (!s->circuit && !s->stopping && s->restart && + s->next_retry_ms && now >= s->next_retry_ms) { + pid_t pid = svc_spawn(s); + + s->next_retry_ms = 0; + if (pid > 0) { + s->pid = pid; + bg_log("[bgplay] 服务重启: %s/%s pid=%d(第 %d 次)", + s->app_id, s->svc, (int)pid, s->restart_count); + } else { + /* fork 失败:压到下一档重试 */ + s->next_retry_ms = now + k_backoff[BACKOFF_STEPS - 1]; + } + } + } +} + +/* ================= 关机前回收 ================= */ + +void meow_bgplay_kill_all(void) +{ + uint64_t deadline; + int i; + + /* best-effort 广播 SHUTDOWN */ + if (g_ops.send_frame) { + m_sys_t m; + + memset(&m, 0, sizeof(m)); + m.event = MEOW_SYS_SHUTDOWN; + for (i = 0; i < MEOW_SVC_RT_MAX; i++) + if (g_svc[i].used && g_svc[i].reg_fd >= 0) + g_ops.send_frame(g_svc[i].reg_fd, MSG_SYS, 0, &m, sizeof(m)); + } + + for (i = 0; i < MEOW_BG_MAX; i++) + if (g_bg[i].used && g_bg[i].pid > 0) kill(g_bg[i].pid, SIGTERM); + for (i = 0; i < MEOW_SVC_RT_MAX; i++) + if (g_svc[i].used && g_svc[i].pid > 0) kill(g_svc[i].pid, SIGTERM); + + /* 有界等 1s(轮询 reap,期间 tick 语义不在——直接 waitpid) */ + deadline = bg_now_ms() + 1000u; + while (bg_now_ms() < deadline) { + int alive = 0; + + for (i = 0; i < MEOW_BG_MAX; i++) { + if (!g_bg[i].used) continue; + if (waitpid(g_bg[i].pid, NULL, WNOHANG) == g_bg[i].pid) + memset(&g_bg[i], 0, sizeof(g_bg[i])); + else + alive++; + } + for (i = 0; i < MEOW_SVC_RT_MAX; i++) { + if (!g_svc[i].used) continue; + if (waitpid(g_svc[i].pid, NULL, WNOHANG) == g_svc[i].pid) + memset(&g_svc[i], 0, sizeof(g_svc[i])); + else + alive++; + } + if (!alive) break; + usleep(50 * 1000); + } + + /* 兜底 SIGKILL + 有界 reap(waitpid 阻塞上限由 SIGKILL 必死保证) */ + for (i = 0; i < MEOW_BG_MAX; i++) + if (g_bg[i].used) { + kill(g_bg[i].pid, SIGKILL); + waitpid(g_bg[i].pid, NULL, 0); + memset(&g_bg[i], 0, sizeof(g_bg[i])); + } + for (i = 0; i < MEOW_SVC_RT_MAX; i++) + if (g_svc[i].used) { + kill(g_svc[i].pid, SIGKILL); + waitpid(g_svc[i].pid, NULL, 0); + memset(&g_svc[i], 0, sizeof(g_svc[i])); + } + g_change_seq++; + bg_log("[bgplay] kill_all 完成(关机/退出回收)"); +} + +void meow_bgplay_dump(const char *prefix) +{ + int i; + + for (i = 0; i < MEOW_BG_MAX; i++) + if (g_bg[i].used) + bg_log("%s bg[%d] %s pid=%d on_card=%d", prefix, i, + g_bg[i].app_id, (int)g_bg[i].pid, g_bg[i].on_card); + for (i = 0; i < MEOW_SVC_RT_MAX; i++) + if (g_svc[i].used) + bg_log("%s svc[%d] %s/%s pid=%d restart=%d count=%d circuit=%d", + prefix, i, g_svc[i].app_id, g_svc[i].svc, (int)g_svc[i].pid, + g_svc[i].restart, g_svc[i].restart_count, g_svc[i].circuit); +} diff --git a/patch_v2/meow_launcherd/meow_bgplay.h b/patch_v2/meow_launcherd/meow_bgplay.h new file mode 100644 index 0000000..04b2d92 --- /dev/null +++ b/patch_v2/meow_launcherd/meow_bgplay.h @@ -0,0 +1,139 @@ +/* meow_bgplay.h — MeowOS M4:后台播放保活 + 无头后台服务运行时表(FRAMEWORK_DESIGN §9)。 + * + * 定位: + * ① 后台播放保活——退出播放中(声明 background_audio=true 且媒体会话 PLAYING)的 App + * 不 SIGTERM:进程保留(音频经 audiod socket 天然续播),UI 冻结走 §10.5 的 + * /tmp/meow_notif_active SDK 自抑机制(present 画进 back_buf 不上屏 + 输入排空)。 + * **不做字面 SIGSTOP**:SIGSTOP 会冻结同进程播放线程、断供 PCM(§10.5 真机实证的坑)。 + * 点图标/媒体卡片回前台=take 恢复原进程;停播后再退出=真退(走原 SIGTERM 序列)。 + * ② 无头后台服务——MSG_REGISTER 注册 app.json `service.` 声明的服务:launcher + * spawn 子进程(无 UI,stdio→/dev/null),死亡按 1/2/4/10s 退避重启,超 max_restart + * 熔断(清该 App 通知 + 经注册连接广播 MSG_SYS{SVC_DEAD}),重注册可复位熔断。 + * + * 边界: + * - 卡拔出例外:二进制在 TF 卡上的后台 App/服务仍 SIGTERM(防 SIGBUS),不适用保活。 + * - 崩溃照收:waitpid WNOHANG 回收,异常退出经 on_bg_dead 回调走 crash 上报。 + * - 关机前回收:meow_bgplay_kill_all() 有界 SIGTERM→SIGKILL→reap。 + * + * 自包含:不依赖 launcher static 符号;日志/时钟/卡检测/通知清理/发帧全经 + * meow_bgplay_ops 注入(launcher 用 logmsg/sd_device_present/ipc_send;宿主单测用假件)。 + * 单一写者=launcher 主循环(meow_ipc_process 排空点挂 tick),无锁。可独立单测(test_bgplay.c)。 + */ +#ifndef MEOW_BGPLAY_H +#define MEOW_BGPLAY_H + +#include +#include +#include +#include "meow_ipc.h" + +/* 后台保活 App 上限(同时驻留后台的播放中 App) */ +#define MEOW_BG_MAX 4 +/* 无头后台服务运行时槽上限(与 meow_acct.svcs 的 MEOW_MAX_SVCS 对齐) */ +#define MEOW_SVC_RT_MAX 8 + +/* 退避重启档位(ms):1s/2s/4s/10s 封顶 */ +#define MEOW_SVC_BACKOFF_1 1000u +#define MEOW_SVC_BACKOFF_2 2000u +#define MEOW_SVC_BACKOFF_4 4000u +#define MEOW_SVC_BACKOFF_10 10000u + +/* 后台保活 App 槽。out_fd=其 stdout 管道读端(保活期继续 drain,防 App 写满管道阻塞)。 */ +typedef struct meow_bg_entry { + int used; + char app_id[MEOW_APP_ID_MAX]; + pid_t pid; + int out_fd; + int on_card; /* 二进制在 TF 卡上(卡拔需 SIGTERM 防 SIGBUS) */ + uint64_t term_at_ms; /* 卡拔 SIGTERM 发出时刻(0=未发;SIGKILL 兜底计时) */ +} meow_bg_entry_t; + +/* 无头后台服务运行时槽(静态声明在 meow_acct.svcs,此处为运行态)。 */ +typedef struct meow_svc_rt { + int used; + char app_id[MEOW_APP_ID_MAX]; + char svc[16]; + char exec[129]; + pid_t pid; /* >0 在跑;0=等待退避重启/已熔断 */ + int reg_fd; /* 注册方 IPC 连接 fd(熔断广播投递用;-1=静态自动拉起) */ + int restart; /* 1=死亡后退避重启 */ + int max_restart; /* 熔断阈值(窗口内重启次数上限;0=不熔断) */ + int window_ms; /* 重启窗口(0=累计不滑窗) */ + int restart_count; /* 当前窗口内已重启次数 */ + int circuit; /* 1=已熔断(清通知+广播过,不再拉起;重注册复位) */ + int stopping; /* 1=主动停止/卡拔终止中(SIGTERM 已发,不重启) */ + int on_card; /* exec 在 TF 卡上 */ + uint64_t window_start_ms; /* 滑窗起点 */ + uint64_t next_retry_ms; /* 退避下次拉起时刻(0=无排程) */ + uint64_t term_at_ms; /* SIGTERM 发出时刻(0=未发;500ms 未死 SIGKILL) */ +} meow_svc_rt_t; + +/* 依赖注入。全 NULL 可用(log 静默、now_ms 内部 CLOCK_MONOTONIC、card_present 恒 1、 + * 通知清理/发帧跳过)。 + * on_bg_dead:后台保活 App 进程退出(status=waitpid 原始状态;正常/异常由回调方判); + * on_svc_dead:服务槽最终消亡(stopping 走完/不重启死亡;熔断不算消亡,槽保留待复位); + * notif_clear_app:熔断时清该 App 全部通知,返回清除条数(<0=失败); + * send_frame:熔断广播 MSG_SYS(launcher 侧须先查连接存活再发); + * log_dir:svc 子进程 MEOW_LOG_DIR 注入(NULL 不注入)。 */ +typedef struct meow_bgplay_ops { + void (*log)(const char *fmt, ...); + uint64_t (*now_ms)(void); + int (*card_present)(void); + void (*on_bg_dead)(const char *app_id, pid_t pid, int status); + void (*on_svc_dead)(const char *app_id, const char *svc); + int (*notif_clear_app)(const char *app_id); + size_t (*send_frame)(int fd, uint16_t type, uint32_t req_id, + const void *payload, uint32_t len); + const char *log_dir; +} meow_bgplay_ops; + +/* 注入 ops(拷贝);NULL=全清空复位(含两张表)。launcher 在 meow_ipc_init 末尾调一次。 */ +void meow_bgplay_init(const meow_bgplay_ops *ops); + +/* ---- 后台播放保活判定(纯函数,无副作用)---- */ +/* 退出时是否转后台保活:声明 background_audio 且该 App 媒体会话正在播放。 */ +int meow_bg_should_keep(int bg_audio_declared, int media_playing); + +/* ---- 后台保活 App 表 ---- */ +/* 转后台:登记 app_id/pid/out_fd。返回 0=成功;MEOW_ERR_EXISTS=已在后台;MEOW_ERR_NOMEM=满。 */ +int meow_bg_add(const char *app_id, pid_t pid, int out_fd, int on_card); +/* 回前台:按 app_id 摘除槽(进程归还前台会话)。成功返回 0 且 *out_fd(可 NULL)带回 + * 管道读端;未在后台返回 -1。 */ +int meow_bg_take(const char *app_id, int *out_fd, pid_t *pid); +/* 该 App 是否在后台保活。 */ +int meow_bg_is_backgrounded(const char *app_id); +/* 当前后台保活数。 */ +int meow_bg_count(void); +/* 取第 i 槽(0..MEOW_BG_MAX-1)只读指针;空槽/越界返回 NULL。供 drain out_fd。 */ +const meow_bg_entry_t *meow_bg_at(int i); +/* 表变化计数(add/take/回收 递增);菜单 1s tick 比对刷新「·后台」标注用。 */ +uint32_t meow_bgplay_change_seq(void); + +/* 周期调(主循环 ~10ms 排空点):waitpid WNOHANG 回收死亡后台 App(→on_bg_dead 清槽); + * 卡拔例外:on_card 槽在卡不在时 SIGTERM,500ms 未死 SIGKILL。 */ +void meow_bg_tick(void); + +/* ---- 无头后台服务 ---- */ +/* 注册/拉起服务。exec 须可执行(先 access(X_OK),拒绝返回 MEOW_ERR_NOENT 不污染槽)。 + * 返回 pid(>0)=已拉起;MEOW_ERR_EXISTS=同名服务在跑;MEOW_ERR_NOENT=exec 不可执行; + * MEOW_ERR_NOMEM=槽满;MEOW_ERR_IO=fork 失败。同 svc 已熔断槽重注册=复位熔断重新拉起。 */ +int meow_svc_register(const char *app_id, const char *svc, const char *exec, + int restart, int max_restart, int window_ms, + int on_card, int reg_fd); +/* 请求停止服务:SIGTERM,标记 stopping(不触发重启)。返回 0=已受理;MEOW_ERR_NOENT=无此服务。 */ +int meow_svc_stop(const char *app_id, const char *svc); +/* 查服务槽(只读);无返回 NULL。 */ +const meow_svc_rt_t *meow_svc_find(const char *app_id, const char *svc); +/* 周期调:回收死亡子进程;按 restart/退避档 1/2/4/10s 重启;滑窗复位计数;超 + * max_restart 熔断(notif_clear_app + send_frame MSG_SYS{SVC_DEAD} + circuit=1); + * 卡拔:on_card 槽 SIGTERM + stopping=1(exec 随卡消失,不重启防空转)。 */ +void meow_svc_tick(void); + +/* 关机前回收:向各服务注册连接广播 MSG_SYS{SHUTDOWN}(best-effort),随后全部 + * bg/svc 子进程 SIGTERM→有界等 1s→SIGKILL→有界 reap。调用方负责 unlink NOTIF_ACTIVE。 */ +void meow_bgplay_kill_all(void); + +/* 调试打印(经 ops->log,每槽一行)。 */ +void meow_bgplay_dump(const char *prefix); + +#endif /* MEOW_BGPLAY_H */ diff --git a/patch_v2/meow_launcherd/meow_ipc.h b/patch_v2/meow_launcherd/meow_ipc.h index b4963ed..e9172a9 100644 --- a/patch_v2/meow_launcherd/meow_ipc.h +++ b/patch_v2/meow_launcherd/meow_ipc.h @@ -13,10 +13,11 @@ * uint32_t len; = payload 字节数 * }; * - * 本阶段(D · M0+M1+M2+M3+M4 前置)通讯子集:MSG_HELLO/ACK/ERR + MSG_ACT_DECLARE/QUERY/RESULT + + * 本阶段(D · M0+M1+M2+M3+M4)通讯子集:MSG_HELLO/ACK/ERR + MSG_ACT_DECLARE/QUERY/RESULT + * MSG_ACT_FOCUS/BACK + MSG_NOTIFY/PROGRESS/QUERY/DISMISS* + MSG_NAV(导航栈上报/退出) - * + MSG_META/MSG_PLAYCTL(媒体会话,阶段 D 附录 B)。 - * picker(0x0070/0x0071)仅预留协议位,本批不实现。 + * + MSG_META/MSG_PLAYCTL(媒体会话,阶段 D 附录 B) + * + MSG_REGISTER/SERVICE_OK/SERVICE_STOP/MSG_SYS(后台服务注册/停止/熔断事件,M4)。 + * picker(0x0070/0x0071)已落地(二期)。 */ #ifndef MEOW_IPC_H #define MEOW_IPC_H @@ -157,6 +158,38 @@ typedef struct m_err { char msg[64]; } m_err_t; +/* ================= 后台服务注册(M4,FRAMEWORK_DESIGN §9) = */ + +/* MSG_REGISTER ↑:无头后台服务注册。调用方(App 前台进程)须: + * ① app.json 声明 `background=true` 或 HELLO flags 含 MF_BACKGROUND(否则 ERR_PERM); + * ② app.json `service.=mode:restart:max:window_ms` 静态声明该服务(否则 ERR_NOENT); + * ③ 注册后保持 IPC 连接不断(launcher 以连接存活做熔断广播的投递判定)。 + * svc=NUL 结尾服务名(≤15 字符);flags 按位:MF_BACKGROUND(申请后台常驻)。 */ +typedef struct m_register { + char app_id[MEOW_APP_ID_MAX]; /* 32 */ + char svc[16]; /* 服务名(app.json service.) */ + uint32_t flags; /* MF_BACKGROUND 等 */ +} m_register_t; /* 52 B */ + +/* MSG_SERVICE_OK ↓:用 m_ack_t(code=0;status=服务子进程 pid)。 */ + +/* MSG_SERVICE_STOP ↑:请求停止自己已注册的服务(SIGTERM,不触发重启)。 */ +typedef struct m_service_stop { + char app_id[MEOW_APP_ID_MAX]; /* 32 */ + char svc[16]; +} m_service_stop_t; /* 48 B */ + +/* MSG_SYS ↓:系统事件广播(守护关闭/服务死亡/播放器状态)。 + * event:MEOW_SYS_*;app_id/svc 为事件主体(SHUTDOWN 时可空)。 */ +enum { MEOW_SYS_SHUTDOWN = 1, /* 守护进程即将关闭(关机/重启前回收) */ + MEOW_SYS_SVC_DEAD = 2, /* 后台服务熔断(超 max_restart 不再拉起) */ + MEOW_SYS_PLAYER_STATE = 3 }; /* 播放器状态变更(预留) */ +typedef struct m_sys { + uint32_t event; /* MEOW_SYS_* */ + char app_id[MEOW_APP_ID_MAX]; /* 32 */ + char svc[16]; /* SVC_DEAD 时为熔断服务名 */ +} m_sys_t; /* 52 B */ + /* MSG_ACT_QUERY ↑:解析某 app 的 activity 链路 */ typedef struct m_act_query { char app_id[MEOW_APP_ID_MAX]; diff --git a/patch_v2/meow_launcherd/meow_launcher_internal.h b/patch_v2/meow_launcherd/meow_launcher_internal.h index 36e946a..3b1df20 100644 --- a/patch_v2/meow_launcherd/meow_launcher_internal.h +++ b/patch_v2/meow_launcherd/meow_launcher_internal.h @@ -37,6 +37,7 @@ extern "C" { #include "meow_settings.h" /* B2a:统一系统设置后端(SYSTEM_SETTINGS.md §3/MEOWOS_API §2) */ #include "meow_notif.h" /* M2a:通知存储 + 分发(NOTIFICATION_SYSTEM.md §4/§7/§8) */ #include "meow_media.h" /* 阶段D附录B:媒体会话注册表(MSG_META/MSG_PLAYCTL/最近活跃源) */ +#include "meow_bgplay.h" /* M4:后台播放保活 + 无头后台服务运行时表(§9) */ #include "meow_ui.h" /* A-1/A-2:launcher 用 SDK 渲染栈(meow_ui_fill_rect/text/flush/theme) */ #include "meow_ui_internal.h" /* A-1/A-2:launcher 与 SDK 共用 back_buf + 手动脏模型桥接(mark_full/back_buf) */ #include "meow_notif_panel.h" /* 阶段B:通知中心面板纯逻辑(header-only,可单测) */ @@ -305,6 +306,8 @@ struct app { char immersive; /* '1'=immersive=true(隐藏虚拟返回键,返回手势归 SDK) */ char fullscreen; /* '1'=app.json fullscreen=true(注入 MEOW_FULLSCREEN=1,SDK 预先设全屏) */ char fonts; /* 字库档:0=默认4K常用 1=大字库GBK 2=Full(app.json "fonts";注入 MEOW_FONT_TIER) */ + char background; /* M4:'1'=app.json background=true(可注册无头后台服务) */ + char background_audio; /* M4:'1'=background_audio=true(播放中退出转后台保活,§9) */ char icon[129]; /* icon= 路径 */ int nroute; /* route. 行数 */ struct meow_route routes[MEOW_MAX_ROUTES]; @@ -327,6 +330,8 @@ struct meow_acct { int nsvc; struct meow_svc svcs[MEOW_MAX_SVCS]; int declared; /* 是否经 HELLO/ACT_DECLARE 运行时声明过 */ + char background; /* M4:'1'=app.json background=true(MSG_REGISTER 权限位0) */ + char background_audio; /* M4:'1'=background_audio=true(MSG_REGISTER MF_PLAYBACK 权限位1) */ }; @@ -663,6 +668,19 @@ int meow_ams_pending_start_set_ex(const char *pkg, const char *act, * util.c 转发运行时 declare 与 picker call/result 给 amsd 用。 */ void meow_ams_send(const char *payload, int len); +/* ---- M4 后台保活/后台服务胶水(app_launcher.c 实现;util.c/main_menu.c 消费)---- */ +/* launcher 侧 meow_bgplay ops 组装(meow_ipc_init 末尾调一次)。 */ +void meow_bgplay_launcher_init(void); +/* 后台表周期维护:drain 各 bg App 的 stdout 管道 + meow_bg_tick + meow_svc_tick。 + * 挂载点=meow_ipc_process 末尾(主循环单写者排空点,四处循环都经它)。 */ +void meow_bg_housekeep(void); +/* 查静态声明的 service.;无返回 NULL。 */ +const struct meow_svc *meow_acct_svc_find(const struct meow_acct *ac, const char *svc); +/* 后台权限位:bit0=background(可注册服务)bit1=background_audio(后台音频)。 */ +int meow_acct_background_perm(const struct meow_acct *ac); +/* M4:服务 exec 路径约定 = App 二进制同目录下的 名文件。 */ +void meow_svc_exec_path(const char *app_exec, const char *svc, char *out, int olen); + void meow_dac_vol_write(int pct); void meow_dac_vol_write_throttled(void); void meow_dirty_add(int x, int y, int w, int h); @@ -680,6 +698,11 @@ void meow_font_scan_presets(void); void meow_font_scan_presets_root(const char *card_root); int meow_ipc_init(void); void meow_ipc_process(void); +/* M4:IPC 连接存活查询(熔断广播投递前判连接未断;util.c ipc_conns 表查 fd)。 */ +int meow_ipc_conn_alive(int fd); +/* M4:ipc_send 公开包装(meow_bgplay send_frame 回调用;同 meow_media 的注入口径)。 */ +size_t meow_ipc_send_pub(int fd, uint16_t type, uint32_t req_id, + const void *payload, uint32_t len); /* §10.5:读并清除待处理的 MSG_NOTIF_OPEN(App 前台顶部下滑请求展开通知中心叠加会话)。 * 调用方=launch_app waitpid 循环;返回 1 并填 *out(待处理),0=无。 */ int meow_notif_open_take(m_notif_open_t *out); diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 90d73ac94ac307fd513e3199fae057c849b20122..43a7ab90d40f06a33dc51baa97bb3b8dcaaa1404 100755 GIT binary patch delta 210969 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 z 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�ZxKJu=z8L5F7%l!TirLLa+kt0K33`Z~`0y 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

H!qs- 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 Ys^t@7@67h+pLgG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "meow_bgplay.h" +#include "meow_media.h" +#include "meow_ipc.h" + +static int g_fails = 0; +#define CHECK(cond, msg) do { \ + if (cond) printf("PASS: %s\n", msg); \ + else { printf("FAIL: %s\n", msg); g_fails++; } } while (0) + +/* ---- 假件(ops 注入)---- */ +static uint64_t g_ms = 100000; /* 假时钟(退避断言用,手动推进) */ +static int g_card = 1; /* 卡在位 */ +static int g_bg_dead = 0; /* on_bg_dead 计数 */ +static int g_bg_dead_status = 0; +static char g_bg_dead_app[MEOW_APP_ID_MAX]; +static int g_notif_cleared = 0; /* notif_clear_app 计数 */ +static char g_notif_cleared_app[MEOW_APP_ID_MAX]; + +static uint64_t fake_now_ms(void) { return g_ms; } +static int fake_card(void) { return g_card; } +static void fake_bg_dead(const char *app_id, pid_t pid, int status) +{ + (void)pid; + g_bg_dead++; + g_bg_dead_status = status; + snprintf(g_bg_dead_app, sizeof g_bg_dead_app, "%s", app_id); +} +static int fake_notif_clear(const char *app_id) +{ + g_notif_cleared++; + snprintf(g_notif_cleared_app, sizeof g_notif_cleared_app, "%s", app_id); + return 1; +} +/* send_frame:整帧写到 fd(socketpair 一端),对端读回校验。 */ +static size_t fake_send_frame(int fd, uint16_t type, uint32_t req_id, + const void *payload, uint32_t len) +{ + uint8_t hdr[MEOW_IPC_HDR_LEN]; + uint32_t magic = MEOW_IPC_MAGIC, rid = req_id, l = len; + uint16_t ver = MEOW_IPC_VERSION, t = type; + size_t off = 0; + + memcpy(hdr + 0, &magic, 4); memcpy(hdr + 4, &ver, 2); memcpy(hdr + 6, &t, 2); + memcpy(hdr + 8, &rid, 4); memcpy(hdr + 12, &l, 4); + if (write(fd, hdr, sizeof hdr) != (ssize_t)sizeof hdr) return 0; + off = sizeof hdr; + if (len && payload && write(fd, payload, len) > 0) off += len; + return off; +} +/* media ops.send 同 fake_send_frame(PLAYCTL 下发校验用) */ + +/* 从 socketpair 读一帧(poll 500ms 防挂)。返回负载字节数,<0=超时/失败。 */ +static int read_frame(int fd, uint16_t *type, void *pay, int paycap) +{ + struct pollfd pf = { .fd = fd, .events = POLLIN, .revents = 0 }; + uint8_t hdr[MEOW_IPC_HDR_LEN]; + uint32_t len; + + if (poll(&pf, 1, 500) <= 0) return -1; + if (read(fd, hdr, sizeof hdr) != (ssize_t)sizeof hdr) return -1; + memcpy(type, hdr + 6, 2); + memcpy(&len, hdr + 12, 4); + if (len > (uint32_t)paycap) return -1; + if (len && read(fd, pay, len) != (ssize_t)len) return -1; + return (int)len; +} + +/* fork 一个长眠子进程(300s),测试末统一 SIGKILL 清理。 */ +static pid_t spawn_sleeper(void) +{ + pid_t pid = fork(); + if (pid == 0) { sleep(300); _exit(0); } + return pid; +} + +/* 泵 tick 直到 cond 或超时(~2s):子进程死亡到 WNOHANG 可见有调度延迟。 */ +static int pump_bg_until(int (*cond)(void *), void *ctx) +{ + for (int i = 0; i < 100; i++) { + meow_bg_tick(); + if (cond(ctx)) return 1; + usleep(20000); + } + return 0; +} +static int pump_svc_until(int (*cond)(void *), void *ctx) +{ + for (int i = 0; i < 100; i++) { + meow_svc_tick(); + if (cond(ctx)) return 1; + usleep(20000); + } + return 0; +} +static int cond_bg_dead(void *ctx) { (void)ctx; return g_bg_dead > 0; } +static int cond_svc_reaped(void *ctx) +{ + const meow_svc_rt_t *s; + (void)ctx; + s = meow_svc_find("dev.test.svc", "daemon"); + return s && s->pid == 0; +} +static int cond_svc_gone(void *ctx) +{ + (void)ctx; + return meow_svc_find("dev.test.svc", "daemon") == NULL; +} + +/* 服务测试用长命可执行:shell 脚本 exec sleep 300(svc_spawn 内部 execve 走 shebang)。 */ +#define TEST_SVC_PATH "/tmp/meow_bgplay_test_svc.sh" +static void write_test_svc(void) +{ + FILE *f = fopen(TEST_SVC_PATH, "w"); + fputs("#!/bin/sh\nexec sleep 300\n", f); + fclose(f); + chmod(TEST_SVC_PATH, 0755); +} + +int main(void) +{ + meow_bgplay_ops ops; + meow_media_ops mops; + + memset(&ops, 0, sizeof ops); + ops.now_ms = fake_now_ms; + ops.card_present = fake_card; + ops.on_bg_dead = fake_bg_dead; + ops.notif_clear_app = fake_notif_clear; + ops.send_frame = fake_send_frame; + ops.log_dir = NULL; + meow_bgplay_init(&ops); + + memset(&mops, 0, sizeof mops); + mops.send = fake_send_frame; + meow_media_init(&mops); + + /* ---- 1) should_keep 判定矩阵 ---- */ + CHECK(meow_bg_should_keep(0, 0) == 0, "should_keep(未声明,未播放)=0"); + CHECK(meow_bg_should_keep(1, 0) == 0, "should_keep(声明,未播放)=0"); + CHECK(meow_bg_should_keep(0, 1) == 0, "should_keep(未声明,播放)=0"); + CHECK(meow_bg_should_keep(1, 1) == 1, "should_keep(声明,播放)=1"); + + /* ---- 2) 后台播放保活全链路 ---- */ + int sp[2]; + CHECK(socketpair(AF_UNIX, SOCK_STREAM, 0, sp) == 0, "socketpair 建立"); + { + m_meta_t meta; + memset(&meta, 0, sizeof meta); + snprintf(meta.app_id, sizeof meta.app_id, "dev.test.bg1"); + meta.state = MEOW_MEDIA_PLAYING; + meta.dur_ms = 200000; + CHECK(meow_media_meta(&meta, sp[0]) == 0, "META 上报 PLAYING 注册媒体会话"); + } + CHECK(meow_media_app_playing("dev.test.bg1") == 1, "app_playing(bg1)=1"); + CHECK(meow_bg_should_keep(1, meow_media_app_playing("dev.test.bg1")) == 1, + "播放中退出 → 应保活"); + + pid_t kid = spawn_sleeper(); + CHECK(kid > 0, "fork 假 App 子进程"); + CHECK(meow_bg_add("dev.test.bg1", kid, sp[0], 0) == 0, "bg_add 转后台保活"); + CHECK(meow_bg_is_backgrounded("dev.test.bg1") == 1, "is_backgrounded=1"); + CHECK(meow_bg_count() == 1, "bg count=1"); + CHECK(kill(kid, 0) == 0, "后台化后进程仍存活(未 SIGTERM/SIGSTOP)"); + /* PLAYCTL 经会话 fd 往返(后台化不断连:进程/fd 均保留) */ + CHECK(meow_media_playctl_to("dev.test.bg1", 6, 0) == 0, "PLAYCTL 下发到后台 App 会话"); + { + uint16_t t = 0; + m_playctl_t pc; + int n = read_frame(sp[1], &t, &pc, sizeof pc); + CHECK(n == (int)sizeof pc && t == MSG_PLAYCTL && pc.cmd == 6, + "对端收到 MSG_PLAYCTL cmd=6(控制通道后台不断连)"); + } + { + int rfd = -1; + pid_t rpid = 0; + CHECK(meow_bg_take("dev.test.bg1", &rfd, &rpid) == 0 && rpid == kid && rfd == sp[0], + "bg_take 回前台(pid/fd 原样归还)"); + } + CHECK(meow_bg_is_backgrounded("dev.test.bg1") == 0 && meow_bg_count() == 0, + "take 后清槽"); + meow_media_clear("dev.test.bg1"); + { + m_meta_t meta; + memset(&meta, 0, sizeof meta); + snprintf(meta.app_id, sizeof meta.app_id, "dev.test.bg1"); + meta.state = MEOW_MEDIA_STOPPED; + meow_media_meta(&meta, sp[0]); + } + CHECK(meow_bg_should_keep(1, meow_media_app_playing("dev.test.bg1")) == 0, + "停播后再退出 → should_keep=0(真退 SIGTERM)"); + kill(kid, SIGKILL); waitpid(kid, NULL, 0); + close(sp[0]); close(sp[1]); + meow_media_clear("dev.test.bg1"); + + /* ---- 3) 后台 App 崩溃照收 ---- */ + g_bg_dead = 0; + kid = spawn_sleeper(); + CHECK(meow_bg_add("dev.test.crash", kid, -1, 0) == 0, "bg_add(crash)"); + kill(kid, SIGKILL); + { + int ok = pump_bg_until(cond_bg_dead, NULL); + (void)ok; + } + CHECK(g_bg_dead == 1 && strcmp(g_bg_dead_app, "dev.test.crash") == 0 && + WIFSIGNALED(g_bg_dead_status) && WTERMSIG(g_bg_dead_status) == SIGKILL, + "崩溃子进程被 tick 回收 + on_bg_dead(SIGKILL) 回调"); + CHECK(meow_bg_count() == 0, "崩溃回收后清槽"); + + /* ---- 4) 卡拔例外:on_card=1 + 卡不在 → SIGTERM 回收 ---- */ + g_bg_dead = 0; + kid = spawn_sleeper(); + CHECK(meow_bg_add("dev.test.card", kid, -1, 1) == 0, "bg_add(on_card=1)"); + g_card = 0; + pump_bg_until(cond_bg_dead, NULL); + CHECK(g_bg_dead == 1 && strcmp(g_bg_dead_app, "dev.test.card") == 0, + "卡拔 → 卡上后台 App SIGTERM 回收(防 SIGBUS)"); + g_card = 1; + + /* ---- 5) 表满 / 重复 ---- */ + { + pid_t k[MEOW_BG_MAX]; + char id[MEOW_APP_ID_MAX]; + int i, full = 0; + for (i = 0; i < MEOW_BG_MAX; i++) { + k[i] = spawn_sleeper(); + snprintf(id, sizeof id, "dev.test.full%d", i); + meow_bg_add(id, k[i], -1, 0); + } + snprintf(id, sizeof id, "dev.test.full%d", MEOW_BG_MAX); + { + pid_t extra = spawn_sleeper(); + full = (meow_bg_add(id, extra, -1, 0) == MEOW_ERR_NOMEM); + kill(extra, SIGKILL); waitpid(extra, NULL, 0); /* 未入表,就地清理 */ + } + CHECK(full, "bg 表满 → MEOW_ERR_NOMEM"); + snprintf(id, sizeof id, "dev.test.full%d", 0); + CHECK(meow_bg_add(id, 0, -1, 0) == MEOW_ERR_INVAL, "pid<=0 → INVAL"); + CHECK(meow_bg_add(id, k[0], -1, 0) == MEOW_ERR_EXISTS, "重复 app_id → EXISTS"); + for (i = 0; i < MEOW_BG_MAX; i++) { + snprintf(id, sizeof id, "dev.test.full%d", i); + meow_bg_take(id, NULL, NULL); + kill(k[i], SIGKILL); waitpid(k[i], NULL, 0); + } + } + CHECK(meow_bg_count() == 0, "take 全部后 bg 表空"); + + /* ================= 无头后台服务 ================= */ + write_test_svc(); + + /* ---- 6) 注册校验 ---- */ + CHECK(meow_svc_register("dev.test.svc", "daemon", "/nonexistent/x", 1, 2, 60000, 0, -1) + == MEOW_ERR_NOENT, "exec 不可执行 → NOENT(不留尸槽)"); + CHECK(meow_svc_find("dev.test.svc", "daemon") == NULL, "NOENT 后无槽残留"); + + int sp_svc[2]; + CHECK(socketpair(AF_UNIX, SOCK_STREAM, 0, sp_svc) == 0, "svc socketpair 建立"); + int pid1 = meow_svc_register("dev.test.svc", "daemon", TEST_SVC_PATH, + 1, 2, 60000, 0, sp_svc[0]); + CHECK(pid1 > 0, "register 拉起服务"); + CHECK(meow_svc_register("dev.test.svc", "daemon", TEST_SVC_PATH, 1, 2, 60000, 0, sp_svc[0]) + == MEOW_ERR_EXISTS, "同名服务在跑 → EXISTS"); + + /* ---- 7) 退避 1s/2s + max=2 熔断 ---- */ + const meow_svc_rt_t *sl; + kill(pid1, SIGKILL); + pump_svc_until(cond_svc_reaped, NULL); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->pid == 0 && sl->restart_count == 1 && + sl->next_retry_ms == g_ms + MEOW_SVC_BACKOFF_1, + "第 1 次死 → 1s 退避排程(restart_count=1)"); + g_ms += MEOW_SVC_BACKOFF_1; + meow_svc_tick(); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->pid > 0 && sl->pid != pid1, "到点重启:新 pid"); + + pid_t pid2 = sl->pid; + kill(pid2, SIGKILL); + pump_svc_until(cond_svc_reaped, NULL); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->pid == 0 && sl->restart_count == 2 && + sl->next_retry_ms == g_ms + MEOW_SVC_BACKOFF_2, + "第 2 次死 → 2s 退避排程(restart_count=2)"); + g_ms += MEOW_SVC_BACKOFF_2; + meow_svc_tick(); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->pid > 0, "第 2 次重启拉起"); + + g_notif_cleared = 0; + kill(sl->pid, SIGKILL); + pump_svc_until(cond_svc_reaped, NULL); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->pid == 0 && sl->circuit == 1 && sl->restart_count == 3, + "第 3 次死超 max_restart=2 → 熔断 circuit=1"); + CHECK(g_notif_cleared == 1 && strcmp(g_notif_cleared_app, "dev.test.svc") == 0, + "熔断清该 App 通知(notif_clear_app 回调)"); + { + uint16_t t = 0; + m_sys_t m; + int n = read_frame(sp_svc[1], &t, &m, sizeof m); + CHECK(n == (int)sizeof m && t == MSG_SYS && m.event == MEOW_SYS_SVC_DEAD && + strcmp(m.svc, "daemon") == 0, + "注册连接收到 MSG_SYS{SVC_DEAD=2} 熔断广播"); + } + g_ms += 60000; + meow_svc_tick(); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->pid == 0, "熔断后不再拉起"); + + /* 重注册复位熔断 */ + int pid4 = meow_svc_register("dev.test.svc", "daemon", TEST_SVC_PATH, + 1, 2, 60000, 0, sp_svc[0]); + CHECK(pid4 > 0, "熔断槽重注册 → 复位重新拉起"); + sl = meow_svc_find("dev.test.svc", "daemon"); + CHECK(sl && sl->circuit == 0 && sl->restart_count == 0, "熔断复位(circuit/count 清零)"); + + /* ---- 8) SERVICE_STOP:不重启 ---- */ + CHECK(meow_svc_stop("dev.test.svc", "daemon") == 0, "svc_stop 受理"); + pump_svc_until(cond_svc_gone, NULL); + CHECK(meow_svc_find("dev.test.svc", "daemon") == NULL, "stop 后槽释放(不重启)"); + CHECK(meow_svc_stop("dev.test.svc", "daemon") == MEOW_ERR_NOENT, "重复 stop → NOENT"); + close(sp_svc[0]); close(sp_svc[1]); + + /* ---- 9) kill_all:全回收 + SHUTDOWN 广播 ---- */ + { + int sp2[2]; + socketpair(AF_UNIX, SOCK_STREAM, 0, sp2); + int spid = meow_svc_register("dev.test.svc", "daemon", TEST_SVC_PATH, + 1, 3, 60000, 0, sp2[0]); + pid_t bgk = spawn_sleeper(); + meow_bg_add("dev.test.bg9", bgk, -1, 0); + CHECK(spid > 0 && meow_bg_count() == 1, "kill_all 前置:1 svc + 1 bg"); + meow_bgplay_kill_all(); + CHECK(meow_bg_count() == 0 && meow_svc_find("dev.test.svc", "daemon") == NULL, + "kill_all 后 bg/svc 全回收"); + CHECK(kill(spid, 0) < 0 && kill(bgk, 0) < 0, "子进程确已终止"); + uint16_t t = 0; + m_sys_t m; + int n = read_frame(sp2[1], &t, &m, sizeof m); + CHECK(n == (int)sizeof m && t == MSG_SYS && m.event == MEOW_SYS_SHUTDOWN, + "注册连接收到 MSG_SYS{SHUTDOWN=1}(关机前回收广播)"); + close(sp2[0]); close(sp2[1]); + } + + unlink(TEST_SVC_PATH); + printf(g_fails ? "== FAILURES: %d ==\n" : "== ALL PASS ==\n", g_fails); + return g_fails ? 1 : 0; +} diff --git a/patch_v2/meow_launcherd/util.c b/patch_v2/meow_launcherd/util.c index 792c78f..ee79f4f 100644 --- a/patch_v2/meow_launcherd/util.c +++ b/patch_v2/meow_launcherd/util.c @@ -870,6 +870,22 @@ static pthread_t ipc_pthread; static struct meow_ipc_conn ipc_conns[MEOW_IPC_CONNS]; +/* M4:连接存活跟踪(ipc_thread 单写者维护计数;主循环 meow_ipc_conn_alive 读)。 + * 竞态最坏=误判一帧(best-effort 熔断广播可接受;ipc_conns 前 ipc_conn_count 项恒为 + * 最新存活集,因关闭时shift压实)。 */ +static volatile int ipc_conn_count = 0; + +/* M4:查 fd 是否为当前存活 IPC 连接(熔断广播 MSG_SYS 投递前判定,防发到已断连接)。 */ +int meow_ipc_conn_alive(int fd) +{ + int n = ipc_conn_count; + if (fd < 0) return 0; + if (n > MEOW_IPC_CONNS) n = MEOW_IPC_CONNS; + for (int i = 0; i < n; i++) + if (ipc_conns[i].fd == fd) return 1; + return 0; +} + /* §10.5:待处理的 App 前台「展开通知中心」请求(ipc_dispatch 单写者置位;launch_app waitpid * 循环 meow_notif_open_take 读取并清除)。仅当 g_app_session_active(App 前台会话)期间才置位, * 否则回 ERR(无 App 前台,不展开)。 */ @@ -1046,6 +1062,7 @@ static void *ipc_thread(void *arg) fds[nfds].events = POLLIN; fds[nfds].revents = 0; nfds++; + ipc_conn_count = nfds - 1; logmsg("ipc: conn %d accept (nfds=%d)", c, nfds - 1); } else { close(c); @@ -1066,6 +1083,7 @@ static void *ipc_thread(void *arg) ipc_conns[j - 1] = ipc_conns[j]; } nfds--; + ipc_conn_count = nfds - 1; continue; } } @@ -1091,6 +1109,9 @@ int meow_ipc_init(void) g_media_ops.log = logmsg; meow_media_init(&g_media_ops); + /* M4:注入后台保活/后台服务 ops(logmsg/sd_device_present/通知清理/熔断发帧)。 */ + meow_bgplay_launcher_init(); + ipc_event_fd = eventfd(0, EFD_NONBLOCK); if (ipc_event_fd < 0) logmsg("ipc: eventfd fail %s (10ms poll drains anyway)", strerror(errno)); @@ -1119,6 +1140,9 @@ void meow_ipc_process(void) ipc_head++; } __sync_synchronize(); + /* M4:后台表周期维护挂点(主循环单写者排空点,run_menu/前台会话/idle/ipc-only + * 四处循环都经此处)——drain 后台 App stdout + 回收/卡拔 + 服务退避重启。 */ + meow_bg_housekeep(); } @@ -1269,6 +1293,72 @@ static void ipc_dispatch(struct meow_ipc_msg *m) n.app_id, n.nav_type, n.depth, n.current); break; } + /* M4 后台服务注册(FRAMEWORK_DESIGN §5/§9):无头服务 spawn/退避重启/熔断。 + * 校验链:acct 存在且 exec 非空(NOENT)→ 权限(app.json background=true 或 + * flags 含 MF_BACKGROUND,否则 PERM)→ service. 静态声明存在(NOENT)→ + * meow_svc_register 拉起。成功回 MSG_SERVICE_OK(m_ack_t:code=0,status=pid); + * 失败回 MSG_ERR(仿 ACT_QUERY 模式)。注册后调用方须保持连接(熔断广播投递判定)。 */ + case MSG_REGISTER: { + m_register_t r; + memset(&r, 0, sizeof r); + memcpy(&r, m->payload, m->plen < (uint16_t)sizeof r ? m->plen : (uint16_t)sizeof r); + r.app_id[MEOW_APP_ID_MAX - 1] = 0; + r.svc[15] = 0; + struct meow_acct *ac = meow_acct_find(r.app_id); + const struct meow_svc *sv = ac ? meow_acct_svc_find(ac, r.svc) : NULL; + int code = MEOW_OK; + int pid = 0; + if (!ac || !ac->exec[0]) + code = MEOW_ERR_NOENT; + else if (!(meow_acct_background_perm(ac) & 1) && !(r.flags & MF_BACKGROUND)) + code = MEOW_ERR_PERM; + else if (!sv) + code = MEOW_ERR_NOENT; + else { + char sexec[160]; + meow_svc_exec_path(ac->exec, r.svc, sexec, sizeof sexec); + pid = meow_svc_register(r.app_id, r.svc, sexec, + sv->restart, sv->max, sv->window_ms, + strncmp(sexec, MEOWAPPS, strlen(MEOWAPPS)) == 0, + m->fd); + if (pid < 0) { code = pid; pid = 0; } + } + if (code == MEOW_OK) { + m_ack_t a; + a.code = MEOW_OK; + a.status = (uint32_t)pid; /* 服务子进程 pid */ + ipc_send(m->fd, MSG_SERVICE_OK, m->req_id, &a, sizeof a); + logmsg("ipc: REGISTER app=%s svc=%s -> SERVICE_OK pid=%d", r.app_id, r.svc, pid); + } else { + m_err_t e; + memset(&e, 0, sizeof e); + e.code = (uint32_t)code; + const char *msg = (code == MEOW_ERR_PERM) ? "no background permission" + : (code == MEOW_ERR_EXISTS) ? "service already running" + : (code == MEOW_ERR_NOMEM) ? "service slots full" + : "app/service not found"; + e.msg_len = (uint16_t)strlen(msg); + memcpy(e.msg, msg, e.msg_len); + ipc_send(m->fd, MSG_ERR, m->req_id, &e, sizeof e); + logmsg("ipc: REGISTER app=%s svc=%s -> ERR(%d)", r.app_id, r.svc, code); + } + break; + } + /* M4:请求停止自己已注册的无头服务(SIGTERM,标记 stopping 不触发退避重启)。 */ + case MSG_SERVICE_STOP: { + m_service_stop_t s; + memset(&s, 0, sizeof s); + memcpy(&s, m->payload, m->plen < (uint16_t)sizeof s ? m->plen : (uint16_t)sizeof s); + s.app_id[MEOW_APP_ID_MAX - 1] = 0; + s.svc[15] = 0; + int rc = meow_svc_stop(s.app_id, s.svc); + m_ack_t a; + a.code = (uint32_t)(rc < 0 ? -rc : MEOW_OK); + a.status = 0; + ipc_send(m->fd, MSG_ACK, m->req_id, &a, sizeof a); + logmsg("ipc: SERVICE_STOP app=%s svc=%s -> ACK code=%u", s.app_id, s.svc, a.code); + break; + } /* AMSD_DESIGN §4.3:amsd `am start`/`am kill` 控制请求。主循环单写者仅置位 pending * (run_menu 前台循环 / launch_* waitpid 循环消费),不回执启动结果(一期 best-effort)。 */ case MSG_AMS_START: { diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index f0d4716..cbb919d 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -28,7 +28,7 @@ # ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)---- patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|4441822d87e76bfce2ce584604ac3830|引导选单 M2.85(sysui让位 agent-216) -patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|1332c67f4dba8727feae1c93f22fc848|主屏 launcher M2.95+(§10.5 叠加媒体保活:前台 App 播放中开通知中心不 SIGSTOP,SDK present/输入见 /tmp/meow_notif_active 自抑) +patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|c07d011c0769fca14d3bfb752d735463|主屏 launcher M4(后台服务保活+后台播放:MSG_REGISTER/SERVICE_STOP/MSG_SYS 退避熔断;nav-exit 播放中转后台保活,SDK present 自抑非 SIGSTOP) patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|553840cdc79d8d7bed766a5e3981ac57|应用看门狗 M2.95(+音量反转修复) patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|605646c4cc93f2baf29071ea6bc870ea|服务管理器 M2.77(+崩溃上报 meow_crash agent-187) mips-repo/bins/meow_mdns/bin/meow_mdns|/usr/bin/meow_mdns|d6b0151bda26768f19952dae1342610d|mDNS 应答器 M2.78(启动竞态+换IP重检 agent-194)