안드로이드

Play Feature Delivery - 앱 크기 최적화의 열쇠

ddayunee 2025. 5. 24. 11:05
반응형

안녕하세요! 앱 개발하면서 앱 크기 때문에 고민한 적 있으신가요? 🤔 기능은 계속 추가되는데 앱 용량이 자꾸 늘어나면 사용자들도 부담스러워하고, 설치까지 가는 길에 포기하기도 하죠. Google Play에서는 이런 우리들의 고민을 해결해주려고 멋진 도구들을 만들어줬어요! 바로 Android App Bundle 기반의 Play Feature Delivery랍니다.
Play Feature Delivery는 뭐냐면요, 쉽게 말해 우리 앱의 기능들을 '기능 모듈'이라는 작은 조각으로 나눠서, 사용자 폰에 딱 필요한 것만 골라서 다운받게 해주는 거예요. 덕분에 처음 앱을 깔 때 다운로드 용량을 엄청나게 줄일 수 있죠!
이 '기능 모듈'은 앱의 기본 모듈이랑 비슷하게 생겼지만, 꼭 기본 모듈에 붙어 다녀야 해요. 사인 설정이나 코드 축소(minifyEnabled), 버전 정보 같은 건 기본 모듈 거를 가져다 쓰고요. Android 스튜디오에서 새 기능 모듈 만드는 거, 생각보다 정말 쉬우니 한번 도전해보세요!

기능 모듈, 필요할 때 필요한 만큼만! 다양한 제공 옵션 살펴보기
Play Feature Delivery의 진짜 매력은 기능 모듈을 사용자에게 전달하는 방법을 우리 마음대로 정할 수 있다는 거예요! 특히 Android 5.0 (API 수준 21) 이상 기기에서는 이 유연한 기능들을 제대로 활용할 수 있답니다.
어떤 옵션들이 있는지 알아볼까요?
•설치 시 제공 (Install-time delivery): 이건 특별한 설정을 안 하면 기본적으로 앱 깔 때 같이 다운로드되는 모듈이에요. 근데 신기한 건, 나중에 이 모듈이 필요 없어지면 폰에서 지워달라고 요청해서 앱 용량을 줄일 수도 있다는 점이에요!
•조건부 제공 (Conditional delivery): 이건 사용자 폰의 특징(하드웨어, 언어, 안드로이드 버전 등)을 봐서 조건을 만족할 때만 설치 시에 다운로드되게 하는 거예요. 특정 지역에서만 필요한 기능 같은 거에 쓰면 좋겠죠?
•주문형 제공 (On-demand delivery): 이게 바로 오늘 우리가 집중할 내용인데요! 앱을 사용하다가 필요할 때 앱이 직접 요청해서 다운로드하고 설치하는 방식이에요. 모든 사용자가 매번 쓰지 않는 기능(예: 채팅 앱의 사진 전송 기능) 같은 거에 딱 맞아요. 이걸 쓰면 앱 초기 다운로드 크기를 최소화할 수 있답니다.
•인스턴트 제공 (Instant delivery): 앱 설치 없이도 특정 기능을 바로 맛보기처럼 써볼 수 있게 해줘요. Play 스토어의 '사용해 보기' 버튼이나 우리가 만든 URL을 통해 사용자가 앱을 미리 경험해보게 할 수 있어서 앱 참여도를 높이는 데 정말 유용해요.


주문형 제공, 직접 한번 구성해볼까요?
1. 모듈 설정하기: Android 스튜디오에서 새 기능 모듈을 만들 때 'Module Download Options'에 **'Do not include module at install-time'**이라는 옵션이 있어요.8 이걸 선택하면 이 모듈은 주문형 제공으로 딱 설정된답니다!8 이렇게 하면 모듈 매니페스트에 <dist:on-demand/>라는 속성이 자동으로 추가돼요.8

2. 모듈 다운로드 요청하기: 주문형으로 설정된 모듈을 다운받으려면 Play Feature Delivery 라이브러리에 있는 SplitInstallManager를 써야 해요. 앱이 켜져 있을 때 splitInstallManager.startInstall(request) 메서드를 호출하면 돼요. 이때 어떤 모듈을 받고 싶은지 모듈 이름(split 이름)을 정확히 알려줘야겠죠?10 여러 모듈을 한 번에 요청할 수도 있어요.

◦잠깐! 이미 설치된 모듈을 또 요청해도 괜찮아요. API가 알아서 감지하고 바로 완료 처리해준답니다.

3. 다운로드 과정 지켜보기: 모듈 다운로드는 바로 되는 게 아니라 시간이 좀 걸릴 수 있어요. 다운로드가 얼마나 됐는지, 아니면 중간에 문제가 생기지는 않았는지 확인하려면 SplitInstallStateUpdatedListener를 꼭 등록해서 상태 변화를 계속 받아봐야 해요.

◦상태 업데이트를 받으면 PENDING(요청 대기 중) DOWNLOADING(다운로드 중), INSTALLED(설치 완료) 같은 상태를 알 수 있어요. 다운로드 진행 상황을 사용자에게 보여주거나, 설치 끝나면 그다음 단계로 자연스럽게 넘어가게 만들 수 있죠.
◦사용자 확인: 가끔 다운받기 전에 사용자한테 "이 기능 다운받을까요?" 하고 물어봐야 할 때가 있어요 (REQUIRES_USER_CONFIRMATION 상태)... 그럴 때는 splitInstallManager.startConfirmationDialogForResult()를 호출해서 확인 창을 보여주면 돼요..

4.오류 처리: 다운로드나 설치하다가 실패할 수도 있잖아요? 😢 기기 저장 공간이 부족하거나 (INSUFFICIENT_STORAGE), 네트워크가 끊기거나 (NETWORK_ERROR), 아니면 사용자가 Play 스토어에 로그인이 안 되어 있을 수도 있고요. 이럴 때는 SplitInstallException으로 어떤 문제가 생겼는지 알 수 있어요. 오류 코드(errorCode)를 보고 사용자한테 "인터넷 연결을 확인해 보세요" 라든가, "폰 용량이 부족해요" 같은 안내를 해주거나 다시 시도할 기회를 줄 수 있겠죠.
5.나중에 설치하기: 지금 당장 필요한 게 아니라 앱이 백그라운드에 있을 때 몰래(?) 다운받아도 괜찮은 모듈이라면 deferredInstall() 메서드를 쓸 수 있어요.다만 이건 결과가 보장되지 않고 진행 상황도 알 수 없으니, 나중에 모듈을 쓸 때는 꼭 설치되어 있는지 먼저 확인해야 해요.

설치된 모듈, 어떻게 사용하나요? SplitCompat 활용법!
모듈 다운로드랑 설치가 다 끝나면 그 안에 있는 코드나 리소스를 사용해야겠죠? 그러려면 우리 앱에 SplitCompat 라이브러리를 꼭 켜줘야 해요.
SplitCompat은 Application 클래스에서 SplitCompatApplication을 상속받거나, 아니면 attachBaseContext() 메서드 안에 SplitCompat.install(this)를 호출해서 설정할 수 있어요.

기능 모듈 안에 있는 각 활동(Activity)에서도 attachBaseContext()에서 SplitCompat.installActivity(this)를 불러줘야 하고요.

SplitCompat을 잘 설정해두면, 다운로드된 기능 모듈의 코드와 리소스를 마치 처음부터 앱에 들어있던 것처럼 편하게 쓸 수 있답니다.
⚠️ 몇 가지 주의할 점:
- 기능 모듈에 있는 액티비티나 서비스에 android:exported="true"라고 설정하면 안 돼요! 모듈이 설치 안 된 상태에서 다른 앱이 이걸 호출하면 앱이 갑자기 꺼질 수 있거든요.

- 다른 모듈에서 기능 모듈 안의 코드를 바로 가져다 쓸 순 없어요. 리플렉션이나, 아니면 기본 모듈에 인터페이스를 만들고 기능 모듈에서 그걸 구현하는 식으로 사용해야 한답니다.

- 네이티브 코드(C/C++)를 쓸 때는 ReLinker 사용을 추천해요.

- Android 8.0 이상에서 인스턴트 앱에 모듈 설치했다면, 설치 완료 후에 SplitInstallHelper.updateAppInfo()를 꼭 호출해서 앱 정보를 업데이트해줘야 해요.
설치된 모듈, 관리도 쉽게!
현재 기기에 어떤 기능 모듈들이 설치되어 있는지 확인하고 싶다면 splitInstallManager.getInstalledModules()를 호출해보세요. 설치된 모듈 이름 목록을 알려준답니다.
더 이상 필요 없는 모듈은 splitInstallManager.deferredUninstall(moduleNames)를 호출해서 지워달라고 요청할 수도 있어요.이건 바로 지워지는 건 아니고, 폰이 알아서 백그라운드에서 저장 공간을 확보하기 위해 처리해줘요.
추가 언어 리소스도 필요할 때만 다운받아요!
Play Feature Delivery는 앱 용량을 줄이기 위해 사용자 폰 설정에 맞는 언어 리소스만 처음에 다운로드해요. 만약 우리 앱에 인앱 언어 선택 기능이 있어서 다른 언어 리소스도 필요하다면, 기능 모듈처럼 주문형으로 다운받을 수 있어요. SplitInstallRequest.newBuilder().addLanguage(locale) 메서드를 쓰면 된답니다.
다운받은 언어 리소스를 앱에 적용하려면 해당 활동의 attachBaseContext()에서 SplitCompat.installActivity()를 호출하고, 설정(Configuration)도 업데이트한 다음 활동을 다시 만들어줘야 해요. 설치된 언어 리소스도 deferredLanguageUninstall()로 지울 수 있고요.
테스트는 어떻게 하죠? 로컬에서 해보세요!
Play 스토어에 올리지 않고도 개발 중에 기능 모듈 설치나 액세스 같은 걸 테스트해보고 싶다면 bundletool과 --local-testing 플래그를 쓰면 돼요. FakeSplitInstallManagerFactory를 사용하면 네트워크 오류 같은 설치 실패 상황도 일부러 만들어 테스트해볼 수 있답니다.
마지막으로, 데이터 보안!
Play Feature Delivery를 포함한 Play Core 라이브러리를 쓸 때는 Google Play 스토어가 데이터를 처리해요. 기기 정보나 앱 버전 같은 걸 모아서 올바른 모듈을 제공하고 업데이트 후에도 잘 유지하는 데 사용되죠. 이 데이터는 암호화되고 다른 곳에 공유되지 않으며 일정 기간 뒤에 삭제된다고 해요. 하지만 우리 앱에서 사용자 데이터를 어떻게 모으고 공유하고 지킬지는 개발자인 우리가 직접 Google Play의 데이터 보안 양식에 정확하게 써야 하는 책임이 있다는 걸 꼭 기억해주세요!
Play Feature Delivery를 잘 활용해서 사용자들에게 더 가볍고 빠른, 스마트한 앱 경험을 선물해봐요! 😊

 

https://developer.android.com/guide/playcore/feature-delivery?hl=ko

https://developer.android.com/guide/playcore/feature-delivery/on-demand?hl=ko

 

Play Feature Delivery 개요  |  Google Play  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Play Feature Delivery 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Google Play의 앱 제공 모델은 Android

developer.android.com

 

반응형