반응형

Android resource compilation failed


오픈소스를 하나 다운받이 분석해 보려 한다.

타겟은 omniNotes


소스를 다운받고, 빌드해서 실행해 보려 했으나 빌드 부터 말썽이다.


발생하는 오류는

Android resource compilation failed

[Source Path]\omniNotes\build\intermediates\incremental\mergeFossDebugResources\merged.dir\values\values.xml:896: error: <item> inner element must either be a resource reference or empty.

Source Path]\omniNotes\build\intermediates\incremental\mergeFossDebugResources\merged.dir\values\values.xml:898: error: <item> inner element must either be a resource reference or empty..

.


구글링 해보니 관련 이슈가 엄청나게 많다.


이해한 수준에서 간단히 정리하자면
Gradle Build tool이 업데이트 되면서, <item> 태그의 규칙을 엄격하게 체크하게 된것(?) 

이런식으로 기술된 것들을

<item name="child_text" type="id">childText</item>


아래와 같이 수정해 주어야 한다.

<item name="child_text" type="id"> 


즉 에러에 나와 있는 문구를 준수하면 된다.

<item> inner element must either be a resource reference or empty..


하지만, 전체 프로젝트를 search해 봐도 유사한 부분은 없다.

이번 케이스는 빌드하면서 자동생성되는 파일이기 때문에 수정이 불가하다는 얘기다


아마도 프로젝트가 참조하는 라이브러리에 관련 부분이 포함되어 있고, 
리소스를 컴파일 하면서 해당 부분이 문제가 되는 케이스로 추측된다.

혹시나 해서 최신버전이 아닌 라이브러리 들을 모두 최신으로 업데이트 해봤지만
에러가 발생하는 파일의 갯수가 줄기는 했지만 완전히 해결이 되진 않았다.

이리 저리 찾아보다가, 수정사항을 폐기하고 github에서 소스들 다시 받았더니 정상적으로 빌드가 되기 시작한다.
이건 뭐....
찝찝하지만 그상태로 소스를 보다가, 다음날 다시 해보니 또 동일한 오류가 발생한다.

어제 github에서 소스를 다시 받으니 빌드가 되었던것이 생각나서 변경사항을 확인해 보니
다음과 같이 딱 두군데가 차이가 있다.



Gradle Scripts > build.gradle(Project)의 com.android.tools.build:gradle버전을 3.3.1에서 3.1.2로 수정해 주니 정상적으로 빌드가 된다.
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6"
classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1'
}
// Exclude the version that the android plugin depends on.
configurations.classpath.exclude group: 'com.android.tools.external.lombok'
} 



오늘 프로젝트 빌드시 팝업된 업데이트를 별생각없이 진행했는데 이 영향을 받은 것으로 보인다.





물론, 문제의 소지는 여전히 가지고 있고, 근본적인 해결책이 되진 않는다만
우선은 소스 분석이 목적이니 그냥 넘어가도록 하자.



* 처음에는 이런 에러도 떴었는데, 이리 저리 하다 보니 없어졌는데, 정확한 조치가 어떤것이었는지는 정확히 모르겠음


C:\Users\xxxx\.gradle\caches\transforms-1\files-1.1\library-0.0.2.aar\88f4da1871053ebc65d966332b9adccc\res\values\values.xml:52:5-49: AAPT: error: <item> inner element must either be a resource reference or empty. 


* 대략 다음과 같은 가이드가 존재한다.

1. 위에서 설명한 <item type="id> 관련 부분 수정

2. Gradle.property에 android.enableAapt2=false 추가

3. Build 폴더 삭제


* 참고사이트

https://stackoverflow.com/questions/52503768/android-resource-compilation-failed-in-v3-2

https://stackoverflow.com/questions/52076491/android-inner-element-must-either-be-a-resource-reference-or-empty

https://blog.codejun.space/37



반응형

'안드로이드' 카테고리의 다른 글

코드 모음  (0) 2019.03.08
Navigation Drawer 의 Layout구조  (2) 2019.02.27
Activity간 Object 공유- Parcelable  (0) 2019.02.21
EditText 포커스 문제  (0) 2019.02.13
Android Studio 단축키  (0) 2018.12.21

+ Recent posts