Firebase推送在独立进程初始化后低版本Android无法接收的兼容需求
Firebase推送独立进程全Android版本兼容方案
问题描述
为优化性能,我将Firebase推送初始化在独立进程中,该方案在Android 10及以上版本运行正常,但在Android低版本中无法显示推送消息,需实现全版本兼容。当前Manifest配置如下:
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" android:process=":pushprocess" tools:node="replace"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> <service android:name="FirebaseMessagingService" android:exported="false" tools:node="replace" android:process=":pushprocess"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
问题原因
Android 10(API 29)之前的系统依赖系统级广播机制处理C2DM推送,将FirebaseInstanceIdReceiver和FirebaseMessagingService放在独立进程时,低版本系统无法正确将推送消息路由到该进程,导致消息无法被处理、无法显示。
解决方案
通过版本区分配置,低版本保留默认进程的推送组件,高版本使用独立进程组件,同时补充低版本必需权限:
修改后的Manifest配置
<!-- 低版本兼容:默认进程的推送接收器与服务 --> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" tools:node="merge" tools:targetApi="28"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> <service android:name="FirebaseMessagingService" android:exported="false" tools:node="merge" tools:targetApi="28"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- Android 10+:独立进程的推送接收器与服务 --> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" android:process=":pushprocess" tools:node="replace" tools:targetApi="29"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </receiver> <service android:name="FirebaseMessagingService" android:exported="false" tools:node="replace" android:process=":pushprocess" tools:targetApi="29"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- 低版本必需的C2DM权限 --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
关键说明
tools:targetApi指定配置生效的API级别,自动适配高低版本系统tools:node="merge"避免覆盖Firebase默认配置,保证低版本消息接收逻辑正常- 补充的C2DM权限是低版本系统接收推送的必要条件
内容的提问来源于stack exchange,提问作者Темирлан Толегенов
相关产品推荐
相关产品推荐

