대부분의 앱 프로젝트에서는 큰 노력을 기울이지 않고 간편하게 Android App Bundle을 지원할 수 있습니다.
그 이유는 앱의 기본 APK용 코드 및 리소스를 포함하는 모듈이 표준 앱 모듈이므로 Android 스튜디오에서 새로운 앱 프로젝트를 생성할 때 기본적으로 제공되기 때문입니다.
즉, 아래 앱 플러그인을 build.gradle
파일에 적용하는 모듈은 앱의 기본 기능을 위한 코드와 리소스를 제공합니다.
// The standard application plugin creates your app's base module.
apply plugin: 'com.android.application'
앱의 초기 다운로드 크기를 줄이려는 경우 이 모듈에 포함된 모든 코드와 리소스가 앱의 기본 APK에 제공된다는 사실에 유의해야 합니다.
기본 모듈은 앱의 핵심 기능을 제공하는 것 외에도 앱 프로젝트 전체에 영향을 주는 여러 빌드 구성 및 매니페스트 항목도 제공합니다. 예를 들어 App Bundle 서명은 기본 모듈에 제공하는 정보에 따라 결정되고 모든 앱의 APK 버전 관리는 기본 모듈 매니페스트의 versionCode
속성에 지정됩니다. 기본 모듈의 다른 중요한 내용은 아래에서 설명합니다.
기본 모듈 매니페스트
앱 기본 모듈의 매니페스트는 다른 앱 모듈의 매니페스트와 비슷합니다. Google Play에서 앱의 기본 APK를 생성할 때 모든 모듈의 매니페스트가 기본 APK의 매니페스트에 병합됩니다. 따라서 앱 프로젝트에 기능 모듈을 추가하려면 아래에 나열된 기본 APK 매니페스트에 관한 몇 가지 사항에 유의해야 합니다.
기본 APK는 항상 가장 먼저 설치되므로 앱의 주요 진입점을 제공해야 합니다. 즉, 다음 인텐트 필터를 사용하여 활동을 선언해야 합니다.
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
다운로드한 모듈의 코드 및 리소스에 액세스하려면 매니페스트에 SplitCompat 라이브러리 지원 기능을 포함해야 합니다. 자세한 내용은 다운로드한 모듈의 코드 및 리소스 액세스를 참조하세요.
마찬가지로 Android 6.0(API 수준 23) 이하를 실행하는 기기에서는 앱을 다시 시작해야 플랫폼에서 새 매니페스트 항목을 적용할 수 있습니다. 따라서 기능 모듈을 다운로드하자마자 특정 권한이나 서비스가 필요하다면 기본 모듈의 매니페스트에 필요한 권한이나 서비스를 포함하는 것이 좋습니다.
Android App Bundle에는 압축되지 않은 네이티브 라이브러리 지원 기능이 포함되어 있습니다. Android Gradle 플러그인 3.6.0 이상을 사용하여 앱을 빌드할 때 사용자의 디스크 사용량을 줄이려면 플러그인에서 기본적으로 기본 모듈의 매니페스트에 다음을 설정해야 합니다.
<application android:extractNativeLibs="false" ... >
기본 모듈 빌드 구성
대부분의 기존 앱 프로젝트에서는 기본 모듈의 빌드 구성을 바꾸지 않아도 됩니다. 그러나 앱 프로젝트에 기능 모듈을 추가하려면 아래에 나열된 기본 모듈의 빌드 구성에 관한 몇 가지 사항에 유의해야 합니다.
- 앱 서명: 명령줄에서 App Bundle을 빌드하려는 경우가 아니라면 빌드 구성 파일에 서명 정보를 포함하지 않아도 됩니다. 그러나 서명 정보를 포함하는 경우에는 기본 모듈의 빌드 구성 파일에만 포함해야 합니다. 자세한 내용은 앱 서명을 위한 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 유형 지원을 중지할 수 있습니다.
android {
// When building Android App Bundles, the splits block is ignored.
splits {...}
// Instead, use the bundle block to control which types of configuration APKs
// you want your app bundle to support.
bundle {
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = true
}
abi {
// This property is set to true by default.
enableSplit = true
}
}
}
앱 업데이트 관리
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가 새로운 버전 코드로 업데이트됩니다.
추가 구성 APK 다운로드
위에서 설명한 업데이트 흐름의 한 가지 예외는 설치된 앱에 추가 구성 APK가 필요할 때입니다. 이미 앱을 다운로드한 후 기본 시스템 언어를 변경한 사용자가 있다고 가정해 보겠습니다. 앱에서 이 언어를 지원한다면 기기는 Google Play에 언어 리소스를 위한 추가 구성 APK를 요청하여 다운로드합니다. 하지만 이 유형의 앱 업데이트는 버전 코드를 변경하지 않으므로 기기는 필요한 구성 APK만 다운로드하여 설치합니다.