coil-compose Software rendering doesn't support hardware bitmaps error

강현석·2023년 1월 15일
0

troubleshooting

목록 보기
3/7

현상

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
)
profile
볼링을 좋아하는 안드로이드 개발자

0개의 댓글