fix(launcher,lock): §310 锁屏/叠加三连 bug——输入穿透·状态栏消失·App死亡残影
用户真机 M6.2 实测三症状,全部位于锁屏/通知中心叠加路径。根因与修法: S1 锁屏输入穿透(PIN 触摸打到下层 App / 解锁后「启动奇怪界面」) 根因:run_app_lock_overlay / run_app_notif_overlay 关闭路径先 unlink /tmp/meow_notif_active 再 SIGCONT App——App 被 SIGSTOP 冻结期间缓冲的 evdev 触摸事件在解除瞬间被 SDK 输入线程在无隔离态回放成 App 内点击(穿透触发)。 修法:反序——标记仍在时先 SIGCONT,让 SDK 输入线程排空冻结期缓冲事件 + EVIOCGKEY 对齐,等 OVERLAY_DRAIN_WINDOW_MS(300ms > SDK 200ms 节流) 再 unlink。 S2 解锁后状态栏消失(App 无状态栏全屏残留) 根因:S1 的回放点击常把 App 导航进全屏页(状态栏随 app.json/fullscreen 隐掉); 叠加关闭路径也未强制状态栏重同步。 修法:解锁后 g_sb_mode_last=-1 + 立即 app_overlay_statusbar() 重叠加(不等 1s 慢刷)。 S3 App 异常死亡(OOM sig=9)残影——fb0 停 App 死帧、无状态栏、launcher 不重绘主屏 根因:锁屏叠加(run_app_lock_overlay→run_lock_screen)阻塞于 lock_screen 内, App 叠加期崩溃不被感知(notif 叠加有 run_notif_center 的 proc_is_zombie 探测, 锁屏独缺),launcher 卡在锁屏会话永不回 menu 重绘。 修法:run_app_lock_overlay 置位 g_lock_overlay_pid,run_lock_screen 每圈 proc_is_zombie 探测,App 死即中止锁屏(LCK_OVERLAY_RET_DIED)走统一退出路径 (reap_wait 回收 + ams_status_valid + break → run_menu 重绘主屏含状态栏)。 新增 overlay_gate.h(纯决策,宿主可单测)+ test_overlay_gate.c(10 断言)+ test_lock_screen.c 扩展(4 断言 overlay-abort)。launcher 全量宿主回归 + SDK 叠加/状态栏回归(overlay_suppress/sb_collapse/notif_open/notif_gesture/ sdk_fixes/sdk_input_keys)全 PASS;mipsel 交叉 -Wall -Wextra 0 warning。 md5 136dc67c086a9d75c0ad9c83d519ff0d(/usr/bin 只读,待固件打包;fw_content.conf 未动)。
This commit is contained in:
1 parent
3611cbbbde
commit
bcef8e092e
8 files changed
+203
-11
No files matched your search
@@ -12,6 +12,12 @@
|
||||
*/
|
||||
#include "meow_launcher_internal.h"
|
||||
|
||||
/* §310 残影:锁屏处于 App 前台叠加会话时置位当前前台 App pid(run_app_lock_overlay 写入)。
|
||||
* run_lock_screen 每圈据此探测 App 是否已死(组合 App 冻结缓冲 evdev 会在解锁瞬间回放成点击 /
|
||||
* 叠加期 OOM 杀让 fb0 留残帧——探到死即中止锁屏,交回 waitpid 循环回收 + run_menu 重绘主屏)。
|
||||
* 菜单直接锁屏(无 App)时保持 0 = 不探测。 */
|
||||
int g_lock_overlay_pid = 0;
|
||||
|
||||
/* ---- 键盘几何(480×720):3 列×4 行圆角按钮 ---- */
|
||||
#define LK_X0 32 /* 首列左缘 */
|
||||
#define LK_COLW 130 /* 列宽 */
|
||||
@@ -156,6 +162,17 @@ int run_lock_screen(void)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* §310 残影:锁屏叠加期 App 崩溃(僵尸)→ 中止锁屏走统一退出路径(交回 waitpid 循环
|
||||
* 回收 + run_menu 重绘主屏含状态栏)。仅当 run_app_lock_overlay 置位 g_lock_overlay_pid
|
||||
* 才探(菜单直接锁屏无 App 可死,恒不中止)。 */
|
||||
if (g_lock_overlay_pid > 0 &&
|
||||
lck_overlay_should_abort(g_lock_overlay_pid, proc_is_zombie(g_lock_overlay_pid))) {
|
||||
logmsg("lock: overlay app pid %d died during lock -> abort (unified exit path)",
|
||||
g_lock_overlay_pid);
|
||||
g_lock_overlay_pid = 0;
|
||||
goto died;
|
||||
}
|
||||
|
||||
/* 锁定到期自动解禁(清计数+戳),仅重画状态行 */
|
||||
if (lock_until > 0 && now >= lock_until) {
|
||||
lck_lock_remaining();
|
||||
@@ -260,6 +277,12 @@ done:
|
||||
kp_close(&kp_keys);
|
||||
logmsg("lock: exit unlocked=%d screen_on=%d", unlocked, meow_screen_on);
|
||||
return unlocked;
|
||||
died:
|
||||
if (tfd >= 0) close(tfd);
|
||||
kp_close(&kp_power);
|
||||
kp_close(&kp_keys);
|
||||
logmsg("lock: exit overlay-app-died -> LCK_OVERLAY_RET_DIED");
|
||||
return LCK_OVERLAY_RET_DIED;
|
||||
}
|
||||
|
||||
/* 电源菜单「锁定」:**主动锁屏**(用户定案 2026-09-02 强化)。
|
||||
|
||||
Reference in new issue
Block a user