안드로이드 Glide SVG 이미지 로드 관련 오류 해결 - Failed to create image decoder with message 'unimplemented'

임현주·2022년 11월 4일
0
post-thumbnail

🚨 문제

현재 Glide 4.14.2 버전을 사용중

fun ImageView.load(drawable: Int) {
    Glide.with(this)
        .load(drawable)
        .transition(DrawableTransitionOptions.withCrossFade())
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .timeout(5000)
        .into(this)
}
D/skia: --- Failed to create image decoder with message 'unimplemented'

앱이 다운된다거나, 실행한 앱 내의 이미지 로드에 실패한 것은 아니고 단순히 로그에 찍히는 거라 찾다보니 이대로 그냥 남겨두기도 한다는 얘기도 있었다 😅 ...! 하지만 '버전에 따라 다르지 않을까' 혹은 '운이 좋아서 실행되는 거 아닐까' 싶어 꼭 해결해야겠다고 생각했다.

여러 상황을 시도해보니 서버부터 받은 url이나 Uri를 로드할 때는 정상 작동하다가 로컬의 drawable에 있는 SGV 이미지(VectorDrawable)를 로드하면서 위와 같은 문구가 로그에 찍히는 것을 확인할 수 있었다.


📝 해결

검색해보니 해당 유형의 이미지를 decode 하는 과정에서 Glide 내에 버그가 있다는 의견이 많았다. v4 버전의 Glide 사용자 중에 SVG 파일, VectorDrawable을 로드하면서 비슷한 문제를 겪고 있는 사례가 많았고, 버전에 따라 Exception ➡️ 앱이 다운되는 경우도 있다고 한다.

fun ImageView.load(drawable: Int) {
    val image = ContextCompat.getDrawable(context, drawable) as VectorDrawable
    Glide.with(this)
        .load(image)
        .transition(withCrossFade())
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .timeout(5000)
        .into(this)
}

이런 경우라면 load() 안에 drawable 값을 그대로 넣지 말고 ContextCompat을 사용해 Resource에서 직접 가져와서 넣어주면 해결된다❗️ placeholder()를 작성할 때도 마찬가지로 적용할 수 있다.

상황에 따라 as VectorDrawable (캐스팅) 부분은 생략해도 된다.

profile
🐰 피드백은 언제나 환영합니다

0개의 댓글