[android] Resource Merging 에 대한 이야기..
http://tools.android.com/tech-docs/new-build-system/resource-merging
-
Gradle build 에서는 resource merge 에 대해 새로운 규칙이 적용된다.
기존의 build system 에서는 resource folder list 를 aapt(Android Asset Packaging Tool) 에 전달하며,
나중에 전달된 것이 overlay 로 작동한다. ( 옵션을 통해서 override 가 아닌 새로운 추가로 작동할 수도 있었다. )
overlay 로 작동한다는 것은 새로운 resource 에 대해서 추가되는 방식이다.
Gradle 에서는 aapt 에 전달하기 전에 single, merged resource folder 를 만들고, 이 녀석을 전달한다.
이 방식의 merge 는 incremental 한 장점이 있다.
-
3가지 type 의 resource 가 머지된다.
main sourceSet 에 있는 main resource ( src/main/res )
Build Type 과 Flavor 로부터 오는 변형 resource ( Build variant )
Library Project 에 depend 된 resource ( in AAR bundle )
-
다음의 순서로 Priority 를 갖는다.
Build variant > BuildType > Product Flavor > main source set > library Dependencies
-
sourceSet 은 아래와 같이 multiple resource folder 를 관리한다.
android.sourceSets{
main.res.srcDirs = [‘src/main/res’, src/main/res2’]
}
위와 같이 정의한 경우 2개의 folder 는 동일한 priority 를 갖는다.
이 말은 위의 folder 들에 동일한 resource 가 들어 있다면 build fail 이 발생한다.
-
Library project 의 실제 resource set 은 list 가 아니라 graph 이다.
그러나 merge 메커니즘은 flat priority list 만 다룬다.
예를 들어 Priority 가 A > B 이며, A library 가 C, D Project 를 참조하고, B 가 C 참조한다면,
Merge 에 전달되는 flat list 는 A D B C 가 된다.
A 와 B 모두가 C 를 override 한다는 것을 보장한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android Studio] Crash 났을 때 Log 날아가지 않도록 하기 (0) | 2018.03.08 |
---|---|
[android] 최고의 안드로이드 개발 원칙 (2) | 2018.03.07 |
[android] ArrayMap 과 SparseArray 를 이용한 최적화 (0) | 2018.03.05 |
[android] Visual Voicemail (0) | 2018.03.04 |
[android] ConstraintLayout Tutorial (0) | 2018.03.03 |
댓글