feat: M6.10–M6.19 批量收编 + M6.19 推卡验收

- M7 launcher 重写 5 期(虚拟化宫格/meow_theme 单一权威/横幅动画/自定义 PIN 键盘)
- OOM 通用化(cachegov 上收 SDK)、自动切歌根治、meowpanel jv_free 泄漏修复、Hello 滚动卡顿修复
- ncm 歌词 UI / 媒体通知封面 / 封面分辨率 640
- 5 bug 修复:ncm 后台化 UI 叠层+点击穿透、再进 ncm 桌面叠层、播放页新旧 UI 叠层抢刷脏区(meow_ui_gfx 恢复边沿整帧重画)、PIN 亮屏亮度跳(keys.c meow_panel_on 按 settings_brightness_clamped 恢复)、通知中心封面显歌单封面(cover.c save_cover_raw 加 is_song + 命中块守卫)
- 四 App 统一重链新 meow_ui.a 51caee4a;M6.19=0.8.19 固件 2d2331f2 推卡自刷验收全绿
This commit is contained in:
AskaEth committed 2026-09-03 12:16:01 +08:00
1 parent c2ee7626a4
commit 3d70a3dd2c
176 files changed
+15507 -597

No files matched your search

+95
View File
@@ -0,0 +1,95 @@
/* bench/mem_watch_sim.c — 宿主「边播监控取证」阈值/峰值验证(agent 32bit OOM 取证)。
*
* 归属演进(2026-09-02 定案,ARCHITECTURE_PRINCIPLES ③混合):**降载决策上收通用层**——
* A + C 分别归 SDK meow_cachegov / meow_svc_perf;本 sim 只验证 mem_watch 的**取证**语义:
* 三档 level 标注滞回(normal→high→critical→滞回→normal)+ song_end 重置峰值 + song_begin 起算。
* (旧版「dl_paused/prefetch_paused 降载断言」已随降载上收移除——那由 meow_cachegov_sim
* 与 svc_perf test_cachegov_monitor 覆盖。)
*
* 依赖:仅 app/play/mem_watch.c(+ meow_log 桩)。
* 编译(ncm_app 目录下):
* gcc -O2 -Wall -Wextra -DJSMN_HEADER -I. -I../sdk -I../meow_launcherd \
* -c bench/mem_watch_sim.c -o /tmp/mw.o
* gcc -O2 -Wall -Wextra -I. -I../sdk -c app/play/mem_watch.c -o /tmp/mw_mod.o
* gcc -O2 -o mem_watch_sim /tmp/mw.o /tmp/mw_mod.o -lpthread -lm
* 运行:./mem_watch_sim (exit 0=PASS / 1=FAIL)
*/
#include "../app/play/mem_watch.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* meow_log 桩:打印(便于看阈值过渡;sim 仅验证 mem_watch 逻辑,非真实日志系统) */
void meow_log(int lvl, const char *fmt, ...)
{
(void)lvl;
char b[256]; va_list ap; va_start(ap, fmt);
vsnprintf(b, sizeof b, fmt, ap); va_end(ap);
printf(" [mem.log] %s\n", b);
}
static int fails;
#define CHECK(cond, msg) do { \
if (!(cond)) { printf("FAIL %s\n", msg); fails++; } \
else { printf("ok %s\n", msg); } } while (0)
/* 等监控线程至少走过 2 个周期(feed 后确保已采样) */
static void settle_ms(int m) { usleep((useconds_t)m * 1000u); }
int main(void)
{
/* 用 env 设定短周期(50ms)与干净阈值,加速确定性判定 */
setenv("NCM_MEM_WATCH_PERIOD_MS", "50", 1);
setenv("NCM_MEM_WATCH_HIGH_KB", "30720", 1); /* 30MB */
setenv("NCM_MEM_WATCH_LOW_KB", "20480", 1); /* 20MB */
setenv("NCM_MEM_WATCH_CRITICAL_KB", "40960", 1); /* 40MB */
if (mem_watch_start() != 0) { printf("FAIL mem_watch_start\n"); return 1; }
printf("started (period=50ms H=30M L=20M C=40M)\n");
/* 1) 正常区 */
mem_watch_set_forced_kb(10000);
settle_ms(150);
CHECK(mem_watch_level() == NCM_MEM_LVL_NORMAL, "level==NORMAL @10MB");
/* 2) 升到 HIGH */
mem_watch_set_forced_kb(35000);
settle_ms(150);
CHECK(mem_watch_level() == NCM_MEM_LVL_HIGH, "level==HIGH @35MB");
/* 3) 升到 CRITICAL */
mem_watch_set_forced_kb(45000);
settle_ms(150);
CHECK(mem_watch_level() == NCM_MEM_LVL_CRITICAL, "level==CRITICAL @45MB");
/* 4) 滞回:落在 LOW..HIGH 之间 -> 保持 CRITICAL(防抖动) */
mem_watch_set_forced_kb(25000);
settle_ms(150);
CHECK(mem_watch_level() == NCM_MEM_LVL_CRITICAL, "level stays CRITICAL @25MB (hysteresis)");
/* 5) 回到正常:低于 LOW -> NORMAL */
mem_watch_set_forced_kb(15000);
settle_ms(150);
CHECK(mem_watch_level() == NCM_MEM_LVL_NORMAL, "level==NORMAL @15MB");
/* 6) 调度器释放钩子:song_end 重置峰值 + song_begin 起算 + rss_anon 反映注入值 */
mem_watch_set_forced_kb(20000);
settle_ms(100);
mem_watch_song_begin();
mem_watch_set_forced_kb(37000); /* 本曲峰值冲到 37MB */
settle_ms(100);
long anon = mem_watch_rss_anon_kb();
CHECK(anon == 37000, "rss_anon_kb reflects forced value");
mem_watch_song_end(); /* 释放钩子:落峰值+重置 */
settle_ms(100);
mem_watch_song_begin();
mem_watch_set_forced_kb(12000); /* 新曲:峰值应从新起算 */
settle_ms(100);
CHECK(mem_watch_level() == NCM_MEM_LVL_NORMAL, "after song_end+begin, level resets to NORMAL");
mem_watch_stop();
printf("mem_watch_sim: %s\n", fails ? "FAIL" : "PASS");
return fails ? 1 : 0;
}