feat(bt): 批①宽限期补充 — 全App入后台表(bg_since_ms)+未声明App宽限30min(MEOW_BG_GRACE_MS)超时回收+声明常驻/媒体活跃不清+槽满LRU回收最旧未声明;test_bgplay全过/0warning;devdocs APP_BACKGROUND_KEEPALIVE_P1 §9;M6.34需先重编meow_ui.a(meow_img_pixels)

This commit is contained in:
AskaEth committed 2026-09-04 01:48:31 +08:00
1 parent effce6d0db
commit 45c633868f
4 files changed
+264 -62

No files matched your search

+21 -13
View File
@@ -479,6 +479,7 @@ void meow_bgplay_launcher_init(void)
ops.now_ms = NULL; /* 内部 CLOCK_MONOTONIC */
ops.card_present = sd_device_present;
ops.on_bg_dead = bg_on_dead;
ops.media_resident = meow_media_app_resident; /* 批①+宽限:媒体活跃判定(宽限回收/槽满LRU) */
ops.on_svc_dead = NULL; /* 服务消亡日志 meow_bgplay 内已记 */
ops.notif_clear_app = bg_notif_clear_app;
ops.send_frame = bg_send_frame;
@@ -1964,22 +1965,29 @@ static int launch_app_chain(struct app *a, const char *chain)
break;
}
if (meow_nav_exit_pending()) {
/* 批①后台保活:声明 background_keepalive → 恒保活;或声明 background_audio 且该 App
* 媒体会话活跃(PLAYING/PAUSED/BUFFER,见 meow_media_app_resident)→ 保活。进程+音频流
* 保留转后台(UI 冻结走 §10.5 SDK present 自抑,**非 SIGSTOP**——SIGSTOP 会冻结同进程
* 播放线程断供 PCM,§10.5 真机实证)。登记失败(槽满/已存在)回落下方真退序列。
* 卡拔例外不适用保活(bg 表 tick 照杀)。 */
if (meow_bg_should_keep(a->background_audio == '1',
meow_media_app_resident(a->id),
a->background_keepalive == '1') &&
meow_bg_add(a->id, pid, out_fd, app_on_card,
a->background_keepalive == '1') == 0) {
logmsg("bg: app %s nav-exit -> 后台保活(活跃(播放/暂停/缓冲),pid=%d 保留,SDK present 自抑)",
a->name, (int)pid);
/* 批①+宽限后台保活:**全 App** nav-exit 入后台保活表(进程保留转后台,UI 冻结走 §10.5
* SDK present 自抑,**非 SIGSTOP**——SIGSTOP 会冻结同进程播放线程断供 PCM,§10.5 实证)。
* 分两类:
* - 声明常驻(background_keepalive=1)或媒体活跃(background_audio+PLAYING/PAUSED/BUFFER,
* 见 meow_media_app_resident)→ **无限期保活**(不清,除非用户手动/一键清);
* - 其余(未声明/媒体不活跃)→ **宽限期**(bg_grace_ms,默认30min)内保活,超时未再启动
* 由 meow_bg_tick 走真退序列回收。
* meow_bg_add 内含槽满 LRU 回收(最久未激活的未声明槽);全为声明常驻/媒体活跃 → NOMEM
* 回落下方真退序列(保安全)。kill 通道带 !a->framework 门控(批③)。 */
int bg_resident = meow_media_app_resident(a->id);
int r = meow_bg_add(a->id, pid, out_fd, app_on_card,
a->background_keepalive == '1');
if (r == 0 || r == MEOW_ERR_EXISTS) { /* 0=入表;EXISTS=本就驻留(幂等不重复登记不杀) */
logmsg("bg: app %s nav-exit -> 后台保活(%s,pid=%d 保留,SDK present 自抑)",
a->name,
((a->background_keepalive == '1') || bg_resident) ?
"声明常驻/媒体活跃(无限期)" : "宽限期(默认30min)",
(int)pid);
to_background = 1;
break;
}
logmsg("nav: app %s MSG_NAV{EXIT} -> terminate, return to home", a->name);
logmsg("nav: app %s MSG_NAV{EXIT} -> terminate, return to home(后台表满且无未声明槽可回收)",
a->name);
nav_clean_exit = 1;
kill(pid, SIGTERM);
usleep(300000);