Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

Android App Bundle 정보

Android App Bundle은 앱의 모든 컴파일된 코드 및 리소스를 포함하며 APK 생성 및 서명을 Google Play에 맡기는 게시 형식입니다.

Google Play는 App Bundle을 사용하여 각 기기 설정에 맞게 최적화된 APK를 생성하고 제공합니다. 따라서 앱을 실행하기 위해서는 특정 기기에 필요한 코드와 리소스만 다운로드하면 됩니다. 개발자는 더 이상 다양한 기기 지원을 최적화하기 위해 여러 개의 APK를 빌드, 서명 및 관리할 필요가 없으며, 사용자는 더 작고 최적화된 앱을 다운로드하게 됩니다.

대부분의 앱 프로젝트에서는 최적화된 APK 제공을 지원하는 App Bundle을 쉽게 빌드할 수 있습니다. 예를 들어 기존 규칙에 따라 앱의 코드 및 리소스를 구성했다면 Android 스튜디오 또는 명령줄을 사용하여 서명된 Android App Bundle을 빌드하고 Google Play에 업로드하세요. 그러면 최적화된 APK 제공 기능이 자동으로 실행됩니다.

App Bundle 형식을 사용하여 앱을 게시할 때 선택적으로 Play 기능 전송을 활용할 수 있으며, 이 경우 기능 모듈을 앱 프로젝트에 추가할 수 있습니다. 이러한 모듈에는 사용자가 앱을 처음 다운로드하여 설치할 때 포함되지 않도록 선택할 수 있는 기능과 리소스가 포함되어 있습니다. Play Core 라이브러리를 사용하면 앱에서 나중에 이러한 모듈을 다운로드하도록 요청할 수 있습니다. Google Play는 이 모듈의 코드 및 리소스만 기기에 제공합니다.

App Bundle로 앱을 게시하는 게임 개발자는 Play Asset Delivery를 사용할 수 있습니다. 대량의 게임 애셋을 전송하기 위한 Google Play의 솔루션으로, 개발자에게 유연한 전송 방법과 고성능을 제공합니다.

다음 동영상에서 Android App Bundle을 사용하여 앱을 게시해야 하는 이유를 간략하게 알아볼 수 있습니다.

Android App Bundle을 사용하면 압축 다운로드 크기 제한이 이제 150MB입니다. APK 확장 파일과 함께 App Bundle을 사용할 수 없습니다.

Android 스튜디오 3.2 이상을 사용 중이라면 몇 번의 클릭만으로 Android App Bundle을 빌드할 수 있습니다.

이 페이지에서는 Android App Bundle을 빌드하기 위한 단계를 비롯하여 App Bundle과 관련된 중요한 개념을 설명합니다.

시작하기

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

Android 스튜디오를 사용하고 있다면 몇 번의 클릭만으로, 서명된 App Bundle 형태로 프로젝트를 빌드할 수 있습니다. IDE를 사용하지 않는다면 명령줄에서 App Bundle을 빌드할 수 있습니다. 그런 다음 Play Console에 App Bundle을 업로드하여 앱을 테스트하거나 게시합니다.

App Bundle을 빌드하려면 다음 단계를 따르세요.

  1. Android 스튜디오 3.2 이상을 다운로드합니다. 기능 모듈을 추가하고 App Bundle을 빌드하는 가장 쉬운 방법입니다.

  2. 기본 모듈을 포함하고 구성 APK용 코드와 리소스를 체계화하며 선택적으로 기능 모듈을 추가하여 Play 기능 전송을 지원합니다.

  3. Android 스튜디오를 사용하여 Android App Bundle을 빌드합니다. 또한 실행/디버그 구성을 수정하고 App Bundle에서 APK를 배포하는 옵션을 선택하여 App Bundle에서 앱을 연결된 기기에 배포할 수 있습니다. 이 옵션을 사용하면 APK만 빌드하고 배포할 때보다 빌드 시간이 더 늘어난다는 점을 유의하세요.

  4. Android App Bundle을 사용하여 기기에 배포할 APK를 생성함으로써 Android App Bundle을 테스트합니다.

  5. 앱 Play 앱 서명에 등록합니다. 그러지 않으면 Play Console에 App Bundle을 업로드할 수 없습니다.

  6. Google Play에 App Bundle을 게시합니다.

애셋 팩이 포함된 App Bundle을 빌드하려면 Play Asset Delivery 정보를 참고하세요.

App Bundle 테스트

Android App Bundle을 빌드한 후에는 Google Play에서 어떻게 Android App Bundle을 사용하여 APK를 생성하는지, 그리고 이 APK가 기기에 배포되었을 때 어떻게 작동하는지 테스트해야 합니다.

App Bundle을 테스트하려면 다음 방법을 사용하세요.

Play Core 라이브러리로 기능 모듈 다운로드

앱에 기능 모듈이 포함된 경우 Play Core 라이브러리를 사용하여 기능 모듈 다운로드를 요청, 모니터링, 관리해야 합니다. 자세히 알아보려면 Play Core 라이브러리로 모듈 다운로드를 참고하세요.

라이브러리의 실제 동작을 보려면 Play Core 라이브러리 샘플 앱 을 사용해 보세요.

인스턴트 앱 관련 참고사항

Android 스튜디오 3.2 이상에서는 앱 크기가 작은 경우에 한해 App Bundle에 인스턴트 환경을 추가할 수 있습니다. 만들 수 있는 다양한 인스턴트 환경 유형의 크기 제한에 관한 자세한 내용은 Google Play 인스턴트 개요를 참조하세요.

압축 다운로드 크기 제한

Android App Bundle을 사용하여 게시하면 사용자가 가능한 가장 작은 다운로드로 앱을 설치할 수 있으며 압축 다운로드 크기 제한이 150MB로 증가합니다. 즉, 사용자가 앱을 다운로드할 때 앱을 설치하는 데 필요한 압축 APK의 총 크기(예: 기본 APK + 구성 APK)는 150MB 이하여야 합니다. 주문형 기능 모듈(및 구성 APK)을 다운로드하는 등 후속 다운로드에서도 이 같은 압축 다운로드 크기 제한을 충족해야 합니다. 애셋 팩은 이 크기 제한에 영향을 미치지 않지만 다른 크기 제한이 있습니다.

App Bundle을 업로드할 때 Play Console에서 앱 또는 주문형 기능의 다운로드 크기가 150MB를 초과하는 것으로 확인되면 오류가 발생합니다.

Android App Bundle은 APK 확장(*.obb) 파일을 지원하지 않는다는 점에 유의하시기 바랍니다. 따라서 App Bundle을 게시할 때 이 오류가 발생하면 다음 리소스 중 하나를 사용하여 압축된 APK 다운로드 크기를 줄입니다.

  • 각 구성 APK 유형에 enableSplit = true를 설정하여 모든 구성 APK를 사용 설정해야 합니다. 이렇게 하면 사용자가 기기에서 앱을 실행하는 데 필요한 코드와 리소스만 다운로드하게 됩니다.
  • 사용하지 않는 코드와 리소스를 삭제하여 앱 크기를 줄입니다.
  • 앱 크기를 추가로 줄일 수 있는 권장사항을 따릅니다.
  • 일부 사용자만 사용하는 기능의 경우 나중에 요청 시 앱에서 다운로드할 수 있는 기능 모듈로 변환하는 것이 좋습니다. 이 작업에는 앱 리팩터링이 일부 필요할 수 있으므로 위에 설명된 다른 방법을 먼저 시도해 봅니다.

알려진 문제

다음은 현재 Android App Bundle로 앱을 빌드하거나 제공할 때 발생하는 알려진 문제입니다. 아래에 설명되지 않은 문제가 발생하면 버그를 신고해 주세요.

  • 사이드로드된 앱, 즉 Google Play 스토어를 사용하여 설치되지 않고 하나 이상의 필수 분할 APK가 누락된 앱의 부분 설치는 모든 Google 인증 기기 및 Android 10(API 수준 29) 이상을 실행하는 기기에서 실패합니다. Google Play 스토어를 통해 앱을 다운로드할 때 Google은 앱의 모든 필수 구성요소가 설치되어 있는지 확인합니다.
  • 리소스 테이블을 동적으로 수정하는 도구를 사용한다면 App Bundle에서 생성된 APK가 예기치 않게 동작할 수 있습니다. 따라서 App Bundle을 빌드할 때 그러한 도구를 사용 중지하는 것이 좋습니다.
  • 기능 모듈의 매니페스트에서 기본 모듈에 없는 리소스를 참조해서는 안 됩니다. Google Play가 앱의 기본 APK를 생성할 때 모든 모듈의 매니페스트를 기본 APK의 매니페스트에 병합하기 때문입니다. 따라서 기본 APK의 매니페스트가 기본 APK에 없는 리소스를 참조하는 경우 리소스 연결이 깨집니다.
  • Android 스튜디오 3.2 Canary 14부터 앱 기본 모듈의 빌드 변형을 변경하면 동일한 빌드 변형이 기본 모듈에 종속되는 기능 모듈에 자동으로 선택되지 않습니다. 따라서 앱을 빌드할 때 오류가 발생할 수 있습니다. 기본 모듈과 기본 모듈에 종속된 다른 모듈에 사용할 동일한 빌드 변형을 선택하기만 하면 됩니다.
  • 현재 기능 모듈의 빌드 구성에서는 기본 모듈(또는 다른 모듈)의 속성과 충돌하는 속성을 구성할 수 있습니다. 예를 들어 기본 모듈에서 buildTypes.release.debuggable = true를 설정하고 기능 모듈에서 false로 설정할 수 있습니다. 이러한 충돌은 빌드 및 런타임 문제를 야기할 수 있습니다. 기본적으로 기능 모듈은 기본 모듈의 빌드 구성을 일부 상속한다는 점에 유의하시기 바랍니다. 따라서 기능 모듈 빌드 구성에서 유지해야 할 구성과 생략해야 할 구성을 파악해야 합니다.
  • 기능 모듈을 다운로드하려면 기기에 최신 버전의 Play 스토어 앱이 설치되어 있어야 합니다. 따라서 앱에 기능 모듈이 포함되어 있다면 극소수의 사용자를 위한 다운로드는 하나의 최적화된 다중 APK로 대체할 수 있으며 이는 Android 4.4(API 수준 20) 이하를 실행하는 기기에서와 동일한 다운로드 환경입니다.

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/ and 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의 manifest에만 앱의 서비스, 콘텐츠 제공업체, 권한, 플랫폼 버전 요구사항, 시스템 기능 종속성에 관한 전체 선언이 포함되어 있기 때문입니다. 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는 개발자와 사용자 모두에게 유연한 제공 메커니즘을 제공합니다.

추가 리소스

Android App Bundle에 관한 자세한 내용은 다음 자료를 참조하세요.

샘플

  • PlayCore API 샘플: PlayCore API를 사용하여 기능 모듈을 요청하고 다운로드하는 방법을 보여줍니다.
  • 동적 코드 로드 샘플: 설치된 기능 모듈에서 안전하게 코드에 액세스하는 세 가지 접근 방식을 보여줍니다.

Codelab

  • 첫 번째 Android App Bundle: Android App Bundle의 기본 원리를 살펴보고 Android 스튜디오를 사용하여 자신만의 고유한 App Bundle 구성을 빠르게 시작하는 방법을 보여주는 Codelab입니다. 이 Codelab에서는 bundletool을 사용해 App Bundle을 테스트하는 방법도 알아봅니다.
  • 주문형 모듈: 주문형 기능 모듈을 다운로드하여 설치하는 앱을 만드는 데 도움을 줍니다.

블로그 게시물

동영상