English · 简体中文

FCM Guard 图标

# FCM Guard for HyperOS **一个轻量、免 Root 的 HyperOS 3 后台守护工具,用于让 Google Play 服务持续保留在小米免限制名单中,从而提升 FCM 推送可靠性。** **适用范围:** 中国大陆销售、运行 **HyperOS 3 中国版 ROM** 的 Xiaomi / Redmi / POCO 手机,且 Google Play 服务已经正常安装并可使用。

直接下载最新版 APK · 查看最新 Release

## 亮点 - **免 Root / Shizuku** — 仅使用用户可手动授权的 **修改系统设置** 权限,不依赖 Root、持续 ADB、无障碍、VPN、悬浮窗或设备管理员。 - **对金融 App 更友好** — 整体保持低权限设计,避免引入更容易触发安全敏感 App 风控的高权限方案。 - **低后台耗电** — 主要采用精确事件监听,30 分钟兜底检查仅在进程内运行,不会主动唤醒休眠手机。 - **只在必要时重连** — 仅在真正执行白名单修复后,或用户手动点击时发送 FCM/MCS 重连请求。 - **常驻通知可选** — 前台模式使用可见但静音的通知渠道提升进程存活率,也可切换为静默纯后台模式。 - **FCM App 助手** — 扫描可能依赖 Firebase/GCM 的 App;当 HyperOS 允许读取厂商 AppOps 时,会只读显示自启动状态,并在用户从系统设置返回后自动复查。 - **原生深色模式** — 支持 跟随系统 / 浅色 / 深色,默认 **跟随系统**。 - **10 种主流语言** — 英语、简体中文、繁体中文、法语、日语、韩语、西班牙语、葡萄牙语、德语、俄语,接入 Android 原生应用语言机制。 - **小屏适配** — 响应式布局自动检查 320–480dp 宽度,包含 Xiaomi 17 级别的 393dp profile。 ## 快速使用 1. 直接从 **GitHub Releases** 下载并安装最新版 APK。 2. 打开 FCM Guard,授予 **修改系统设置** 权限。 3. 点击一次 **立即修复**。 4. 开启 **自动保护**。 5. 在 HyperOS 中为 FCM Guard 开启 **自启动**,并将电池策略设为 **无限制**。 6. 如果最看重后台可靠性,建议保持 **常驻通知** 开启。如果 Android / HyperOS 禁用了 FCM Guard 通知,App 会引导进入系统通知设置,使前台通知真正可见。 7. 可选:使用 **FCM App 助手** 扫描可能依赖 FCM 的 App。若当前 HyperOS 允许读取自启动状态,列表会标记 已开启 / 部分开启 / 未开启 / 未知,并在你从 **在 HyperOS 中统一配置** 返回后自动重新检查;若 ROM 不允许读取,FCM Guard 会明确显示“未知 / 不可读取”,而不是猜测。 8. 可选:点击 **打开 FCM 诊断**,进入 Google Play 服务诊断界面,检查 `mtalk.google.com:5228` 连接状态。 9. 如果只有某个 App 仍出现通知延迟,而其他 FCM App 正常,请单独调整该 App 的后台策略。对于 **WhatsApp** 等即时通讯 App,建议设置为:**WhatsApp → 电池优化 / 省电策略 → 无限制(No restrictions)**;若系统提供自启动选项,也建议为该 App 开启 **自启动**。 10. 为减少金融 App 的兼容风险,除非确有需要,建议保持开发者选项 / USB 调试 / 无线调试关闭。 > FCM Guard 主要针对中国版 HyperOS 3:Google 服务本身可以正常使用,但 PowerKeeper / Greezer 仍可能在后台限制 GMS,造成 FCM 推送延迟或中断。 --- # 技术原理 ## 核心机制 在受影响的 HyperOS 设备上,小米的 PowerKeeper / Greezer 可能重建私有系统设置: ```text Settings.System.MILLET_NO_RESTRICT_APP ``` 如果其中缺少 `com.google.android.gms`,Google Play 服务可能被当作普通后台进程处理,从而导致长期保持的 FCM/MCS 连接被中断。 FCM Guard 会读取当前逗号分隔列表,保留所有已有包名,仅在缺失时追加 `com.google.android.gms`。 ```mermaid %%{init: {'theme':'base','themeVariables': {'background':'#ffffff','primaryColor':'#ffffff','primaryTextColor':'#000000','primaryBorderColor':'#000000','lineColor':'#000000'}}}%% flowchart TD A[监听 MILLET_NO_RESTRICT_APP] --> B[读取当前值] B --> C{是否包含 GMS?} C -- 是 --> D[不做任何写入] C -- 否 --> E[保留现有包名] E --> F[追加 com.google.android.gms] F --> G[仅写入一次] G --> H[best-effort FCM 重连] classDef bw fill:#ffffff,stroke:#000000,color:#000000,stroke-width:1.5px; class A,B,C,D,E,F,G,H bw; ``` ## 为什么使用 `targetSdk 22` FCM Guard 有意保持 `compileSdk 35` + `targetSdk 22`。现代 compile SDK 让项目继续使用当前 Android 构建工具,而旧 target 保留对 Xiaomi 厂商私有 `Settings.System` key 的兼容写入路径,因此可以仅依靠用户授予的 **修改系统设置** 权限完成修复,而不需要 Root / Shizuku。 ## 低功耗设计 - 只精确监听 `MILLET_NO_RESTRICT_APP` 对应 URI。 - 设置变化后约 400 ms 防抖。 - 使用 30 分钟进程内兜底,而不是高频轮询。 - 不使用 `AlarmManager`、周期精确闹钟或 WakeLock 进行兜底检查。 - GMS 已存在时不执行重复写入。 - 只有真正修复成功或用户主动操作时才发送重连广播。 ## 常驻通知 开启常驻通知后,`GuardService` 会作为前台服务运行。当前版本改为独立的 `IMPORTANCE_LOW` 静音通知渠道,因此通知会保持可见,但不会发声或振动。 由于项目为了 Xiaomi 私有设置写入而刻意保持 `targetSdk 22`,Android 13+ 的通知权限弹窗时机由系统控制。如果通知已经被系统关闭,FCM Guard 会直接引导进入本 App 的系统通知设置页面。 ## FCM 诊断 **打开 FCM 诊断** 现在优先启动当前 Google Play 服务使用的 Activity: ```text com.google.android.gms/com.google.android.gms.gcm.GcmDiagnostics ``` 同时保留旧版 `GTalkServiceDiagnostics` 作为兼容 fallback,并会最后尝试在 Google Play 服务的可见 Activity 中寻找诊断入口。 ## FCM App 助手 扫描器会检查标准 manifest 信号,例如: ```text com.google.firebase.MESSAGING_EVENT com.google.android.c2dm.intent.RECEIVE ``` 匹配意味着该 App **很可能** 使用 FCM/GCM,但不代表它的每一条通知都一定来自 FCM。 对于检测到的 App,FCM Guard 会尝试**只读**查询 Xiaomi 自启动相关的厂商 AppOps(`10008` 与 `10053`)。如果系统允许可靠读取,界面会显示: - **已开启** — 两个自启动 AppOps 都是 allow。 - **部分开启** — 一个 allow,另一个明确为 ignore。 - **未开启** — 两个都明确为 ignore。 - **未知** — HyperOS 阻止了查询、返回了无法安全解释的默认 / 厂商状态,或没有暴露可靠结果。 FCM Guard **不会把“未知”当成“未开启”**。如果所有检测到的 App 都只能得到未知状态,逐 App 列表会自动隐藏,只保留检测数量和 **在 HyperOS 中统一配置** 入口,避免展示没有实际帮助的伪状态。用户从 HyperOS 设置页返回后,如果扫描结果仍展开,状态会自动重新读取。 整个过程不会程序化修改任何其他 App 的自启动状态,也不会引入 Shizuku / Root / ADB 权限。 ## 单 App 推送仍可能受后台策略影响 FCM Guard 保护的是 **Google Play 服务 / FCM 传输层**,但不会绕过 HyperOS 对每个接收 App 单独施加的后台限制。某些 App——尤其是 **WhatsApp** 这类即时通讯 App——可能把 FCM 用作唤醒 / tickle 信号,之后仍需要自己的进程获得后台执行时间、建立网络连接、同步消息并生成本地通知。 因此,如果 FCM 诊断连接正常、YouTube / X 等其他 App 推送也正常,但只有某个 App 持续延迟,请优先检查该 App 自身的后台策略。对于 WhatsApp,建议: **WhatsApp → 电池优化 / 省电策略 → 无限制(No restrictions)** 如果当前 HyperOS 版本提供该 App 的 **自启动** 开关,也建议开启。无需把所有 App 都设为无限制,只针对实际出现延迟的 App 调整即可。 ## 外观、语言与屏幕适配 - 跟随系统 / 浅色 / 深色三种外观模式。 - 10 种原生 App 语言:英语、简中、繁中、法语、日语、韩语、西班牙语、葡萄牙语、德语、俄语。 - compact 与较大宽度分别使用响应式资源参数。 - CI 自动检查 320、360、393、411、430、480dp 宽度,包括 Hero / Status overlap 与同心圆角几何关系。 ## 权限与隐私 FCM Guard 使用 `WRITE_SETTINGS`、`RECEIVE_BOOT_COMPLETED`、前台服务 / 通知支持,以及针对 FCM/GCM handler、Google Play 服务和小米安全中心的窄范围 package visibility。 FCM Guard **不需要** Root、Shizuku、持续 ADB、无障碍、VPN、悬浮窗、设备管理员、账号读取或网络流量抓取。 ## 局限性 本项目依赖 Xiaomi 当前 HyperOS 的具体实现。未来如果 PowerKeeper / Greezer、私有设置 key、App 管理页面或厂商 AppOps 行为发生变化,本方案可能需要同步调整。FCM 重连、FCM App 识别和自启动状态读取都属于 best-effort,因为 Android 没有向普通第三方 App 提供保证这些厂商私有行为的公开 API。 FCM Guard 只能保护共享的 GMS / FCM 连接,不能保证 HyperOS 一定为每个接收 App 提供足够的后台执行时间和网络权限。对于 WhatsApp 等仍出现延迟的 App,可能仍需要单独设置 **电池优化 → 无限制**。 ## 参考与致谢 PowerKeeper / Greezer 行为与 `MILLET_NO_RESTRICT_APP` 修复思路最初由 **HyperOS FCM Fix** 项目进行了系统性调查与公开记录: - HyperOS FCM Fix(`dingwen07`):https://github.com/dingwen07/hyperos-fcm-fix - 技术调查文档:https://github.com/dingwen07/hyperos-fcm-fix/blob/main/docs/xiaomi-hyperos-gms-fcm-greezer-investigation.md FCM Guard 是独立实现,设计重点是无需 Shizuku / Root、权限尽量少、事件驱动和更低待机后台活动。本仓库没有复制 HyperOS FCM Fix 的源代码。 ## 构建 GitHub Actions 会自动检查响应式布局并构建签名后的 debug APK。push 到 `main` 时还会自动创建 / 更新对应版本的 GitHub Release;feature branch 可先进行构建验证,再合并发布。 手机用户建议直接使用固定最新版地址: **https://github.com/ReedGAOOO/FCMGuard-HyperOS/releases/latest/download/FCMGuard-HyperOS.apk** ## License MIT License — 见 [LICENSE](LICENSE)。