Bitmap.createBitmap创建位图时抛出IllegalArgumentException异常排查
Android 位图处理 createBitmap 调用 IllegalArgumentException 异常排查
问题背景
开发Android位图处理逻辑时,在Bitmap.createBitmap()调用位置触发IllegalArgumentException,对应实现代码如下:
val sourceBitmap = resizeImageWithAspectRatio(bitmap, scaleImage) ?: return null var maxHeight: Int = (scaleImage * .19).roundToInt() if(maxHeight == 0) maxHeight = 1 val resultBitmap = Bitmap.createBitmap( maxHeight, maxHeight, Bitmap.Config.ARGB_8888 )
已知该异常的常见触发场景是传入宽高参数为0,但代码中已经添加了maxHeight为0时赋值为1的兜底逻辑,排除参数为0的场景后,异常还有以下可能触发原因:
- 传入的宽高参数为负数:现有逻辑仅对maxHeight等于0的场景做了兜底,没有处理负数情况。如果上游传入的
scaleImage参数本身为负值(比如参数传递错误、前置缩放逻辑计算异常),scaleImage * 0.19的结果经roundToInt()转换后会得到负整数,传入负数宽高调用createBitmap会直接抛出参数非法异常。 - Bitmap内存分配失败被判定为参数非法:并非所有内存分配失败都会抛出OutOfMemoryError,部分Android版本、定制ROM的Bitmap实现在native层申请对应像素内存失败时(比如计算得到的位图大小超过应用单Bitmap内存分配阈值、应用当前剩余可用内存不足),会直接抛出IllegalArgumentException,而非OOM。
- Bitmap.Config 参数不兼容:如果运行设备系统版本过低不支持指定的像素配置、定制ROM存在框架层修改导致Config常量取值异常、或者开启硬件加速后Config被隐式替换为仅高版本支持的
HARDWARE类型,都会导致createBitmap校验配置参数不通过,抛出异常。 - 线程环境异常:如果在未初始化渲染上下文的子线程中创建依赖硬件加速的位图,部分系统会判定创建参数不合法抛出异常,而非明确的线程错误。
排查时可以先在createBitmap调用前加日志打印maxHeight的实际取值、当前应用剩余内存、当前使用的Config类型,能快速定位根因。
内容的提问来源于stack exchange,提问作者lincx
相关产品推荐
相关产品推荐

