feat(launcher): M4 后台服务保活+后台播放(FRAMEWORK_DESIGN §5/§9 落地)
- 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 同目录 <svc> 文件)
- 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
This commit is contained in:
1 parent
7db8197f9c
commit
5aabede0cd
13 files changed
+1461
-40
No files matched your search
@@ -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.<svc>=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.<svc>) */
|
||||
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];
|
||||
|
||||
Reference in new issue
Block a user