0%

PNG파일이 아닌 XML파일로 Drawables 파일 지정시 발생되는 에러 (Can't process attribute ... references to other resources are not supported by build-time PNG generation.)

개요

간단한 WebView Application을 개발하고, Material Design 사이트에서 아이콘을 내려받아 이를 적용하는 작업을 진행하고 있었습니다.

해당 사이트에서는 PNG 파일과 XML 파일을 내려받을 수 있는데, PNG 이미지 파일의 사이즈는 고정적이기 때문에 되도록 XML 파일을 통해 추가하려고 시도했습니다.

(요즘 PNG raw 파일보단 XML을 통해 해상도 파편화 이슈로부터 자유로워지려는 트렌드도 한몫했구요.)

그러던 중, 아래와 같은 오류를 경험하게 된 것이죠.


오류 발생

java.lang.RuntimeException:
Error while processing /media/.../baseline_search_24.xml : Can't process attribute android:fillColor="@android:color/white": references to other resources are not supported by build-time PNG generation.
File was preprocessed as vector drawable support was added in Android 5.0 (API level 21)
See http://developer.android.com/tools/help/vector-asset-studio.html for details.

어떻게 해결해야할까요?

사용중인 Gradle 버전에 따라 각기 다르게 적용하면 됩니다.

build.gradle (Gradle 1.5 이하)
1
2
3
4
5
6
7
8
9
10
11
android {
defaultConfig {
// Stops the Gradle plugin’s automatic rasterization of vectors
generatedDensities = []
}

// Flag notifies aapt to keep the attribute IDs around
aaptOptions {
additionalParameters "--no-version-vectors"
}
}

또는,

build.gradle (Gradle 2.0 이상)
1
2
3
4
5
6
7
android {
defaultConfig{
vectorDrawables.useSupportLibrary = true
}

// ...
}

모양으로 build.gradle 파일을 수정하면 됩니다.


왜 발생할까요?

PNG과 같은 비트맵 파일을 사용하면 해상도에 따라 모자이크처럼 보이거나, 또는 상당히 작고 흐릿한 이미지로 출력되는 큰 단점이 있습니다. 그래서 중요한 기능에 대한 버튼 및 레이아웃 구성들은 XML와 같은 Vector 파일을 주로 사용하고 있는 추세입니다.

그러나 Android 5.0 롤리팝 (API 21) 이하의 버전의 환경들 모두가, 반드시 Vector 방식의 drawables를 불러올 수 있는 것이 아니기 때문에 반드시 위와 같은 코드들을 입력해야합니다.


참고

  1. Android Developers : Vector drawables backward compatibility solution