feat(bt): 批①后台常驻框架实施 — meow_media_app_resident按app会话判活跃+should_keep三参(keepalive||bg_audio&&resident)+background_keepalive声明解析透传+amsd EV BG/FG上报;宿主test_media39/test_bgplay/test_bg_keep19全过,0warning;落盘APP_BACKGROUND_KEEPALIVE_P1;降配(nice)待真机未做
This commit is contained in:
1 parent
7e68313981
commit
f3ae06d7cd
10 files changed
+330
-30
No files matched your search
@@ -163,11 +163,15 @@ int main(void)
|
||||
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");
|
||||
/* ---- 1) should_keep 判定矩阵(批①三参:bg_audio, media_resident, keepalive) ---- */
|
||||
CHECK(meow_bg_should_keep(0, 0, 0) == 0, "should_keep(未声明,未活跃,非常驻)=0");
|
||||
CHECK(meow_bg_should_keep(1, 0, 0) == 0, "should_keep(声明bg_audio,无会话)=0");
|
||||
CHECK(meow_bg_should_keep(0, 1, 0) == 0, "should_keep(未声明bg_audio,活跃)=0");
|
||||
CHECK(meow_bg_should_keep(1, 1, 0) == 1, "should_keep(bg_audio+活跃)=1");
|
||||
CHECK(meow_bg_should_keep(0, 0, 1) == 1, "should_keep(keepalive恒保)=1");
|
||||
CHECK(meow_bg_should_keep(0, 1, 1) == 1, "should_keep(keepalive恒保,忽略media)=1");
|
||||
CHECK(meow_bg_should_keep(1, 0, 1) == 1, "should_keep(keepalive恒保,无会话)=1");
|
||||
CHECK(meow_bg_should_keep(1, 0, 0) == 0, "should_keep(bg_audio+resident=0 真退)=0");
|
||||
|
||||
/* ---- 2) 后台播放保活全链路 ---- */
|
||||
int sp[2];
|
||||
@@ -181,14 +185,20 @@ int main(void)
|
||||
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,
|
||||
CHECK(meow_media_app_resident("dev.test.bg1") == 1, "app_resident(bg1)=1");
|
||||
CHECK(meow_bg_should_keep(1, meow_media_app_resident("dev.test.bg1"), 0) == 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_add("dev.test.bg1", kid, sp[0], 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");
|
||||
{
|
||||
const meow_bg_entry_t *be = meow_bg_at(0);
|
||||
CHECK(be && be->bg_since_ms > 0, "bg 槽记 bg_since_ms(转后台时刻)");
|
||||
CHECK(be && be->keepalive == 0, "bg_audio 类 keepalive=0");
|
||||
}
|
||||
CHECK(kill(kid, 0) == 0, "后台化后进程仍存活(未 SIGTERM/SIGSTOP)");
|
||||
/* PLAYCTL 经会话 fd 往返(后台化不断连:进程/fd 均保留) */
|
||||
CHECK(meow_media_playctl_to("dev.test.bg1", 6, 0) == 0, "PLAYCTL 下发到后台 App 会话");
|
||||
@@ -215,16 +225,28 @@ int main(void)
|
||||
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,
|
||||
CHECK(meow_bg_should_keep(1, meow_media_app_resident("dev.test.bg1"), 0) == 0,
|
||||
"停播后再退出 → should_keep=0(真退 SIGTERM)");
|
||||
kill(kid, SIGKILL); waitpid(kid, NULL, 0);
|
||||
close(sp[0]); close(sp[1]);
|
||||
meow_media_clear("dev.test.bg1");
|
||||
|
||||
/* ---- 2b) keepalive 类(background_keepalive)入槽标记 ---- */
|
||||
{
|
||||
pid_t kk = spawn_sleeper();
|
||||
CHECK(meow_bg_add("dev.test.keep", kk, -1, 0, 1) == 0, "bg_add(keepalive=1)");
|
||||
const meow_bg_entry_t *bk = meow_bg_at(0);
|
||||
CHECK(bk && bk->keepalive == 1, "keepalive 类槽 keepalive=1");
|
||||
CHECK(bk && bk->bg_since_ms > 0, "keepalive 类槽 bg_since_ms>0");
|
||||
meow_bg_take("dev.test.keep", NULL, NULL);
|
||||
kill(kk, SIGKILL); waitpid(kk, NULL, 0);
|
||||
CHECK(meow_bg_count() == 0, "keepalive 槽 take 后清槽");
|
||||
}
|
||||
|
||||
/* ---- 3) 后台 App 崩溃照收 ---- */
|
||||
g_bg_dead = 0;
|
||||
kid = spawn_sleeper();
|
||||
CHECK(meow_bg_add("dev.test.crash", kid, -1, 0) == 0, "bg_add(crash)");
|
||||
CHECK(meow_bg_add("dev.test.crash", kid, -1, 0, 0) == 0, "bg_add(crash)");
|
||||
kill(kid, SIGKILL);
|
||||
{
|
||||
int ok = pump_bg_until(cond_bg_dead, NULL);
|
||||
@@ -238,7 +260,7 @@ int main(void)
|
||||
/* ---- 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)");
|
||||
CHECK(meow_bg_add("dev.test.card", kid, -1, 1, 0) == 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,
|
||||
@@ -253,18 +275,18 @@ int main(void)
|
||||
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);
|
||||
meow_bg_add(id, k[i], -1, 0, 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);
|
||||
full = (meow_bg_add(id, extra, -1, 0, 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");
|
||||
CHECK(meow_bg_add(id, 0, -1, 0, 0) == MEOW_ERR_INVAL, "pid<=0 → INVAL");
|
||||
CHECK(meow_bg_add(id, k[0], -1, 0, 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);
|
||||
@@ -356,7 +378,7 @@ int main(void)
|
||||
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);
|
||||
meow_bg_add("dev.test.bg9", bgk, -1, 0, 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,
|
||||
|
||||
Reference in new issue
Block a user