You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

小米真机通过ADB Shell模拟发送FCM消息无法接收问题排查

小米真机无法通过ADB模拟接收FCM消息的问题排查与解决

问题场景

我实现了如下Firebase消息服务类:

class FirebaseService : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        Log.d("FIREBASE", "Message data payload: ${remoteMessage.data}")
    }
}

通过以下ADB命令模拟发送FCM消息:

adb shell am broadcast \
    -n com.myproj.proj/com.google.firebase.iid.FirebaseInstanceIdReceiver \
    -a "com.google.android.c2dm.intent.RECEIVE" \
    --es "data" "my_data"

命令执行返回成功:

Broadcasting: Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x400000 cmp=com.myproj.proj/com.google.firebase.iid.FirebaseInstanceIdReceiver (has extras) }
Broadcast completed: result=0

该操作在模拟器上能正常触发onMessageReceived并打印日志,但在小米真机上完全无响应。

原因分析

  • MIUI广播拦截机制:小米MIUI系统默认拦截非系统发起的隐式广播,ADB发送的广播属于此类,会被系统过滤,无法到达目标接收器。
  • 后台管控严格:MIUI对第三方应用的后台运行权限限制极高,若应用处于后台冻结状态,即使广播发送成功,也无法唤醒应用处理消息。
  • Google服务适配问题:部分小米机型对Google服务框架的兼容性优化特殊,FirebaseInstanceIdReceiver可能被系统限制,无法正常接收模拟广播。

解决方法

1. 解除MIUI对应用的后台限制

  • 打开手机「设置」→「应用设置」→「应用管理」,找到你的应用。
  • 进入「省电策略」,选择「无限制」,确保应用后台运行不受限。
  • 开启「自启动权限」,防止应用被系统彻底杀死。

2. 调整ADB广播命令格式

尝试直接指定自定义的FirebaseService组件,或者补充必要参数绕过拦截:

adb shell am broadcast \
    -n com.myproj.proj/.FirebaseService \
    -a "com.google.android.c2dm.intent.RECEIVE" \
    --es "data" "my_data"

或者添加官方来源标识参数:

adb shell am broadcast \
    -n com.myproj.proj/com.google.firebase.iid.FirebaseInstanceIdReceiver \
    -a "com.google.android.c2dm.intent.RECEIVE" \
    --es "data" "my_data" \
    --es "from" "firebase.googleapis.com"

3. 使用官方工具测试

放弃ADB模拟,直接通过Firebase控制台的「云消息传递」功能发送测试消息,这种官方通道的消息不会被MIUI拦截,能准确验证消息接收逻辑是否正常。

4. 确认Google服务配置

确保小米真机已安装并启用Google服务框架,同时应用的google-services.json文件包名、SHA-1值与当前项目完全匹配,避免配置错误导致消息传递失败。

内容的提问来源于stack exchange,提问作者Ihor Antoshkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:15:44