Skip to content

修复FCM在coloros16上无法唤醒已停止应用(failed to broadcast to stopped app) - #276

Open
mooncake8355 wants to merge 1 commit into
kooritea:masterfrom
mooncake8355:fix/stopped-app-wakeup
Open

mooncake8355 wants to merge 1 commit into
kooritea:masterfrom
mooncake8355:fix/stopped-app-wakeup

Conversation

@mooncake8355

@mooncake8355 mooncake8355 commented Aug 29, 2026

Copy link
Copy Markdown

摘要

修复勾选应用无法被 FCM 唤醒、FCM Diagnostics 显示
Failed to broadcast to stopped app 的问题。

根因:在部分 ROM(实测 ColorOS 16 / Android 16)上,
BroadcastController.broadcastIntentLocked 是薄包装层,会被调用方内联,
原有 hook 从不触发,FLAG_INCLUDE_STOPPED_PACKAGES 从未被加上;
同时现代 Xposed API 移植后,system_server 的上下文获取时机与配置加载
也存在可靠性问题。

修改内容

  • BroadcastFix:多层挂接(BroadcastController.broadcastIntentLocked /
    broadcastIntentLockedTraced、ActivityManagerService.broadcastIntentLocked /
    broadcastIntentLockedTraced)+ deoptimize 反内联 + 参数按类型/名称自动定位;
  • 新增 GmsDeliveryFix:在 GMS 进程发送源头为 FCM 广播加
    FLAG_INCLUDE_STOPPED_PACKAGES(双保险,需 GMS 作用域);
  • XposedModule:system_server 主动获取系统上下文(ActivityThread 反射,
    失败回退原路径)、带重试的初始化线程、开机即加载配置;
  • 配置通道加固:远程 SharedPreferences 失败时回退新增的 ConfigProvider
    (ContentProvider 直读模块应用 config.json);MainActivity 勾选时双写本地
    与远程配置;
  • 其它:hook 状态实时日志(广播 com.kooritea.fcmfix.update.config 触发)、
    各 hook 模块初始化异常隔离、空值防护等。

验证

设备:OnePlus 15 / ColorOS 16.1 / Android 16 / GMS 26.32.34 / LSPosed 7847。

A/B 对照(两个应用均为 stopped=true):

  • 正向(已勾选 Teams):hook 注入标志后
    Start proc ... for broadcast {FirebaseInstanceIdReceiver}
    stopped 由 true 变 false,唤醒成功;
  • 对照(未勾选 Telegram):无介入、无标志、进程不启动、保持 stopped——
    筛选语义正确,排除自启动设置干扰。

真实推送(FCM Diagnostics / 实际消息)自测通过。

兼容性

  • Android 10~16 各版本对应的挂接层均存在(缺失层自动跳过),
    参数自动定位替代硬编码索引;
  • 不勾选 GMS 作用域的用户不受影响,系统侧 hook 独立工作

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant