You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:35:58