본문 바로가기
프로그래밍/Android

Gradle 빌드 스크립트

by JLearn 2023. 4. 14.

Gradle은 어플리케이션을 빌드하기 위한 빌드 도구입니다. Java뿐만 아니라 다양한 언어, 다양한 플랫폼에서의 빌드를 지원하며 빌드 스크립트를 작성을 통하여 어플리케이션을 컴파일하고 패키징, 서명 등의 작업을 수행합니다.

 

안드로이드 스튜디오에서는 Gradle 플러그인 버전인 Android Gradle Plugin(AGP) 을 제공하여 안드로이드 앱을 빌드합니다. 빌드과정을 통하여 다음과 같은 작업이 수행됩니다.

 

  • 앱의 빌드 유형 (debug 또는 release) 및 빌드 버전 관리
  • 라이브러리 종속성 관리
  • 다양한 빌드 태스크 (예 : 컴파일, 패키징, 서명 등)의 관리
  • 안드로이드 앱 번들 (AAB) 및 APK 파일의 빌드
  • 안드로이드 앱 서명 및 릴리즈

 

'File' > 'Project Structure' > 'Project'를 선택하면 Android Gradle Plugin Version과 Gradle Version을 확인할 수 있습니다. 

 

아래표는 각 버전의 Android Gradle Plugin에 필요한 Gradle 버전을 보여줍니다. 최상의 성능을 위해서는 Gradle과 플러그인을 가능한 최신 버전으로 사용해야 합니다.

※ 출처: https://developer.android.com/studio/releases/gradle-plugin?hl=ko#updating-gradle

 

settings.gradle

'settigs.gradle'파일은 프로젝트의 구성을 정의하는 파일로 프로젝트에서 사용하는 모듈과 하위 프로젝트를 추가할 수 있습니다. 안드로이드 스튜디오에서 'Samples' 프로젝트를 생성하면 기본적으로 아래과 같은 'settings.gradle'을 포함합니다.

- pluginManagement {} : Gradle 플러그인 관리를 위한 설정을 정의합니다.

 

- repositories {} :  Gradle 플러그인을 다운로드 할 수 있는 저장소를 정의합니다. 


- dependencyResolutionManagement {} :  프로젝트에서 사용하는 의존성(dependency)을 관리하는 설정을 정의합니다.  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)는 프로젝트 저장소를 사용하는 것을 허용하지 않고 repositories {} 정의를 통하여 google()과 mavenCentral() 저장소를 사용하여 의존성을 다운로드합니다.


- rootProject.name : 프로젝트의 루트 디렉토리 이름입니다.

 

- include ':app' : 프로젝트에 포함될 모듈을 정의합니다. 여기서 ':app'은 안드로이드 앱 모듈을 의미합니다.  예를 들어 라이브러리 모듈을 추가한다면 include ':library'를, 공통 프로젝트를 추가한다면 include 'common'와 같이 include를 이용하여 모듈명 또는 프로젝트명을 추가로 정의하면 됩니다.

 

build.gradle(project)

'build.gradle (project)' 파일은 Gradle 프로젝트의 루트 프로젝트를 위한 설정 파일로 Gradle 빌드 시스템의 전체적인 동작을 정의합니다. 즉, 모든 하위 프로젝트 및 모듈에 대한 공통 구성 옵션을 추가할 수 있습니다.

plugins {}의 com.android.application과 com.android.library 플러그인은 Android 애플리케이션 및 라이브러리를 빌드하는 데 사용됩니다. apply false 옵션은 이 빌드 스크립트가 플러그인을 적용하지 않고, 하위 프로젝트 또는 모듈에서 각각 적용하도록 설정한다는 것을 의미합니다.

build.gradle(app)

'build.gradle (app)' 파일은 안드로이드 애플리케이션 모듈을 위한 설정 파일로, 애플리케이션 모듈의 빌드 및 패키징에 대한 설정을 정의합니다.

- plugins {}의 'com.android.application' :  안드로이드 앱 개발을 위한 Gradle 플러그인으로 Android Gradle Plugin(AGP)을 내부적으로 포함하고 있어 'com.android.application'을 사용하면 AGP가 자동으로 사용되는 것이며 또 안드로이드 앱 개발에 필요한 다양한 기능을 제공합니다.

- compileOptions {}: 정의된 Java 버전의 소스 및 대상 호환성을 설정합니다.

 

  • sourceCompatibility: 소스 코드가 작성된 Java 버전을 설정합니다. 컴파일러는 설정된 Java 버전으로 작성한 소스 코드를  컴파일합니다.
  • targetCompatibility: 컴파일된 클래스 파일이 실행되는 Java 버전을 설정합니다. 설정한 Java 버전으로 컴파일된 클래스 파일이 실행됩니다.

- flavorDimensions, productFlavors :

productFlavors를 사용하여 앱으 다른 버전을 설정할 수 있습니다. 위의 예는 'dev', 'uat', 'prd' 유형을 생성할 수 있습니다. 여기에 flavorDimensions를 설정하여 productFlavors를 그룹활 수 있습니다.

 

위와 같이 flavorsDimensions 'android' 설정을 하면 buildType과 연관되어

devDebug, devRelease, uatDebug, uatRelease, prdDebug, prdRelase 유형을 구분할 수 있으며 build작업을 수행하면 'Build Variants' 패널에서 확인 할 수 있습니다.

[ flavorDimensions 에 'sdk'를 추가하는 경우 ]
flavorDimensions 'android', 'sdk'
productFlavors{
     dev {
            dimension = "android"
            applicationIdSuffix ".dev"
     }
     uat {
            dimension = "android"
            applicationIdSuffix ".uat"
    }
    prd {
           dimension = "android"
    }
    oreo {
           dimension = "android"
           applicationIdSuffix ".oreo"
    }
    nougat {
           dimension = "android"
           applicationIdSuffix ".nougat" }
}

[Build Variants]
devOreoDeug, devOreoRelase, devNougatDebug, devNougatRelease, uatOreoDeug, uatOreoRelase, uatNougatDebug, uatNougatRelease, prdOreoDeug, prdOreoRelase, prdNougatDebug, prdNougatRelease  

 

- sourceSet : 프로젝트의 소스 코드와 리소스 파일을 지정한 디렉토리에서 찾을 수 있으며 필요한 경우 추가적인 디렉토리를 지정하여 사용할 수 있습니다.

 

안드로이드 프로젝트에서 main이라는 sourceSet이 제공되며, main은 안드로이드 애플리케이션의 소스 코드, 리소스 및 테스트 코드를 포함합니다. 위의 예시에서 productFlavors를 이용하 sourceSet을 구성할 수 있습니다.

productFlavors의 dev는 소스파일을 'src/main/java', 'src/dev/'java' 2곳의 디렉토리에서 찾고 리소스파일은 'src/main/res', 'src/dev/'res' 디렉토리에서 찾습니다. 이런 방식으로 productFlavors uat, prd의 소스파일과 리소스파일을 찾습니다.

 

마치며

'settings.gradle', 'build.gradle(project)', 'build.gradle(app)'는 안드로이드 애플리케이션 개발을 위한 Gradle 빌드 시스템의 구성 요소입니다.

안드로이드 앱 개발의 Gradle 빌드 시스템은 일반적으로 하나의 Gradle 프로젝트, 하나의 앱 모듀로 구성됩니다. 이와 같은 경우 settings.gradle 에서 하위 프로젝트를 정의, build.gradle(project) 에서 프로젝트 전체에 대한 설정, build.gradle(app) 에서 앱 모듈에 대한 설정을 정의하고 해당 Gradle 빌드스크립트로 앱 빌드와  패키징 작업이 수행됩니다.

'프로그래밍 > Android' 카테고리의 다른 글

액티비티(Activity) 생명주기  (0) 2023.04.15
Density-independent pixels  (0) 2023.04.13
컨텍스트(Context)  (0) 2023.04.11
AndroidManifest.xml  (0) 2023.04.10
가상 디바이스(Virtual Device) 생성  (0) 2023.04.10

댓글