Android Studio中Navigation Drawer点击崩溃问题求助
排查与解决Canvas绘制过大Bitmap导致崩溃的问题
核心问题定位
崩溃根源是应用尝试加载并绘制的Bitmap体积远超系统承载阈值(112896000字节≈108MB),且触发点为点击Navigation Drawer的汉堡按钮,说明问题集中在Navigation Drawer关联的布局、菜单资源或头部视图中。
具体排查步骤
- 检查Navigation Drawer头部布局(通常命名为
nav_header_xxx.xml):确认其中的ImageView是否使用了高分辨率本地原图(比如数K尺寸的图片),或是未经过压缩的网络图片。 - 排查Drawer菜单图标资源:查看
menu/nav_menu.xml里的item图标,是否误导入了超大尺寸的图片文件,而非适配的drawable资源。 - 检查代码动态设置Drawer内容的逻辑:如果存在代码中给Drawer视图设置Bitmap的操作,确认是否未对图片做压缩处理。
解决方法
1. 压缩本地图片资源
- 用图片编辑工具(如Photoshop、Figma)将超大尺寸图片压缩至合适规格:Navigation Drawer头部图片建议不超过1080x360px,菜单图标优先使用24x24dp/36x36dp的矢量图(Vector Drawable)。
- 替换为矢量图:图标类资源改用Vector Drawable,既不会因分辨率变化导致Bitmap体积超标,还能减小APK体积。
2. 代码中动态压缩Bitmap
若必须使用大尺寸图片(如用户上传的头像),加载时需强制压缩:
// Kotlin示例:将Bitmap压缩至指定尺寸 fun compressBitmap(originalBitmap: Bitmap, maxWidth: Int, maxHeight: Int): Bitmap { val width = originalBitmap.width val height = originalBitmap.height val scaleFactor = min(maxWidth.toFloat() / width, maxHeight.toFloat() / height) val matrix = Matrix() matrix.postScale(scaleFactor, scaleFactor) return Bitmap.createBitmap(originalBitmap, 0, 0, width, height, matrix, true) }
3. 优化ImageView布局属性
确保ImageView设置合理的缩放规则,避免无限制拉伸大图:
<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" <!-- 或fitCenter,按需选择 --> android:src="@drawable/nav_header_bg" />
4. 利用Android Studio工具检查资源
打开Analyze > Inspect Code,选择项目范围,检查Android > Performance > Unoptimized images,工具会自动识别未优化的大图并给出优化建议。
内容的提问来源于stack exchange,提问作者Soumik
相关产品推荐
相关产品推荐

