Flutter应用在Xiaomi Poco启动时触发Canvas过大Bitmap错误求助
问题根源
从错误日志看,崩溃发生在wmshell.splashscreen进程(系统启动屏服务),核心原因是启动屏图片被加载成了远超内存允许的大尺寸Bitmap。
你的styles.xml中,LaunchTheme直接将android:windowBackground设为@mipmap/splash,但mipmap目录是专为应用图标设计的——Android系统会对mipmap内的资源做特殊缩放处理,在高DPI设备(如Xiaomi Poco系列)上,会将图片放大到远超屏幕实际尺寸的大小,导致内存溢出(107907360字节≈103MB,远超普通启动屏图片的合理大小)。
那个ic-launcher.xml是自适应图标配置,和本次崩溃无关。
解决步骤
1. 迁移启动屏图片到drawable目录
创建对应密度的drawable文件夹:drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi,将对应分辨率的splash.png放入对应文件夹(确保每个密度下的图片尺寸符合设备规范,比如xxhdpi建议1080×1920左右,根据应用屏幕比例调整)。
2. 修正启动屏主题配置
打开res/values/styles.xml,修改LaunchTheme的windowBackground配置:
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> <!-- 改用layer-list配置启动屏,避免直接引用图片导致缩放问题 --> <item name="android:windowBackground">@drawable/launch_background</item> </style>
3. 完善launch_background.xml配置
打开res/drawable/launch_background.xml,取消注释图片节点并修改为你的启动屏图片:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/white" /> <item> <bitmap android:gravity="center" android:src="@drawable/splash" /> </item> </layer-list>
android:gravity="center"会让图片居中显示,不会被强制拉伸到全屏,避免不必要的内存占用。
4. 清理缓存并重新构建
执行以下命令确保资源被正确替换:
flutter clean flutter run
额外说明
- 启动屏图片务必按密度分级提供,不要只放一张高分辨率图让系统自动缩放——缩放过程会产生临时大尺寸Bitmap,依然可能触发内存问题。
- 你怀疑的权限请求后图片缓存问题,从崩溃时机来看可以排除,因为崩溃发生在应用启动阶段,解锁后Flutter引擎已经初始化完成,启动屏资源被释放,所以后续运行正常。
内容的提问来源于stack exchange,提问作者slicey

