티스토리 뷰
SourceSets
프로젝트를 진행하면 빌드 유형(debug, relase...), 제품 버전(유료, 무료...) 등 다양한 이유로 특정 부분의 소스 코드를 여러 버전으로 관리할 경우가 생깁니다. 간단하게 파일 복사나 Git Branch로 관리할 수 있지만 SourceSets을 사용하면 쉽게 관리할 수 있습니다.
src/main
기본적으로 src/main에 코드를 작성하고 있습니다. main에는 모든 유형에 대해 공통적인 코드를 작성합니다.
SourceSet 생성
app/src에 새로운 유형을 생성합니다. Gradle은 개발자가 src/main과 비슷한 방식으로 디렉토리를 구성할 것으로 예상합니다. 그렇기 때문에 다른 SourceSet을 생성할 때 src/main 같은 형식으로 디렉토리를 구성해야 합니다. productFlavors, buildTypes에 맞게 생성할 수 있으며 패키지 구조를 main과 맞게 설정합니다. 또한 productFlavors와 buildTypes를 합친 경우 productFlavors, buildTypes 순으로 이름을 지으면 됩니다.
생성
제 예제에서는 buildTypes에 따라 TextUtil의 기능을 분리했습니다. src/debug와 src/release에 TextUtil을 생성합니다. 여기서 주의할 점은 src/main에는 TextUtil을 생성하면 안됩니다. kotlin파일 뿐만 아니라 res, manifest 등 다양한 코드들을 분기할 수 있습니다.
Gradle 설정
기본적으로 src에 이름에 맞게 설정한 경우 Gradle 설정없이 정상 작동하지만, 경우에 따라 직접 설정하는 케이스가 있습니다. Gradle에서 sourceSets를 통해 설정할 수 있습니다.
android {
...
sourceSets {
hiDebug {
java.srcDir("src/hiDebug")
}
debug {
java.srcDir("src/debug")
}
release {
java.srcDir("src/release")
}
}
...
}
결과
아래 예시를 보면 BuildVariant를 수정했을 때 결과가 달라지는 것을 확인할 수 있습니다.
SourceSets 규칙
productFlavors, buildTypes 등으로 SourceSets를 나눠서 코드를 분기할 수 있습니다. 하지만 productFlavors와 buildType이 여러개 존재하고 여러가지 SourceSets로 분기한 경우 파일들이 겹치게 되는데 이럴 때 Gradle에서 정한 기본 규칙으로 우선순위를 고려합니다.
우선순위
productFlavors와 buildType을 어떻게 사용했는지에 따라 우선순위가 달라집니다.
- src/hiDebug (productFlavors + buildTypes)
- src/debug (buildTyps)
- src/hi (productFlavors)
- src/main (기본 SourceSets)
SourceSets 규칙
SourceSets를 통해 java, res, manifest 등 파일을 분기할 수 있습니다. 하지만 분기한 파일 합칠 때 규칙이 있는데 규칙을 지키지 않은 경우 컴파일 에러가 발생합니다. ex) Unresolved reference, Redeclaration
- java, kotlin : 디렉토리에 있는 모든 소스 코드가 함께 컴파일되어 단일 출력을 생성합니다. 즉 같인 파일이 여러 SourceSets에 포함되면 Redeclration 에러가 발생하고, Build Variant에 따라 파일이 없으면 Unresolved reference가 발생합니다.
- manifest : 우선순위에 맞게 병합됩니다.
- res, asset : 같은 파일이 SourceSets에 있으면 우선순위에 맞게 병합됩니다.
'Android > Gradle' 카테고리의 다른 글
Android Gradle - Kotlin DSL, KTS (0) | 2022.04.03 |
---|---|
Android Gradle - signingConfigs (0) | 2022.03.10 |
Android Gradle - Build Variant (0) | 2022.03.10 |
- Total
- Today
- Yesterday
- 클린코드
- Exception
- DSL
- 연산자
- 함수
- TDD
- null
- CancellationException
- Flowable
- 보이스카우트 규칙
- ViewModelStoreOwner
- Widget
- Kotlin
- gradle
- commit
- clean code
- ConcatAdapter
- Coroutine
- ConcatAdapter.Config
- 클린 코드
- Flutter
- ViewModelProvider
- viewmodel
- DART
- Android
- git
- rxjava
- observable
- isActive
- 코루틴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |