根因(真机日志实证,M2.92 遗留):meow_ams_pending_start_set 误返回正错误码 (-MEOW_ERR_BUSY=+8/-MEOW_ERR_INVAL=+1),ipc_dispatch 的 rc<0?-rc:MEOW_OK 把「有前台 App 拒绝/空包名非法」误判为 OK(0) → amsd 报 OK 但 pending 未置位 → App 永不拉起(am start 报 OK 但界面没出现/进程未起)。 launcher: - 新增自包含模块 meow_ams_start.c/.h(ops 注入 launch=launch_app/launch_activity、 resolve=resolve_chain、log=logmsg):pending 状态 + 拉起决策 + picker 上下文。 - set 统一返回负 MEOW_ERR_*(根因修复);consume 复用既有启动链路真正拉起目标 App, 列表未就绪(state!=0)保留 pending 待 2s 重扫重试,不再静默丢弃。 - main_menu run_menu 改经 meow_ams_start_consume 消费(保留 launch_fail_toast/菜单收尾); app_launcher 移除旧 g_ams_start/g_ams_pick_* 迁入模块;util meow_ipc_process 顶部同步 busy、 meow_ipc_init 末尾 meow_ams_launcher_init()。 - build_launcher.sh 编入 meow_ams_start.c;meow_launcher_internal.h 更新挂点声明。 amsd(协议层归属说明):cmd_start 的 busy 判定对照 launcher ACK 正幅度(busy=8), 原 (uint32_t)MEOW_ERR_BUSY=0xFFFFFFF8 永不匹配 → busy 落入 launcher offline,改 (uint32_t)(-MEOW_ERR_BUSY)。 验证:宿主 test_ams_start.c 33 断言全 PASS(合法->拉起链、activity chain 透传、空包名/非法/busy 不拉起不崩、列表未就绪保留 pending、无路由 NO ROUTE、启动失败 idx 回报、picker 取回); launcher 目录全量回归 test_media/bgplay/depends/notif_panel/notif_tf/settings_brightness/ vol_ramp_jack/host_icon + test_font_tier/weight 全 PASS;mipsel -Wall -Wextra 0 warning。 新 md5:meow_launcherd a8200ae1b0aa68d7262749db87377d49、meow_amsd 7ddc677ce7938bc9b95c83c17bc78295。(M2.98 待打包,未刷机)
63 lines
3.8 KiB
C
63 lines
3.8 KiB
C
/* meow_ams_start.h — MSG_AMS_START 拉起决策(AMSD_DESIGN §4.3)。
|
||
*
|
||
* 独立模块以便宿主单测:pending 状态 + 拉起决策都在此,启动/解析/日志经 ops 注入
|
||
* (生产=launcher 既有链路 launch_app/launch_activity + resolve_chain + logmsg;
|
||
* 测试=假件,见 test_ams_start.c)。
|
||
*
|
||
* 约定(与 launcher 其余模块一致):本模块函数返回负的 MEOW_ERR_*(-1=INVAL / -8=BUSY)
|
||
* 表示拒绝,0 表示受理。ipc_dispatch 用 `a.code=(uint32_t)(rc<0?-rc:MEOW_OK)` 把负错误码
|
||
* 转成正的 ack.code(幅度);amsd 侧按 `(uint32_t)(-MEOW_ERR_BUSY)` 识别 busy。
|
||
* —— 历史上 set() 误返回 `-MEOW_ERR_BUSY`(=+8,正)导致 ipc_dispatch 把拒绝当 OK,
|
||
* 表现为「am start 报 OK 但 App 未拉起」;本模块统一为负错误码(根因修复)。
|
||
*/
|
||
#ifndef MEOW_AMS_START_H
|
||
#define MEOW_AMS_START_H
|
||
|
||
#include "meow_ipc.h" /* MEOW_APP_ID_MAX / MEOW_ACT_MAX / MEOW_CHAIN_MAX / MEOW_ERR_* */
|
||
|
||
/* 启动/解析/日志回调注入(单测=假件;生产在 meow_ipc_init 末尾组装)。 */
|
||
struct meow_ams_ops {
|
||
/* 执行启动。idx=调用方应用表下标;chain 空=裸启动。
|
||
* 复用 launcher 既有链路:launch_app(&apps[idx]) / launch_activity(&apps[idx], chain)。
|
||
* 返回 0=已受理(app 已运行至退出);<0=启动失败/未找到。 */
|
||
int (*launch)(int idx, const char *chain);
|
||
/* 解析 activity 链(resolve_chain)。返回 MEOW_OK / MEOW_ERR_NOENT。 */
|
||
int (*resolve)(const char *app_id, const char *activity, char *chain, int *depth);
|
||
/* 日志(可空=静默)。 */
|
||
void (*log)(const char *fmt, ...);
|
||
};
|
||
|
||
/* 组装 ops(launcher meow_ipc_init 末尾 / 测试 main 调用)。launch/resolve 须非 NULL。 */
|
||
void meow_ams_ops_init(const struct meow_ams_ops *ops);
|
||
|
||
/* 同步「前台 App 会话」占用位(=g_app_session_active)。
|
||
* busy=1 时 pending_start_set 拒绝(-MEOW_ERR_BUSY)且 consume 不动作。 */
|
||
void meow_ams_set_busy(int busy);
|
||
|
||
/* 置 pending(ipc_dispatch MSG_AMS_START 时调)。
|
||
* pkg 空 → -MEOW_ERR_INVAL;busy → -MEOW_ERR_BUSY;否则置位并返回 0。 */
|
||
int meow_ams_pending_start_set(const char *pkg, const char *act);
|
||
|
||
/* 二期 picker 扩载荷:置 pending + 武装 picker 上下文(pick_action 非空时,launch_app_chain
|
||
* 入口经 meow_ams_take_picker 注入 MEOW_PICKER_ACTION/REQ_ID/CALLER)。错误语义同 set。 */
|
||
int meow_ams_pending_start_set_ex(const char *pkg, const char *act,
|
||
const char *pick_action, uint32_t pick_req,
|
||
const char *pick_caller);
|
||
|
||
/* 消费 pending(各主循环排空 IPC 后 / run_menu 循环调用)。
|
||
* ids=napps 个应用主键串指针(apps[i].id);state=菜单态(0=就绪;非 0=列表未就绪不拉起,
|
||
* pending 保留待重扫重试)。toast/toast_len=错误提示槽(可空)。
|
||
* app_ran=输出:1=app 已运行;0=未运行(拒绝/失败)。idx_out=输出:本次使用的应用表下标
|
||
* (-1=未命中应用;>=0 且 app_ran=0 表示启动失败,调用方应据 apps[idx].name 打 launch_fail_toast)。
|
||
* 返回:0=无 pending 或 busy(暂不动作);1=已消费(拉起成功/拒绝并清 pending,toast 已设);
|
||
* 2=列表未就绪(pending 保留待重扫重试,toast 已设「not ready」,调用方勿红冲)。 */
|
||
int meow_ams_start_consume(const char *const *ids, int napps, int state,
|
||
char *toast, int toast_len, int *app_ran, int *idx_out);
|
||
|
||
/* 消费拾取 picker 上下文(launch_app_chain 入口调用,一次性清位)。
|
||
* 返回 1=有 picker 上下文;0=无。 */
|
||
int meow_ams_take_picker(char *action, int action_len,
|
||
char *caller, int caller_len, uint32_t *req);
|
||
|
||
#endif /* MEOW_AMS_START_H */
|