小米真机通过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
相关产品推荐
相关产品推荐

