coil-compose 2.2.2 버전을 사용하여 URL 이미지를 랜더링할 때 아래와 같이 사용을 해왔다.
AsyncImage(
model = item.imageURL,
contentDescription = null
)
잘 될때도 있었지만, 특정 환경에 따라 아래와 같은 에러를 만나게 되었다.
FATAL EXCEPTION: main
Process: com.fnb.dodo, PID: 32272
java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps
at android.graphics.BaseCanvas.onHwBitmapInSwMode(BaseCanvas.java:683)
at android.graphics.BaseCanvas.throwIfHwBitmapInSwMode(BaseCanvas.java:690)
at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:94)
at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:152)
at android.graphics.Canvas.drawBitmap(Canvas.java:1588)
at androidx.compose.ui.graphics.AndroidCanvas.drawImageRect-HPBpro0(AndroidCanvas.android.kt:271)
at androidx.compose.ui.graphics.drawscope.CanvasDrawScope.drawImage-AZ2fEMs(CanvasDrawScope.kt:263)
at androidx.compose.ui.node.LayoutNodeDrawScope.drawImage-AZ2fEMs(Unknown Source:39)
at androidx.compose.ui.graphics.drawscope.DrawScope.drawImage-AZ2fEMs$default(DrawScope.kt:510)
at androidx.compose.ui.graphics.painter.BitmapPainter.onDraw(BitmapPainter.kt:93)
at androidx.compose.ui.graphics.painter.Painter.draw-x_KDEd0(Painter.kt:212)
at coil.compose.AsyncImagePainter.onDraw(AsyncImagePainter.kt:210)
...
아래 에러 메시지들이 눈에 띈다.
Software rendering doesn't support hardware bitmaps
coil.compose.AsyncImagePainter.onDraw(AsyncImagePainter.kt:210)
에러메시지로 유추해보니, 소프트웨어 랜더링이 하드웨어 비트맵을 지원하지 않아 발생한 것으로 보인다.
그렇다면, 하드웨어를 비트맵을 지원하지 않도록 변경하면 해결이 될 것 같다.
AsyncImage를 까보니, model 파라미터에 대한 설명이 아래와 같이 적혀있다.
model - Either an ImageRequest or the ImageRequest.data value.
ImageRequest가 힌트가 될 것 같으니, ImageRequest를 까보자.
ImageRequest.Builder에 allowHardware
함수가 존재한다.
/**
* @see ImageLoader.Builder.allowHardware
*/
fun allowHardware(enable: Boolean) = apply {
this.allowHardware = enable
}
그리고 allowHardware의 기본값은 true로 되어있다.
class DefaultRequestOptions(
...
val allowHardware: Boolean = true,
...
) {
하드웨어 허용을 하지 않도록 하니 문제가 해결되었다.
AsyncImage(
model = ImageRequest.Builder(context)
.data(item.imageURL)
.allowHardware(false)
.build(),
contentDescription = null
)