6월 3일의 ⁠#Android11: 베타 버전 출시 행사에 참여하세요.

Android App Bundle 정보

Android App Bundle은 모든 앱의 컴파일된 코드와 리소스를 포함하지만 APK 생성 및 Google Play 서명을 보류하는 새로운 업로드 포맷입니다.

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

또한 앱 프로젝트에 동적 기능 모듈을 추가하여 App Bundle에 포함할 수 있습니다. 모듈의 일부 기능과 애셋은 사용자가 처음 앱을 다운로드하고 설치할 때 포함되지 않도록 할 수 있습니다. 나중에 앱에서 Play Core 라이브러리를 사용하여 이러한 모듈을 동적 기능 APK로 다운로드하도록 요청할 수 있습니다. Google Play는 Dynamic Delivery를 통해 그 모듈의 코드와 리소스만 기기에 제공합니다.

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

또한 Android App Bundle로 게시하면 APK 확장 파일을 사용하지 않고도 앱 크기 제한이 150MB로 늘어납니다. 이 제한은 게시 크기가 아닌 실제 다운로드 크기에만 적용되니 유의하세요. 따라서 사용자는 최대 150MB의 앱을 다운로드할 수 있고 Dynamic Delivery를 사용할 경우 앱의 전체 저장용량이 앱을 실행하는 데 필요한 코드와 리소스에만 사용됩니다. 이 기능과 함께 압축되지 않은 네이티브 라이브러리 지원 기능을 이용하면 게임과 같은 크기가 큰 앱의 디스크 사용량을 줄이고 사용자 유지율을 높일 수 있습니다.

Android 스튜디오 3.2 이상을 사용하는 경우 대부분의 앱 프로젝트에서는 Dynamic Delivery를 지원하는 데 많은 작업을 할 필요가 없으며 몇 번의 클릭만으로 Android App Bundle을 빌드할 수 있습니다. 하지만 동적 기능 모듈을 추가하려면 좀 더 작업이 필요하고 앱을 리팩터링해야 할 수도 있습니다.

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

시작하기

App Bundle을 빌드하고 Dynamic Delivery를 지원하려면 다음 단계를 따르세요.

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

  2. 기본 모듈을 포함하고 구성 APK용 코드와 리소스를 체계화하고 동적 기능 모듈을 추가(선택사항)하여 Dynamic Delivery 지원을 추가합니다.

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

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

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

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

Android App Bundle 포맷

Android App Bundle은 Google Play에 업로드하여 Dynamic Delivery를 지원하는 파일(파일 확장자는 .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 디렉터리에 포함되어 있습니다. 그러나 각 동적 기능 모듈의 디렉터리 이름은 모듈의 manifest에 있는 split 속성으로 지정됩니다. 자세히 알아보려면 동적 기능 모듈 manifest를 참조하세요.
  • 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()를 사용하여 앱이 로드하는 자바 기반 리소스가 포함될 수 있습니다. 이러한 파일은 Google Play에서 생성하는, 앱의 기본 APK 및 모든 멀티 APK의 루트 디렉터리로 나중에 재배치됩니다. 이 디렉터리 내의 경로도 보존됩니다. 즉, 디렉터리와 하위 디렉터리도 APK의 루트로 재배치됩니다.

Android App Bundle 빌드 및 배포

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

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

App Bundle 테스트

Android App Bundle을 빌드했으면 Google Play가 APK를 생성할 때 어떻게 App Bundle을 사용하는지와 APK가 기기에 배포될 때 어떻게 작동하는지 테스트해야 합니다.

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

  • bundletool로 Android App Bundle을 로컬로 테스트하여 App Bundle에서 APK를 생성하고 연결된 기기에 배포합니다.
  • 앱을 URL로 공유합니다. 이는 App Bundle을 업로드한 다음 신뢰할 수 있는 테스터와 Google Play 스토어 링크 형태로 앱을 공유하는 가장 빠른 방법입니다. 또한 주문형 기능 다운로드와 같은 맞춤 전송 옵션을 테스트하는 가장 빠른 방법이기도 합니다.
  • 공개, 비공개 또는 내부 테스트를 설정합니다. 이는 주문형 기능 다운로드와 같은 맞춤 전송 옵션을 테스트하는 또 다른 방법입니다.

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을 업로드할 때 앱 또는 주문형 기능의 다운로드 크기가 150MB를 초과할 가능성이 Play Console에서 발견되면 오류가 발생합니다.

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

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

알려진 문제

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

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

참고 자료

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

샘플

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

Codelabs

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

블로그 게시물

동영상