/* meow_bgmgr.c — 批③ 后台管理页 逻辑层(数据汇聚 + kill 门控)。实现见 meow_bgmgr.h。 * 纯 C(无 launcher static/SDK 依赖),宿主 gcc 直编:gcc -Wall -Wextra -std=gnu99 \ * test_bgmgr.c meow_bgmgr.c -o test_bgmgr。 */ #include "meow_bgmgr.h" #include #include int bgmgr_collect(const bgmgr_ops_t *ops, bgmgr_row_t *rows, int max) { if (!ops || !ops->enumerate || !ops->app_meta || !rows || max <= 0) return 0; int n = ops->enumerate(ops->ctx, rows, max); if (n < 0) n = 0; if (n > max) n = max; for (int i = 0; i < n; i++) { bgmgr_row_t *r = &rows[i]; r->framework = 0; r->is_fg = 0; r->name[0] = 0; r->icon[0] = 0; r->pcpu = 0.0; r->rss_kb = 0; ops->app_meta(ops->ctx, r->app_id, r->pid, r->name, (int)sizeof r->name, r->icon, (int)sizeof r->icon, &r->framework, &r->is_fg); if (!r->name[0]) snprintf(r->name, sizeof r->name, "%s", r->app_id); if (ops->proc_sample && ops->proc_sample(ops->ctx, r->pid, &r->pcpu, &r->rss_kb) < 0) { r->pcpu = 0.0; r->rss_kb = 0; } r->killable = bgmgr_can_kill(r); } return n; } int bgmgr_can_kill(const bgmgr_row_t *r) { if (!r) return 0; if (r->framework) return 0; /* 框架/系统 App 不 kill(铁律) */ if (r->is_fg) return 0; /* 当前前台 App 不 kill */ if (r->pid <= 0) return 0; /* 非后台/无进程 */ return 1; } int bgmgr_kill_all(const bgmgr_ops_t *ops, bgmgr_row_t *rows, int n, void (*kill_fn)(const char *app_id)) { (void)ops; if (!kill_fn) return 0; int k = 0; for (int i = 0; i < n; i++) { if (bgmgr_can_kill(&rows[i])) { kill_fn(rows[i].app_id); k++; } } return k; } const char *bgmgr_status_str(const bgmgr_row_t *r) { if (!r) return ""; if (r->is_fg) return "前台"; if (r->keepalive) return "常驻"; return "后台"; } const char *bgmgr_mem_str(long rss_kb) { static char buf[24]; if (rss_kb >= 1024) snprintf(buf, sizeof buf, "%.1fMB", (double)rss_kb / 1024.0); else snprintf(buf, sizeof buf, "%ldKB", rss_kb); return buf; }