升级SDK至31遇android:exported报错,添加属性仍未解决
问题分析与解决方案
Android 12(API 31)及以上硬性要求:所有带有<intent-filter>的组件(Activity、Service、BroadcastReceiver、ContentProvider)必须显式声明android:exported属性,不管是你自己编写的还是第三方依赖库自动注入的组件,都得满足这个要求。
你贴出的代码里,SplashScreen和FcmServices都已正确设置android:exported,但报错说明还有其他带<intent-filter>的组件遗漏了该属性,大概率是以下两种情况:
1. 第三方依赖库注入的组件未处理
很多SDK(比如Firebase、推送、统计工具)会自动向Manifest中添加带intent-filter的Service或BroadcastReceiver,这些组件默认可能没设置android:exported。
解决方法:
- 打开Android Studio的Manifest编辑器,切换到底部的Merged Manifest标签,查看最终合并后的完整Manifest。
- 找到所有带有
<intent-filter>但无android:exported属性的组件,在你自己的Manifest中覆盖声明并添加该属性。
举个常见例子:如果发现Firebase的FirebaseInstanceIdReceiver缺失android:exported,可在Manifest中添加:
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </receiver>
2. 自有组件未完全检查
你仅贴出部分Manifest代码,可能还有其他自定义的Activity、Service或Receiver带有<intent-filter>但未设置android:exported。
解决方法:
- 检查所有自定义组件,只要包含
<intent-filter>,就必须显式添加android:exported:- 像Launcher这类需要被系统调用的组件,设为
android:exported="true" - 仅内部使用的组件(比如后台服务、内部接收器),设为
android:exported="false"
- 像Launcher这类需要被系统调用的组件,设为
内容的提问来源于stack exchange,提问作者itsmebil
相关产品推荐
相关产品推荐

