빌드 구성

Android 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포할 수 있는 APK 또는 Android App Bundle로 패키징합니다.

Gradle 빌드 개요Android 빌드 구조에서 빌드 개념과 Android 앱의 구조에 관해 알아봤습니다. 이제 빌드를 구성해 보겠습니다.

Android 빌드 용어집

Gradle과 Android Gradle 플러그인을 사용하여 다음과 같은 빌드 요소를 구성할 수 있습니다.

빌드 유형

빌드 유형은 앱을 빌드하고 패키징할 때 Gradle이 사용하는 일부 속성을 정의합니다. 또한 일반적으로 개발 수명 주기의 다양한 단계에 맞춰 구성됩니다.

예를 들어, 디버그 빌드 유형은 디버그 옵션을 사용 설정하고 디버그 키로 앱에 서명하는 반면, 출시 빌드 유형은 배포를 위해 앱을 축소, 난독 처리하고 출시 키로 서명할 수도 있습니다.

앱을 빌드하려면 최소 하나 이상의 빌드 유형을 정의해야 합니다. Android 스튜디오는 기본으로 디버그 빌드 유형 및 출시 빌드 유형을 생성합니다. 앱의 패키징 설정을 맞춤설정하려면 빌드 유형 구성 방법을 알아보세요.

제품 버전
제품 버전은 무료 및 유료 버전과 같이 사용자에게 출시할 수 있는 앱의 여러 버전을 의미합니다. 제품 버전을 맞춤설정하여 다양한 코드와 리소스를 사용하면서 앱의 모든 버전에 공통되는 부분을 공유 및 재사용할 수 있습니다. 제품 버전은 선택사항이고 수동으로 만들어야 합니다. 다양한 버전의 앱을 생성하려면, 제품 버전 구성 방법에 관해 알아보세요.
빌드 변형
빌드 변형은 빌드 유형과 제품 버전의 크로스 프로덕트이며 앱을 빌드하기 위해 Gradle에서 사용하는 구성입니다. 빌드 변형을 사용하면 개발 중에 제품 버전의 디버그 버전을 빌드하거나 배포용 제품 버전의 서명된 출시 버전을 빌드할 수 있습니다. 개발자가 빌드 변형을 직접 구성하는 것은 아니며, 빌드 변형을 형성하는 빌드 유형과 제품 버전을 구성하는 것입니다. 빌드 유형이나 제품 버전을 추가로 생성하면 빌드 변형도 추가로 생성됩니다. 빌드 변형을 생성하고 관리하는 방법에 관한 자세한 내용은 빌드 변형 구성 개요를 참고하세요.
매니페스트 항목
빌드 변형 구성에서 매니페스트 파일의 일부 속성 값을 지정할 수 있습니다. 이 빌드 값은 매니페스트 파일의 기존 값을 재정의합니다. 이는 여러 개의 앱 변형을 생성하려는 경우 각 애플리케이션의 이름이 다르거나, 최소 SDK 버전 또는 타겟 SDK 버전이 다를 때 유용합니다. 여러 개의 매니페스트가 존재하는 경우 매니페스트 병합 도구는 매니페스트 설정을 병합합니다.
종속 항목
빌드 시스템은 로컬 파일 시스템과 원격 저장소에서 프로젝트 종속 항목을 관리합니다. 따라서 종속 항목의 바이너리 패키지를 수동으로 검색, 다운로드하거나 프로젝트 디렉터리에 복사할 필요가 없습니다. 자세한 내용은 빌드 종속 항목 추가를 참고하세요.
서명
빌드 시스템을 사용하여 빌드 구성에서 서명 설정을 지정할 수 있으며 빌드 프로세스 중에 앱에 자동으로 서명할 수 있습니다. 빌드 시스템은 알려진 사용자 인증 정보를 사용하여 기본 키와 인증서로 디버그 버전에 서명합니다. 이렇게 하면 빌드 시에 비밀번호를 묻는 메시지가 나타나지 않습니다. 이 빌드의 서명 구성을 명시적으로 정의하지 않는 한, 빌드 시스템은 출시 버전에 서명하지 않습니다. 출시 키가 없는 경우에는 앱 서명에 설명된 대로 출시 키를 생성할 수 있습니다. 대부분의 앱 스토어를 통해 앱을 배포하려면 서명된 출시 빌드가 필요합니다.
코드 및 리소스 축소
빌드 시스템을 사용하여 각 빌드 변형을 위한 다양한 ProGuard 규칙 파일을 지정할 수 있습니다. 앱을 빌드할 때 빌드 시스템은 R8과 같이 기본 제공되는 축소 도구를 사용하여 코드와 리소스를 축소하는 데 적절한 규칙 세트를 적용합니다. 코드와 리소스를 축소하면 APK 또는 AAB 크기를 줄일 수 있습니다.
다중 APK 지원
빌드 시스템으로 특정 화면 밀도나 Application Binary Interface(ABI)에 필요한 코드와 리소스만 포함된 다양한 APK를 자동으로 빌드할 수 있습니다. 자세한 내용은 다중 APK 빌드를 참고하세요. 하지만 단일 AAB를 출시하는 것이 좋습니다. 화면 밀도와 ABI 외에도 언어별 분할을 제공하면서 Google Play에 여러 아티팩트를 업로드할 필요가 없기 때문입니다. 2021년 8월 이후에 제출된 모든 신규 앱은 AAB를 사용해야 합니다.

Android 빌드의 Java 버전

소스 코드가 Java, Kotlin 또는 둘 다로 작성되었는지와 관계없이 빌드에 사용할 JDK 또는 Java 언어 버전을 선택해야 하는 여러 위치가 있습니다. 자세한 내용은 Android 빌드의 Java 버전을 참고하세요.

빌드 구성 파일

맞춤 빌드 구성을 생성하려면 하나 이상의 빌드 구성 파일을 변경해야 합니다. 이러한 일반 텍스트 파일은 도메인별 언어 (DSL)를 사용하여 Kotlin 언어의 한 가지 버전인 Kotlin 스크립트를 사용하여 빌드 로직을 설명하고 조작합니다. Java 가상 머신 (JVM)용 동적 언어인 Groovy를 사용하여 빌드를 구성할 수도 있습니다.

Android Gradle 플러그인에서 필요한 대부분의 DSL 요소를 도입하므로 빌드 구성을 시작하기 위해 Kotlin 스크립트 또는 Groovy를 알아야 할 필요는 없습니다. Android Gradle 플러그인 DSL에 관해 자세히 알아보려면 DSL 참조 문서를 읽어보세요. Kotlin 스크립트는 기본 Gradle Kotlin DSL도 사용합니다.

Android 스튜디오는 새 프로젝트를 시작할 때 이러한 파일 중 일부를 자동으로 만들고 적절한 기본값을 기반으로 파일을 채웁니다. 생성된 파일의 개요는 Android 빌드 구조를 참고하세요.

Gradle 래퍼 파일

Gradle 래퍼 (gradlew)는 소스 코드에 포함된 소형 애플리케이션으로, Gradle 자체를 다운로드하고 실행합니다. 이렇게 하면 빌드 실행이 더 일관되게 이루어집니다. 개발자가 애플리케이션 소스를 다운로드하고 gradlew를 실행합니다. 이렇게 하면 필요한 Gradle 배포가 다운로드되고 Gradle이 실행되어 애플리케이션이 빌드됩니다.

gradle/wrapper/gradle-wrapper.properties 파일에는 빌드를 실행하는 데 사용되는 Gradle 버전을 설명하는 속성 distributionUrl가 포함되어 있습니다.

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Gradle 설정 파일

settings.gradle.kts 파일 (Kotlin DSL용) 또는 settings.gradle 파일 (Groovy DSL용)은 루트 프로젝트 디렉터리에 있습니다. 이 설정 파일은 프로젝트 수준의 저장소 설정을 정의하며 앱을 빌드할 때 포함해야 하는 모듈을 Gradle에 알려줍니다. 다중 모듈 프로젝트는 최종 빌드에 들어가야 하는 각 모듈을 지정해야 합니다.

대부분의 프로젝트에서 파일은 기본적으로 다음과 같습니다.

Kotlin

pluginManagement {

    /**
      * The pluginManagement.repositories block configures the
      * repositories Gradle uses to search or download the Gradle plugins and
      * their transitive dependencies. Gradle pre-configures support for remote
      * repositories such as JCenter, Maven Central, and Ivy. You can also use
      * local repositories or define your own remote repositories. Here we
      * define the Gradle Plugin Portal, Google's Maven repository,
      * and the Maven Central Repository as the repositories Gradle should use to look for its
      * dependencies.
      */

    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {

    /**
      * The dependencyResolutionManagement.repositories
      * block is where you configure the repositories and dependencies used by
      * all modules in your project, such as libraries that you are using to
      * create your application. However, you should configure module-specific
      * dependencies in each module-level build.gradle file. For new projects,
      * Android Studio includes Google's Maven repository and the Maven Central
      * Repository by default, but it does not configure any dependencies (unless
      * you select a template that requires some).
      */

  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
      google()
      mavenCentral()
  }
}
rootProject.name = "My Application"
include(":app")

Groovy

pluginManagement {

    /**
      * The pluginManagement.repositories block configures the
      * repositories Gradle uses to search or download the Gradle plugins and
      * their transitive dependencies. Gradle pre-configures support for remote
      * repositories such as JCenter, Maven Central, and Ivy. You can also use
      * local repositories or define your own remote repositories. Here we
      * define the Gradle Plugin Portal, Google's Maven repository,
      * and the Maven Central Repository as the repositories Gradle should use to look for its
      * dependencies.
      */

    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {

    /**
      * The dependencyResolutionManagement.repositories
      * block is where you configure the repositories and dependencies used by
      * all modules in your project, such as libraries that you are using to
      * create your application. However, you should configure module-specific
      * dependencies in each module-level build.gradle file. For new projects,
      * Android Studio includes Google's Maven repository and the Maven Central
      * Repository by default, but it does not configure any dependencies (unless
      * you select a template that requires some).
      */

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "My Application"
include ':app'

최상위 빌드 파일

최상위 build.gradle.kts 파일 (Kotlin DSL용) 또는 build.gradle 파일 (Groovy DSL용)은 루트 프로젝트 디렉터리에 있습니다. 일반적으로 프로젝트의 모듈에서 사용하는 공통 버전의 플러그인을 정의합니다.

다음 코드 샘플은 새 프로젝트를 만든 후 최상위 빌드 스크립트의 기본 설정과 DSL 요소를 설명합니다.

Kotlin

plugins {

    /**
     * Use `apply false` in the top-level build.gradle file to add a Gradle
     * plugin as a build dependency but not apply it to the current (root)
     * project. Don't use `apply false` in sub-projects. For more information,
     * see Applying external plugins with same version to subprojects.
     */

    id("com.android.application") version "8.7.0" apply false
    id("com.android.library") version "8.7.0" apply false
    id("org.jetbrains.kotlin.android") version "2.0.20" apply false
}

Groovy

plugins {

    /**
     * Use `apply false` in the top-level build.gradle file to add a Gradle
     * plugin as a build dependency but not apply it to the current (root)
     * project. Don't use `apply false` in sub-projects. For more information,
     * see Applying external plugins with same version to subprojects.
     */

    id 'com.android.application' version '8.7.0' apply false
    id 'com.android.library' version '8.7.0' apply false
    id 'org.jetbrains.kotlin.android' version '2.0.20' apply false
}