fix: M6.41批 — 启动失败原因透传 + 阅读器左缘返回/阅读页接入view栈 + 后台管理按钮点不动 + 阅读器瘦身(fonts common+页位图释放) + files txt换行

- launcher(453): app_launcher.c g_launch_fail_reason+launch_fail()统一出口(5失败点 fork OOM/exec/no such file/missing dep/execpipe)+main_menu.c launch_fail_toast(缺依赖/CANNOT START: name(reason))+toast256
- launcher(457): bg_page.c bgm_enumerate跳过term_at_ms(杀后当下消失)+不可杀行按钮置灰+row_tap/top_action返回1; subpage.c 消warning
- reader(454): reader_on_swipe LEFT/RIGHT→返回(先关overlay否则page_pop回书架)+app.c书架根LEFT→exit
- reader(458瘦身A+B): app.json fonts full→common(省13MB atlas)+reader.c RD_PAGE_CACHE 3→2+g_anim_old懒分配/anim_done释放+on_enter/on_leave页位图离开释放重建
- reader(459导航): reader_open返回int+shelf点书push ACT_READER(阅读页接入view栈,on_enter/on_leave驱动) — 使454左缘返回+458瘦身B真正生效
- files(455): viewer.c viewer_cp_len+按码位折行(txt中文不冲出右缘)

0warning;宿主测试全过;files二进制已热更
This commit is contained in:
AskaEth committed 2026-09-04 19:43:28 +08:00
1 parent 626a87a30d
commit ddc8d35eb9
11 files changed
+154 -66

No files matched your search

+28 -5
View File
@@ -23,6 +23,28 @@ static void app_name_copy(char *dst, int cap, const char *src)
}
/* M6.40 启动失败原因透传:launch_app/launch_activity(→launch_app_chain)返回 -1 前按实际
* 失败点填具体原因(fork OOM / exec 失败 / 缺依赖 / 路径不存在等),供 main_menu.c 的
* launch_fail_toast 显示「CANNOT START: %s(%s)」;success 路径恒为 ""。 */
static char g_launch_fail_reason[160] = "";
const char *launch_fail_reason(void)
{
return g_launch_fail_reason;
}
/* 内部失败出口:设原因 + 记统一失败日志 + 返回 -1(各失败分支复用)。 */
static int launch_fail(struct app *a, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(g_launch_fail_reason, sizeof g_launch_fail_reason, fmt, ap);
va_end(ap);
logmsg("launch failed: %s reason=%s", a->name, g_launch_fail_reason);
return -1;
}
/* ---- amsd 上报 / 控制挂点(AMSD_DESIGN §4):best-effort,amsd 不在不影响 launcher ---- */
#define MEOW_AMS_SOCK_DEFAULT "/usr/data/meow_ams.sock"
@@ -1585,8 +1607,9 @@ static int launch_app_chain(struct app *a, const char *chain)
uint32_t pick_req = 0;
meow_ams_take_picker(pick_action, sizeof pick_action,
pick_caller, sizeof pick_caller, &pick_req);
if (!a->ok) { logmsg("launch blocked: exec not ok"); return -1; }
meow_dep_clear_reason(); /* 每次 launch 入口清 stale 依赖阻断原因(防上一 app 残留) */
g_launch_fail_reason[0] = 0; /* M6.40:同上,清 stale 启动失败原因 */
if (!a->ok) { logmsg("launch blocked: exec not ok"); return launch_fail(a, "no such file: %s", a->exec); }
/* M4 后台保活恢复:该 App 驻留后台(播放中经 nav-exit 转过)→ 原进程回前台,
* 不 fork/exec(进程仍存无法注入新 env:chain/picker 上下文忽略,记日志)。
@@ -1613,7 +1636,7 @@ static int launch_app_chain(struct app *a, const char *chain)
char dep_missing[32] = "";
if (meow_check_app_depends(a, dep_missing, sizeof dep_missing) != 0) {
logmsg("launch blocked: dep '%s' missing (CANNOT START: %s)", dep_missing, a->name);
return -1;
return launch_fail(a, "missing dep: %s", dep_missing);
}
}
/* 冷启动:标记内容置为前台归属(a->id),让本 App 首帧即不被自抑(后台常驻 App 继续自抑)。
@@ -1641,7 +1664,7 @@ static int launch_app_chain(struct app *a, const char *chain)
* watchdog and waitpid — so an exec failure never leaves an orphan watchdog
* and never masquerades as "app ran and exited". */
int execpipe[2];
if (pipe(execpipe) < 0) { logmsg("exec pipe failed: %s", strerror(errno)); return -1; }
if (pipe(execpipe) < 0) { logmsg("exec pipe failed: %s", strerror(errno)); return launch_fail(a, "exec pipe failed: %s", strerror(errno)); }
fcntl(execpipe[1], F_SETFD, FD_CLOEXEC);
/* AMSD_DESIGN §5:stdout/stderr 管道捕获(logcat 思路)。fork 前建管道;子进程 dup2 到
@@ -1661,7 +1684,7 @@ static int launch_app_chain(struct app *a, const char *chain)
close(execpipe[0]); close(execpipe[1]);
if (out_pipe[0] >= 0) close(out_pipe[0]);
if (out_pipe[1] >= 0) close(out_pipe[1]);
logmsg("fork failed: %s", strerror(errno)); return -1;
logmsg("fork failed: %s", strerror(errno)); return launch_fail(a, "fork failed: %s", strerror(errno));
}
if (pid == 0) {
/* child: exec the app. M2.12 注入 MEOW_LOG_DIR + MEOW_DATA_DIR/MEOW_CACHE_DIR
@@ -1850,7 +1873,7 @@ static int launch_app_chain(struct app *a, const char *chain)
int st = 0;
reap_wait(pid, &st); /* reap the failed child(有界) */
if (out_fd >= 0) close(out_fd);
return -1;
return launch_fail(a, "exec failed: %s (errno %d)", strerror(exe_err), exe_err);
}
} /* end if (!resumed):冷启动分支(prepare/fork/exec/确认) */