升级到Android12后集成OneSignal出现android:exported显式声明报错如何解决
问题根因
Android 12 要求所有带有intent-filter的四大组件(Activity、Service、Receiver、ContentProvider)必须显式指定android:exported属性,你自己声明的应用组件已经正确配置了该属性,报错来自OneSignal旧版本SDK内部自带的组件未适配Android 12规范,Manifest合并时检测到这些第三方组件带intent-filter但未声明android:exported,因此抛出合并失败错误。
解决步骤
方案1:升级OneSignal SDK(优先推荐)
OneSignal从4.6.0及以上版本已经完成Android 12适配,你只需要在app模块的build.gradle中将OneSignal依赖升级到最新稳定版,即可自动解决Manifest合并问题,原有manifestPlaceholders配置不需要修改。
方案2:手动覆写SDK组件配置(不适合升级SDK时使用)
如果业务逻辑限制无法升级SDK,可以在你自己的AndroidManifest.xml中显式声明OneSignal内部缺失android:exported属性的组件,强制覆盖SDK的Manifest配置:
<!-- 覆写OneSignal Firebase消息接收Service --> <service android:name="com.onesignal.FcmIntentService" android:exported="false" tools:node="merge"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- 覆写OneSignal广播接收器 --> <receiver android:name="com.onesignal.GcmBroadcastReceiver" android:exported="true" tools:node="merge"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="${applicationId}" /> </intent-filter> </receiver>
如果还有其他组件报同样错误,按照相同格式声明,根据组件的使用场景设置android:exported值即可:
- 组件需要被外部应用(系统服务、其他APP)调用时设置为
true - 组件仅允许应用内部调用时设置为
false
内容的提问来源于stack exchange,提问作者Dejo
相关产品推荐
相关产品推荐

