OPPO A91(Android11)及低端国产设备Firebase通知延迟伴ANR问题求助
Firebase推送通知在OPPO及低端国产设备上严重延迟问题排查与解决建议
问题概述
开发的视频门禁APP在OPPO及其他低端国产设备上,Firebase通知的发送与接收存在严重延迟,但仅包含Firebase服务的空测试APP接收通知仅需1-2秒。
复现条件
- 杀死APP并锁屏后,接收通知需25秒
- 屏幕解锁或设备充电时,接收通知需5秒
已排查信息
- 项目大量使用Hilt,怀疑与应用初始化流程有关
- 日志中发现
ANR_LOG >>> msg's executing time is too long的异常提示 - 相关清单权限:
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
- Firebase消息服务配置:
<service android:name=".service.PushNotificationService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
- Firebase依赖配置:
const val firebaseBom = "31.1.0"
implementation(platform(Deps.firebaseBom)) implementation(Deps.firebaseAnalytics) implementation(Deps.firebaseCrashlytics) implementation(Deps.firebaseMessaging) implementation(Deps.firebaseDynamicLink) implementation(Deps.firebasePerf) implementation("com.google.firebase:firebase-messaging-directboot:23.1.0")
- google-services版本:4.3.14
已尝试的解决方法
- 更新Firebase及相关依赖
- 为消息服务添加
directBootAware配置 - 设置通知为高优先级
- 授予APP所有权限并关闭设备省电模式
针对性解决建议
优化消息接收时的初始化逻辑
检查PushNotificationService的onMessageReceived方法,避免在该方法内执行耗时操作(如Hilt依赖注入、数据库读写、网络请求等)。所有非紧急逻辑必须放到后台线程(如CoroutineScope或AsyncTask)执行,防止触发ANR导致通知处理延迟。调整Hilt初始化策略
如果Application的onCreate中包含大量Hilt初始化逻辑,在进程被后台拉起时会大幅增加启动耗时。建议:- 对非核心组件使用懒加载(Hilt的
@Lazy注解) - 将部分初始化逻辑延迟到首次使用时执行,而非Application启动阶段
- 对非核心组件使用懒加载(Hilt的
适配国产ROM后台限制
OPPO等低端国产设备有严格的后台管控策略,仅关闭省电模式不足以解决问题,需引导用户开启以下权限:- 自启动权限
- 后台弹窗权限
- 关联启动权限
- 忽略电池优化权限(已申请权限,需确保用户实际授予)
排查ANR具体触发点
从ANR日志中定位具体耗时方法,重点检查是否在主线程执行了阻塞操作,比如同步网络请求、大文件IO等,将这些操作迁移到后台线程。升级依赖版本
当前使用的Firebase BOM(31.1.0)和google-services(4.3.14)均非最新稳定版,建议升级到最新版本:- Firebase BOM可更新至最新稳定版(如32.7.0)
- google-services更新至4.4.1或更高版本,修复已知兼容性问题
优化FCM消息发送配置
- 确保发送的是高优先级数据消息,而非通知消息(通知消息由系统进程处理,后台限制更严格)
- 在FCM请求中明确设置
priority: high(Android平台),确保系统优先唤醒APP处理消息
内容的提问来源于stack exchange,提问作者Marco Dalla Bà
相关产品推荐
相关产品推荐

