본문 바로가기

안드로이드

APK -> App Bundle 적용기

개요

우리팀에서는 앱을 apk로 제공해왔지만, 구글의 정책에 따라 AppBundle로 변경하게 되었다.

다소 늦은 감이 있지만 그래도 구글 정책에 의해 플레이스토어에서 삭제되는 것은 막았다..

사실 그전부터 AppBundle 방식으로 변경해야 한다는 생각은 모두가 갖고 있었지만 다들 업무 과부하로 인해 신경을 못쓰고 있었다.

 

그래서 날을 잡고 AppBundle 방식으로 변경했던 이야기를 조금 해보고자 한다.

AppBundle이란?

App Bundle은 여러 개의 분할된 apk가 각 기기에 따라 혹은 필요에 따라 구성되어 하나의 앱으로 동작을 한다고 보면 된다.

App Bundle 이점

APK: 74MB → App Bundle: 68MB = 약 13% 감소 (기기 내 설치된 앱 기준)

리소스 분할로 인한 앱 크기 감소

App Bundle은 난독화 및 최적화된 앱의 모든 요소를 추출하여 사용자에게 제공하는 APK 방식과는 다르게 사용자의 장치 구성(화면 크기, 언어, DPI 등)에 따라 필요한 리소스만을 포함하는 여러 APK를 생성한다.

예를 들면 특정 언어나 화면 해상도에 필요한 리소스만을 포함한 APK를 만들고 필요하지 않은 리소스가 사용자의 장치에 설치되지 않도록 앱 크기를 줄인다.

 

ABI 분할로 인한 앱 크기 감소

리소스 뿐만 아니라 네이티브 라이브러리도 마찬가지이다. 네이티브 라이브러리들은 특정 CPU 아키텍처(ex: ARM, x86)에 최적화되어 있는데, APK 방식에서는 여러 아키텍처를 모두 지원하기 위해 모든 버전의 네이티브 라이브러리를 포함해야 했는데, 이는 앱 크기를 크게 늘리는 원인 중 하나였다.

 

AppBundle은 사용자의 장치에 맞는 CPU 아키텍처에 대해서만 네이티브 라이브러리를 포함한 APK를 생성하기 때문에 불필요한 라이브러리가 설치되지 않아 앱 크기를 줄일 수 있다.

App Bundle 적용 과정

Splits → Bundle

  • App Bundle에서는 splits블록이 사용되지 않고 bundle블록이 사용된다.
  • bundle블록에서는 language, density, abi로 나뉘는데 앱의 형태에 따라 알맞게 커스텀해줘야 한다.
  • 우리 앱에서는 language, density는 false로 설정한다.
    • 다국어 지원을 하지 않으므로 language는 enableSplit = false
    • 이미지 리소스를 해상도별로 관리하지 않고, 피그마에서 3배수의 이미지를 받아와서 xxhdpi로 적용하고 있기 때문에 density는 enableSplit = false
      • 3배수 이미지를 사용하는 이유는 해상도 별로 관리를 해도 기기별로 완벽하게 대응이 되지 않고, 그에 비해 리소스들 크기가 늘어나기 때문에 비효율적이라 판단
splits{
    abi {
        enable true
        universalApk true
        reset()
        include "x86", "x86_64", "arm64-v8a", "armeabi-v7a"
    }
}
    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = false
        }
        abi {
            enableSplit = true
        }
    }

구글 앱 서명

기존에는 APK 형식으로 배포를 했기 때문에 구글 플레이 콘솔에 앱 서명을 업로드 하지 않고 있었다.

  • AppBundle로 배포하기 위해서는 구글 플레이 콘솔에 앱 서명을 업로드 해야한다.
  • AndroidStudio → Generate Signed Bundle or APK → Android App Bundle → Key store 및 Key alias 적용 → Export encrypted key for enrolling published apps in Google Play App Signing 체크
  • 위 과정으로 추출된 private.pepk를 관리자 계정으로 앱 서명 업로드

카카오 로그인 등 SNS

  • 우리 앱은 카카오, 페이스북 로그인을 사용중이므로 기존에 등록했던 키 해시 이외에 구글 콘솔 내에 있는 앱 서명 인증서로 키 해시를 추출하여 재등록해야한다.
  • Firebase Distribution에 업로드 한 AppBundle을 테스트 시에는 반드시 Firebase Distribution에서 추출한 키 해시를 추가로 등록해야 한다.

Version Code

  • App Bundle로 이전하게 되면 하나의 Version Code로 관리해도 된다.
    • Google Play에서 각 ABI 별로 알아서 관리해주기 때문
  • 주의해야할 점은 기존에 APK 방식으로 업로드 하였던 앱이라면 split 된 버전들 중 제일 높은 버전으로 업로드를 해야한다.
    • 그렇지 않다면… 대참사가 일어난다.
      - 기존 APK가 ABI 별로 split 되면서 arm 64: 115098, 그 외 ABI: 30115098 으로 배포가 되었었는데, 이를 간과하고 APP Bundle 도입 후 115099 로 배포하는 바람에
      - 소수의 일부 사용자(arm 64)들에게만 업데이트 버전이 제공 되어졌었다,, 그래서 version Code를 30200000 변경하여 Hotfix 배포를 통해 해결하였다.
      APK 배포 시 ABI 별로 Version Code가 달랐던 이유: Google Play에 동일한 버전의 앱을 추가하는 것을 허용하지 않기 때문에 구글 플레이 콘솔에서 apk 파일을 업로드할 때는 서로 다른 APK에 서로 다른 버전 코드가 있어야한다.
    • 또한, 리소스 파일들을 ABI에 맞게 split하기 위함이다.

배포 방식

  • 기존 APK 방식과 다른 점은 딱히 없으며, Gradle 내에 bundleRelease로 추출한 AAB 파일을 콘솔에 업로드하면 된다.
반응형