Android App Bundle 형식

Android App Bundle은 Google Play에 업로드하는 파일(파일 확장자는 .aab)입니다.

App Bundle은 그림 1에 표시된 것처럼 앱의 코드와 리소스를 모듈로 구성하는 서명된 바이너리입니다. 각 모듈의 코드와 리소스는 APK에서와 비슷한 형태로 구성됩니다. 각 모듈이 별개의 APK로 생성될 수 있다는 점을 고려하면 이 같은 구성은 합리적입니다. Google Play는 App Bundle을 사용하여 기본 APK, 기능 APK, 구성 APK, 다중 APK(분할 APK를 지원하지 않는 기기용) 등 사용자에게 제공되는 다양한 APK를 생성합니다. drawable/, values/lib/ 디렉터리 같이 파란색으로 표시된 디렉터리는 Google Play에서 각 모듈의 구성 APK를 만드는 데 사용하는 코드와 리소스를 나타냅니다.

App Bundle은 앱을 디렉터리로 구성하는데, 각 디렉터리는 모듈을 나타냅니다. 각 모듈 디렉터리 내에서 코드와 리소스는 일반 APK의 코드 및 리소스와 유사한 형태로 구성됩니다.

그림 1. 기본 모듈 한 개, 기능 모듈 두 개, 애셋 팩 두 개로 구성된 Android App Bundle 콘텐츠

다음 목록에는 App Bundle의 일부 파일과 디렉터리가 더 자세히 설명되어 있습니다.

  • base/, feature1/ 및 feature2/: 이러한 최상위 디렉터리는 앱의 각기 다른 모듈을 나타냅니다. 앱의 기본 모듈은 항상 App Bundle의 base 디렉터리에 포함되어 있습니다. 그러나 각 기능 모듈의 디렉터리 이름은 모듈의 매니페스트에 있는 split 속성으로 지정됩니다. 자세한 내용은 기능 모듈 매니페스트를 참고하세요.
  • asset_pack_1/ 및 asset_pack_2/: 그래픽이 많이 요구되는 대규모 앱 또는 게임의 경우 애셋을 애셋 팩으로 모듈화할 수 있습니다. 애셋 팩은 크기 제한이 크기 때문에 게임에 적합합니다. 설치 시, 빠른 추적 및 주문형의 세 가지 전송 모드에 따라 각 애셋 팩이 기기에 다운로드되는 방식 및 시기를 맞춤설정할 수 있습니다. 모든 애셋 팩은 Google Play에서 호스팅되고 제공됩니다. App Bundle에 애셋 팩을 추가하는 방법을 자세히 알아보려면 Play Asset Delivery 개요를 참고하세요.
  • BUNDLE-METADATA/: 이 디렉터리에는 도구 또는 앱 스토어에 관한 유용한 정보가 포함된 메타데이터 파일이 들어 있습니다. 이러한 메타데이터 파일에는 ProGuard 매핑과 앱의 전체 DEX 파일 목록이 들어 있을 수 있습니다. 이 디렉터리의 파일은 앱의 APK에 패키징되지 않습니다.
  • 모듈 프로토콜 버퍼(*.pb) 파일: 이 파일은 Google Play와 같은 앱 스토어에 각 앱 모듈의 콘텐츠를 설명하는 데 도움이 되는 메타데이터를 제공합니다. 예를 들어 BundleConfig.pb는 App Bundle을 빌드하는 데 사용된 빌드 도구의 버전과 같은 번들 자체에 관한 정보를 제공하고, native.pbresources.pb는 Google Play가 다양한 기기 설정에 맞게 APK를 최적화하는 데 유용한 각 모듈의 코드 및 리소스를 설명합니다.
  • manifest/: APK와 달리 App Bundle은 각 모듈의 AndroidManifest.xml 파일을 별도의 이 디렉터리에 저장합니다.
  • dex/: APK와 달리 App Bundle은 각 모듈의 DEX 파일을 별도의 이 디렉터리에 저장합니다.
  • res/, lib/ 및 assets/: 이러한 디렉터리는 일반 APK의 디렉터리와 동일합니다. App Bundle이 업로드되면 Google Play는 이러한 디렉터리를 검사하고 파일 경로를 그대로 유지하면서 대상 기기 설정을 충족하는 파일만 패키징합니다.
  • root/: 이 디렉터리에는 나중에 APK의 루트로 재배치되는 파일이 저장됩니다. APK의 루트에는 이 디렉터리가 속한 모듈이 포함됩니다. 예를 들어 App Bundle의 base/root/ 디렉터리에는 Class.getResource()를 사용하여 앱이 로드하는 자바 기반 리소스가 포함될 수 있습니다. 이러한 파일은 앱의 기본 APK 및 Google Play에서 생성하는 모든 다중 APK의 루트 디렉터리로 나중에 재배치됩니다. 이 디렉터리 내의 경로도 보존됩니다. 즉, 디렉터리와 하위 디렉터리도 APK의 루트로 재배치됩니다.

분할 APK 개요

최적화된 애플리케이션을 제공하는 기본 구성요소는 Android 5.0(API 수준 21) 이상에서 사용할 수 있는 분할 APK 메커니즘입니다. 분할 APK는 일반 APK와 매우 유사하며 컴파일된 DEX 바이트 코드, 리소스, Android 매니페스트가 포함되어 있습니다. 하지만 Android 플랫폼은 설치된 여러 개의 분할 APK를 단일 앱처럼 처리할 수 있습니다. 즉, 일반 코드 및 리소스에 액세스할 수 있는 여러 개의 분할 APK를 설치할 수 있으며 기기에는 설치된 하나의 앱처럼 표시됩니다.

분할 APK의 장점은 모놀리식 APK, 즉 앱에서 지원하는 모든 기능 및 기기 설정에 관련된 코드와 리소스를 포함하는 APK를 요구에 따라 사용자 기기에 설치된 더 작은 별개의 패키지로 나눌 수 있다는 점입니다.

예를 들어 하나의 분할 APK에 일부 사용자에게만 필요한 추가 기능에 관련된 코드 및 리소스를 포함하고 또 다른 분할 APK에는 특정 언어나 화면 밀도에만 사용되는 리소스를 포함할 수 있습니다. 이러한 각 분할 APK는 사용자가 요청하거나 기기에서 요구할 경우 다운로드 및 설치됩니다.

다음은 전체 앱 환경을 구성하기 위해 기기에 함께 설치될 수 있는 다양한 APK 유형에 관해 설명합니다. 이 페이지의 뒷부분에서 이러한 APK를 지원하기 위해 앱 프로젝트를 구성하는 방법에 관해 배웁니다.

  • 기본 APK: 이 APK에는 모든 다른 분할 APK가 액세스할 수 있는 코드와 리소스가 포함되며 앱의 기본 기능을 제공합니다. 사용자가 앱을 다운로드하도록 요청하면 이 APK가 가장 먼저 다운로드되어 설치됩니다. 기본 APK의 매니페스트에만 앱의 서비스, 콘텐츠 제공업체, 권한, 플랫폼 버전 요구사항, 시스템 기능 종속 항목에 관한 전체 선언이 포함되어 있기 때문입니다. Google Play는 프로젝트의 앱(또는 기본) 모듈에서 앱의 기본 APK를 생성합니다. 앱의 초기 다운로드 크기를 줄이려는 경우 이 모듈에 포함된 모든 코드와 리소스가 앱의 기본 APK에 포함된다는 사실에 유의해야 합니다.
  • 구성 APK: 각 구성 APK에는 특정 화면 밀도, CPU 아키텍처, 언어에 관한 네이티브 라이브러리 및 리소스가 포함됩니다. 사용자가 앱을 다운로드하면 사용자 기기에서는 기기를 타겟팅하는 구성 APK만 다운로드하여 설치합니다. 각 구성 APK는 기본 APK 또는 기능 모듈 APK의 종속 항목입니다. 즉, 코드 및 리소스를 제공하는 대상인 APK와 함께 다운로드되고 설치됩니다. 기본 모듈 및 기능 모듈과 달리 구성 APK용 모듈을 별도로 만들지 않습니다. 표준 관행을 사용하여 기본 및 기능 모듈을 위한 구성별 대체 리소스를 구성하면 Google Play에서 구성 APK를 자동으로 생성합니다.
  • 기능 모듈 APK: 이러한 각 APK에는 기능 모듈을 사용하여 모듈화하는 앱 기능을 위한 코드와 리소스가 포함되어 있습니다. 그러면 기능을 언제 어떻게 기기에 다운로드할지 맞춤설정할 수 있습니다. 예를 들어 Play Core 라이브러리를 사용하면 기본 APK를 기기에 설치한 후 요청에 따라 기능을 설치하여 사용자에게 추가 기능을 제공할 수 있습니다. 사용자가 사진을 캡처하여 전송하는 기능을 사용하도록 요청했을 때만 그와 같은 기능을 다운로드하고 설치하는 채팅 앱을 고려해보세요. 설치 시 기능 모듈이 제공되지 않을 수 있으므로 기본 APK에 모든 일반 코드 및 리소스를 포함해야 합니다. 즉, 기능 모듈은 설치 시 기본 APK의 코드 및 리소스만 제공된다고 가정해야 합니다. Google Play는 프로젝트의 기능 모듈에서 앱의 기능 모듈 APK를 생성합니다.

기능 모듈이 세 개 있고 여러 기기 설정을 지원하는 앱을 생각해 보세요. 아래 그림 1에서 앱의 다양한 APK와 관련된 종속 항목 트리의 모양을 볼 수 있습니다. 기본 APK는 트리의 최상위에 위치하고 기타 모든 APK는 기본 APK에 종속됩니다. (Android App Bundle에서 이와 같은 APK 모듈이 표시되는 방식이 궁금하다면 Android App Bundle 형식을 참고하세요.)

기본 APK는 기능 모듈 APK가 포함된 트리의 최상위에 위치하며 기능 모듈 APK는 기본 APK에 종속됩니다. 기본 APK 및 각 기능 모듈 APK의 기기 설정별 코드와 리소스가 포함된 구성 APK는 종속 항목 트리의 리프 노드를 구성합니다.

그림 1. 분할 APK를 사용하여 게재된 앱의 종속 항목 트리

이러한 APK는 개발자가 직접 빌드할 필요가 없습니다. Google Play에서는 개발자가 Android 스튜디오를 사용하여 빌드한 단일 서명된 App Bundle을 이용하여 APK를 대신 빌드해 줍니다. App Bundle 형식 및 빌드 방법에 관해 자세히 알아보려면 Android App Bundle 빌드, 배포, 업로드를 참조하세요.

Android 4.4(API 수준 19) 이하를 실행 중인 기기

Android 4.4(API 수준 19) 이하를 실행하는 기기는 분할 APK 다운로드 및 설치를 지원하지 않으므로 Google Play에서는 이러한 기기에 해당 기기 설정에 최적화된 멀티 APK라고 하는 단일 APK를 제공합니다. 즉, 멀티 APK는 전체 앱 환경을 나타내지만 다른 화면 밀도 및 CPU 아키텍처와 같은 불필요한 코드 및 리소스를 포함하지 않습니다.

하지만 앱에서 지원하는 모든 언어 관련 리소스는 포함되어 있습니다. 이에 따라 사용자는 다른 멀티 APK를 다운로드하지 않아도 앱의 기본 언어 설정을 변경할 수 있습니다.

다중 APK에는 주문형으로 기능 모듈을 나중에 다운로드하는 기능이 없습니다. 이 APK에 기능 모듈을 포함하려면 기능 모듈을 만들 때 주문형을 사용 중지하거나 융합을 사용 설정해야 합니다.

App Bundle을 사용하면 앱에서 지원하는 기기 설정마다 APK를 빌드, 서명, 업로드, 관리하지 않아도 됩니다. 전체 앱의 단일 App Bundle을 빌드하고 업로드하기만 하면 Google Play에서 나머지 과정을 처리해 줍니다. 따라서 Android 4.4 이하를 실행하는 기기 지원 여부와 관계없이 Google Play에서는 개발자와 사용자 모두에게 유연한 제공 메커니즘을 이용할 수 있습니다.

사용자 언어 변경사항

App Bundle을 통해 기기는 앱을 실행하는 데 필요한 코드와 리소스만 다운로드합니다. 따라서 언어 리소스의 경우 사용자 기기는 기기의 설정에서 현재 선택된 하나 이상의 언어와 일치하는 앱의 언어 리소스만 다운로드합니다.

사용자가 기기 설정에서 언어를 전환하면 앱을 새 언어로 표시하기 전에 Google Play에서 분할 APK를 추가로 다운로드하여 설치해야 할 수 있습니다.

언어가 전환된 직후 Google Play는 즉시 추가 언어의 다운로드를 시도합니다. 사용자 기기가 오프라인이거나 다운로드에 실패하거나 리소스가 너무 크면 Google Play는 기기 조건이 더 적합할 때 백그라운드에서 다운로드를 다시 시도합니다. Android 9.0(API 수준 28) 이하를 사용하는 기기에서 실행될 때 새로운 언어 분할 APK를 설치하는 동안 앱이 포그라운드에 있으면 앱은 종료됩니다.

언제든지 모든 언어를 기기에서 사용할 수 있어야 하는 앱이라면 빌드 구성에서 언어 분할을 사용 중지하면 됩니다.

기기 설정에서 선택된 사용자 언어와는 관계없이 추가 언어를 다운로드해야 하는 앱의 경우(예: 인앱 언어 선택 도구 구현을 위해) Play Core 라이브러리를 사용하여 주문형으로 다운로드하면 됩니다.