기본 모듈 구성

App Bundle은 기기에 배포할 수 없다는 점에서 APK와 다릅니다. 정확히 말해 App Bundle은 앱의 모든 컴파일된 코드 및 리소스를 단일 빌드 아티팩트에 포함하는 게시 형식입니다. 따라서 서명된 App Bundle을 업로드하면 Google Play는 앱의 APK를 빌드하고 서명하며 사용자에게 제공하는 데 필요한 모든 것을 갖추게 됩니다.

시작하기

대부분의 앱 프로젝트에서는 큰 노력을 기울이지 않고 간편하게 Android App Bundle을 지원할 수 있습니다. 그 이유는 앱의 기본 APK용 코드 및 리소스를 포함하는 모듈이 표준 앱 모듈이므로 Android 스튜디오에서 새로운 앱 프로젝트를 생성할 때 기본적으로 제공되기 때문입니다. 즉, 아래의 application 플러그인을 build.gradle 파일에 적용하는 모듈이 앱의 기본 기능을 위한 코드와 리소스를 제공합니다.

Groovy

// The standard application plugin creates your app's base module.
plugins {
 id 'com.android.application'
}

Kotlin

plugins {
    // The standard application plugin creates your app's base module.
    id("com.android.application")
}

기본 모듈은 앱의 핵심 기능을 제공하는 것 외에도 앱 프로젝트 전체에 영향을 주는 여러 빌드 구성 및 매니페스트 항목도 제공합니다.

기본 모듈 빌드 구성

대부분의 기존 앱 프로젝트에서는 기본 모듈의 빌드 구성을 바꾸지 않아도 됩니다. 그러나 앱 프로젝트에 기능 모듈을 추가하려고 하거나 이전에 여러 APK를 사용하여 앱을 출시했다면 기본 모듈의 빌드 구성에 관한 몇 가지 사항에 유의해야 합니다.

버전 코드 및 앱 업데이트

Android App Bundle을 사용하면 더 이상 Google Play에 업로드하는 여러 APK의 버전 코드를 관리하지 않아도 됩니다. 대신 아래와 같이 앱의 기본 모듈에서 하나의 버전 코드만 관리합니다.

// In your base module build.gradle file
android {
    defaultConfig {
        …
        // You specify your app’s version code only in the base module.
        versionCode 5
        versionName "1.0"
    }
}

App Bundle을 업로드하면 Google Play가 기본 모듈에 있는 버전 코드를 사용하여 App Bundle에서 생성한 모든 APK에 동일한 버전 코드를 할당합니다. 즉, 기기에 앱을 다운로드하여 설치하면 앱의 모든 분할 APK가 동일한 버전 코드를 공유합니다.

새 코드나 리소스로 앱을 업데이트하려면 반드시 앱 기본 모듈의 버전 코드를 업데이트하고 새 App Bundle 전체를 빌드해야 합니다. 빌드한 App Bundle을 Google Play에 업로드하면 기본 모듈에서 지정한 버전 코드를 기반으로 APK의 새로운 세트가 생성됩니다. 그 후에 사용자가 앱을 업데이트하면 Google Play에서 현재 기기에 설치된 모든 APK의 업데이트 버전을 제공합니다. 즉, 설치된 모든 APK가 새로운 버전 코드로 업데이트됩니다.

기타 고려사항

  • 앱 서명: 빌드 파일에 서명 정보를 포함하는 경우 기본 모듈의 빌드 구성 파일에만 포함해야 합니다. 자세한 내용은 앱 서명을 위한 Gradle 구성을 참고하세요.
  • 코드 축소: 전체 앱 프로젝트(기능 모듈 포함)에 코드 축소를 사용 설정하려면 반드시 기본 모듈의 build.gradle 파일에서 해야 합니다. 즉, 맞춤 ProGuard 규칙을 기능 모듈에 포함할 수는 있지만 기능 모듈 빌드 구성의 minifyEnabled 속성은 무시됩니다.
  • splits 블록이 무시됨: App Bundle을 빌드할 때 Gradle은 android.splits 블록에 있는 속성을 무시합니다. App Bundle이 지원하는 구성 APK 유형을 제어하려면 대신 android.bundle을 사용하여 구성 APK 유형을 사용 중지합니다.
  • 앱 버전 관리: 기본 모듈이 전체 앱 프로젝트의 버전 코드와 버전 이름을 결정합니다. 자세한 내용은 앱 업데이트 관리 방법 섹션을 참조하세요.

구성 APK 유형을 다시 사용 또는 사용 중지

기본적으로 App Bundle을 빌드할 때 App Bundle은 언어 리소스, 화면 밀도 리소스 및 ABI 라이브러리 세트마다 구성 APK를 생성하도록 지원합니다. 아래와 같이 기본 모듈의 build.gradle 파일에서 android.bundle 블록을 사용하여 하나 이상의 구성 APK 유형 지원을 중지할 수 있습니다.

Groovy

android {
    // When building Android App Bundles, the splits block is ignored.
    // You can remove it, unless you're going to continue to build multiple
    // APKs in parallel with the app bundle
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // This property is set to true by default.
            // You can specify `false` to turn off
            // generating configuration APKs for language resources.
            // These resources are instead packaged with each base and
            // feature APK.
            // Continue reading below to learn about situations when an app
            // might change setting to `false`, otherwise consider leaving
            // the default on for more optimized downloads.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

Kotlin

android {
    // When building Android App Bundles, the splits block is ignored.
    // You can remove it, unless you're going to continue to build multiple
    // APKs in parallel with the app bundle
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // This property is set to true by default.
            // You can specify `false` to turn off
            // generating configuration APKs for language resources.
            // These resources are instead packaged with each base and
            // feature APK.
            // Continue reading below to learn about situations when an app
            // might change setting to `false`, otherwise consider leaving
            // the default on for more optimized downloads.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

언어 변경 처리

Google Play는 사용자 기기 설정의 언어 선택에 따라 앱에 설치할 언어 리소스를 결정합니다. 이미 앱을 다운로드한 후 기본 시스템 언어를 변경하는 사용자가 있다고 가정해 보겠습니다. 앱에서 이 언어를 지원하면 기기는 Google Play에 이러한 언어 리소스의 추가 구성 APK를 요청하여 다운로드합니다.

애플리케이션 내부에 언어 선택 도구를 제공하고 시스템 수준의 언어 설정과 관계없이 앱의 언어를 동적으로 변경하는 앱의 경우 리소스 누락으로 인한 비정상 종료를 방지하기 위해 몇 가지를 변경해야 합니다. android.bundle.language.enableSplit 속성을 false로 설정하거나 추가 언어 리소스 다운로드에 설명된 대로 Play Core 라이브러리를 사용하여 주문형 언어 다운로드를 구현해 보세요.