Android App Bundle 소개


app bundle
app bundle


APK가 커지는 이유

안드로이드 App Bundle 은 새로운 업로드 방법으로 앱 크기를 줄일 수 있습니다.
기존에는 Play Console 에 APK 를 업로드하여 배포를 진행했지만, 새로운 배포 방법은 사인 된 App Bundle을 Play Console 로 배포를 하면 사용자의 기기에 맞는 언어, 리소스, CPU 아키텍처에 맞는 부분만 빌드하여 APK를 생성하기 때문에 사용자가 다운로드 받는 APK 용량을 줄일 수 있습니다.

APK 가 커지는 이유에는 몇 가지 요소가 있습니다.

1. 멀티 CPU 아키텍처를 지원하기 위해 여러 가지 네이티브 라이브러리를 추가하는 경우
2. 멀티 스크린(dpi)를 지원하기 위한 이미지와 같은 리소스들이 증가
3. 다국어를 지원하는 앱인 경우 String 파일 증가
4. 자주 사용되지 않는 기능들의 증가


Korea I/O RECAP 2018 -Tian Lim 발표 현장
Korea I/O RECAP 2018 -Tian Lim 발표 현장

App Bundle 이란?

App Bundle 이란 APK 와 비슷하지만 모든 코드, 리소스, CPU 아키텍처와 메타데이터를 압축한 zip 파일입니다.
그래서 Google Play는 App Bundle에서 사용자 기기에 필요한 코드와 리소스만을 선택해 빌드될수 있는 것입니다.
App Bundle 을 빌드하면 .aab 파일이 생성됩니다.
빌드된 aab 파일을 Play Store 에 업로드하면 Play Store 가 각각 기기에 최적화된 APK를 빌드합니다.

Dynamic Delivery 란 사용자 기기에 필요한 리소스만을 다운로드를 가능하게 해주는 구글의 워크플로우입니다.
Dynamic Delivery는 Android 5.0(SDK 21) 이상부터 사용할 수 있는 있으며, Split APK 메커니즘을 이용한다고 합니다.
즉, 분리된 APK를 하나의 앱으로 만들어주는 것으로 여러 가지 기능을 분리하고 나중에 기능이 필요로 할 때 다운로드 받아 설치됩니다.
따라서 Dynamic Delivery로 Google Play는 각 기기의 맞는 리소스만 빌드를하고 기기에 설치되도록 한 다음에 사용자가 특정 기능을 필요로 할 때 부분적으로 다운받아서 사용할 수 있게 해주기 때문에 앱 용량을 줄일 수 있습니다.
  • Base APK는 모든 APK 가 접근할 수 있는 코드와 리소스가 포함돼있는 APK 입니다. 앱의 기본 기능을 제공하고 사용자가 앱 다운로드를 요청하면 가장 처음 다운로드 받는 APK 입니다. 
  • Configuration APK는 기기에 설치될 때 각 기기에 최적화된 화면 밀도(dpi) 나 CPU 아키텍처(arm, x86 ...), 다국어, 리소스와 네이티브 라이브러리가 포함된 APK 입니다. Configuration APK 는 Google Play에서 자동으로 생성해 줍니다.
  • Dynamic feature APK는 사용자가 기기에 처음 설치할 때 필요하지 않지만, 나중에 추가로 설치할 수 있는 코드와 리소스가 들어있는 APK 입니다.
기본적으로 Google Play 는 Base APK 와 Configuration APK 를 설치합니다.
예를 들어, 다국어와 다양한 화면 사이즈(dpi)를 대응하는 앱 인경우 APK를 빌드하고 사인 후 Play Console에 배포했습니다.
하지만, 이제는 App Bundle을 Google Play에 업로드하면 Google Play는 App Bundle의 메타데이터와 리소스에서 영어(en), xxhdpi, arm 리소스만 빌드하여 base+en+xxhdpi+arm 으로 조합된 APK 를 만듭니다.
그래서 사용자는 더 작고 최적화된 설치 파일을 다운로드 받을수 있습니다.

왼쪽: 이전에는 APK 에 모든 리소스를 빌드
오른쪽: App Bundle 로 필요한 것만 제공하는 Dynamic Delivery
(구글 개발자 블로그 참고)

base module 은 기본적으로 생성되는 애플리케이션 모듈입니다. 보통 새 프로젝트를 생성하면 /rootProject/app이라고 생성되는 모듈이 base module입니다.
base module에 존재하는 모든 코드와 리소스가 앱의 base APK 에 포함됩니다.
base module에는 manifest 파일이 존재하며 앱의 시작점이기 때문에 "android.intent.category.LAUNCHER"와 "android.intent.action.MAIN" 을 선언해야 합니다. 그리고 versionCode를 지정하여 모든 APK의 버전을 관리합니다.
아래와 같이 base module에서 전체 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는 base module의 versionCode를 사용하여 App Bundle에서 생성한 모든 APK에 동일한 버전 코드를 할당합니다. 즉, versionCode 를 올린 후 새롭게 App Bundle을 빌드하고 배포하면 사용자의 기기에 설치된 모든 APK가 업데이트됩니다.

App Bundle 을 적용한 다른 유명 앱들도 용량을 크게 줄일 수 있었습니다.
예를 들어 링크드인, 트위치가 있으며 평균적으로 20% 감량됬다고 합니다.

App Bundle 을 적용한 앱들
Korea I/O RECAP 2018 -Tian Lim 발표 현장
- App Bundle 을 적용한 앱들

bundletool 을 사용하여 앱 번들을 로컬 테스트를 할 수 있습니다.
App Bundle을 만든 후에 로컬에서 bundletool 명령어로 특정 기기로 배포되는 APK를 생성할 수 있습니다.
로컬에서 테스트한 후에는 구글 플레이를 통해 테스트 해야 됩니다.
내부 테스트 트랙을 사용하여 Play Console 에 업로드하여 테스트를 진행합니다.

만약에 사용자가 언어를 바꾼 경우 Play Store에서 이를 감지해 추가 언어팩을 설치합니다.
인터넷이 안되는 경우 추후에 다운로드 됩니다.

Dynamic feature module 이란?

Dynamic feature module 는 앱 용량을 줄일 수 있는 방법을 중 하나입니다.
꼭 필요한 부분만 설치하고 사용자가 원할 때 동적으로 설치 가능한 방법입니다.
예를 들어 앱에 유튜브 업로드 기능이 포함되어져있는데 이 기능은 일부 사용자에게만 사용되고 주요 기능이 아닌경우, 앱에서 유튜브 업로드 기능을 분리할 수 있습니다.
분리된 기능은 사용자가 앱을 설치 후 유튜브로 업로드할때 설치되기 때문에 불필요한 기능을 제거하여 용량을 줄일수 있습니다.
그러나 Dynamic feature module 을 만들기 위해서는 기존 코드에서 특정 기능을 분리하는 작업이 필요하기 때문에 어떤 것을 모듈로 떼어낼지 고려해야 합니다.

모듈화 대상

- 사용자에게 중요하지 않은 기능
- 중요하지 않은 기능이 앱 용량을 차지하는 비율이 높을 경우
- 이 기능을 사용할 수 있을 때까지 사용자가 몇 초간 기다릴 수 있는 경우

호환성

Dynamic feature는 Android 5.0 (SDK 21 이상)에서 사용할 수있습니다.
Android 4.4 (SDK 20 이하)의 기기는 단일 APK 를 제공하지만, 불필요한 코드 및 리소스(화면밀도, CPU) 만 기기에 최적화되고 언어 리소스는 모두 포함됩니다.


댓글

댓글 쓰기

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

코틀린 (Kotlin) object 키워드와 동반 객체 정리