Flutter应用安装到Android 12后启动白屏卡死问题咨询
问题根因
Android 12(API 级别 31)起系统强制要求:所有配置了<intent-filter>的应用组件(Activity、Service、BroadcastReceiver)必须显式声明android:exported属性,否则应用无法正常完成组件初始化,直接触发启动白屏、ANR无响应。
你目前只给主入口MainActivity配置了该属性,但项目依赖的第三方Flutter插件、原生SDK自带的组件中,只要存在带intent-filter但未配置exported的项,都会触发该问题。除此之外你的配置里还有两个Android 12适配的高频故障点:
- 声明了
ACCESS_BACKGROUND_LOCATION后台定位权限,Android 12不允许该权限与前台定位权限同时申请,启动阶段直接申请该权限会被系统拦截,阻塞主线程导致卡死 - 声明了
FOREGROUND_SERVICE前台服务权限,但未对对应服务声明foregroundServiceType,Android 12上启动未声明类型的前台服务会直接抛出运行时异常
排查步骤
- 先抓崩溃实锤日志:设备连接开发机后执行
flutter run -v启动应用,直接查看Logcat中AndroidRuntime分类下的报错日志,绝大多数场景日志会直接点名缺失exported配置的具体组件类名,直接定位问题 - 检查最终合并的Manifest文件:不要只修改主module的Manifest,所有第三方依赖的Manifest会在编译阶段合并到最终安装包。打开Android Studio,找到
app/build/intermediates/merged_manifests/路径下编译生成的最终版Manifest文件,逐个排查所有带<intent-filter>标签的组件,确认是否漏配exported属性 - 校验启动流程权限逻辑:检查应用启动阶段有没有直接申请后台定位权限,Android 12要求必须在用户已经授予前台精确定位权限后,才能单独发起后台定位权限的申请,启动阶段直接申请会被系统直接拦截
- 做版本对照验证:临时将build.gradle中的
targetSdkVersion降到30,重新编译运行在Android 12设备上,如果应用可以正常启动,就可以100%确认是API 31相关适配项缺失导致的问题
修复方案
- 补全所有组件的exported配置:对于第三方依赖中漏配exported的组件,不需要修改依赖源码,直接在主module的AndroidManifest文件中添加对应组件的覆盖声明即可,示例如下:
<!-- 覆盖第三方组件的配置,exported值根据组件实际是否需要对外暴露设置为true/false --> <receiver android:name="com.third.sdk.ThirdPushReceiver" android:exported="false"> <intent-filter> <action android:name="com.third.sdk.PUSH_ACTION" /> </intent-filter> </receiver>
- 修正定位权限申请逻辑:将后台定位权限的申请时机从启动阶段后移,必须等用户明确授予前台精确定位权限后,再单独发起后台定位权限的申请,不要和前台定位权限合并弹出申请窗
- 补全前台服务适配:如果项目中用到了定位、媒体播放等前台服务,在对应
标签中添加 android:foregroundServiceType属性,定位类服务填location,媒体播放类填mediaPlayback,和服务实际功能匹配即可 - 处理Flutter 3.0.4版本已知兼容问题:该版本Flutter引擎在部分Android 12机型上存在硬件加速渲染导致的启动卡死bug,可以临时给MainActivity配置
android:hardwareAccelerated="false"验证,如果关闭硬件加速后可以正常进入应用,直接将Flutter SDK升级到3.0.5及以上的补丁版本即可修复该渲染问题
内容的提问来源于stack exchange,提问作者Harshad Vora
相关产品推荐
相关产品推荐

