티스토리 뷰

Android/Gradle

AndroidGradle - SourceSets

강태종 2022. 3. 9. 22:47

SourceSets

프로젝트를 진행하면 빌드 유형(debug, relase...), 제품 버전(유료, 무료...) 등 다양한 이유로 특정 부분의 소스 코드를 여러 버전으로 관리할 경우가 생깁니다. 간단하게 파일 복사나 Git Branch로 관리할 수 있지만 SourceSets을 사용하면 쉽게 관리할 수 있습니다.

 

src/main

기본적으로 src/main에 코드를 작성하고 있습니다. main에는 모든 유형에 대해 공통적인 코드를 작성합니다. 

src/main


SourceSet 생성

app/src에 새로운 유형을 생성합니다. Gradle은 개발자가 src/main과 비슷한 방식으로 디렉토리를 구성할 것으로 예상합니다. 그렇기 때문에 다른 SourceSet을 생성할 때 src/main 같은 형식으로 디렉토리를 구성해야 합니다. productFlavors, buildTypes에 맞게 생성할 수 있으며 패키지 구조를 main과 맞게 설정합니다. 또한 productFlavors와 buildTypes를 합친 경우 productFlavors, buildTypes 순으로 이름을 지으면 됩니다.

SourceSets

생성

제 예제에서는 buildTypes에 따라 TextUtil의 기능을 분리했습니다. src/debug와 src/release에 TextUtil을 생성합니다. 여기서 주의할 점은 src/main에는 TextUtil을 생성하면 안됩니다. kotlin파일 뿐만 아니라 res, manifest 등 다양한 코드들을 분기할 수 있습니다.

TextUtil

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을 어떻게 사용했는지에 따라 우선순위가 달라집니다.

  1. src/hiDebug (productFlavors + buildTypes)
  2. src/debug (buildTyps)
  3. src/hi (productFlavors)
  4. 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
링크
«   2025/06   »
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
글 보관함