APK파일 크기를 왜 줄여야 할까?
APK파일 크기를 줄이는게 왜 필요할까?
한국 사용자들은 대부분 네트워크 환경이 좋고, 최신 플래그십은 256GB, 심지어 보급형 기기도 128GB 고용량의 스마트폰을 사용한다. 하지만 모두가 이런 환경을 가지고 있을까? 전 세계적으로는 그렇지 않은 경우가 많다는걸 이번 프로젝트를 통해 알게 되었다.
회사는 글로벌 시장을 대상으로 하고 있으며, 특히 인도와 아랍 국가들을 타겟 Meta광고를 하고 있다. 이로 인해 앱 다운로드 수는 증가했지만, 설치 후 바로 삭제되는 현상이 발생하고 있다. 또한 Sentry에서 가장 많이 관측되는 에러는 Network에러 였다. 이는 사용자들이 용량이 큰 앱을 피하는 경향이 있으며, 네트워크 환경이 열악한 경우가 많기 때문으로 보인다.
따라서 앱의 용량이 설치 결정에 큰 영향을 미친다는 것을 알 수 있다. 특히 3D 렌더링에 사용되는 Babylon.js와 같은 무거운 자원은 이러한 문제를 더 악화시킬 수 있다.
위의 상황을 고려할 때, 다음과 같은 조치를 취할 필요가 있다:
앱 용량 최적화: Babylon.js와 같은 3D 렌더링 라이브러리 및 3D 파일들의 용량을 최적화하여 앱의 전체 용량을 줄인다. 이를 통해 사용자가 앱을 다운로드하는 것을 꺼리지 않도록 한다.
런타임 로딩: 앱을 처음 시작할 때 필요하지 않은 3D 자원은 런타임에 다운로드하도록 하여 초기 다운로드 용량을 최소화한다. 필요한 경우에만 자원을 다운로드하여 네트워크 환경에 민감한 사용자에게도 부담을 줄인다.
최적화된 콘텐츠 제공: 사용자가 주로 사용하는 기능 및 콘텐츠에 집중하여 해당 부분을 최적화하여 제공한다. 불필요한 자원을 포함하지 않고, 사용자가 실제 필요로 하는 콘텐츠에 집중하여 제공함으로써 사용자 경험을 향상시킨다.
이러한 조치를 통해 앱의 용량을 최적화하고, 네트워크 환경에 민감한 사용자에게도 원활한 서비스를 제공할 수 있게해야 한다.
이하에서는 React native 를 사용하여 앱을 만들때 APK 파일 크기를 줄이는 방법에 초점을 두고 이야기해보고자 한다.
APK 파일 사이즈 줄이는 방안
사용하지 않는 리소스 삭제
리소스 축소(shrinkResources) 사용 Android Studio로 작업할 때 minifyEnabled라는 속성을 볼 수 있다. 보통 false로 설정되어 있고 소스코드를 난독화해서 보안을 강화하고 싶거나 앱의 크기를 줄이고 싶을 때 true로 변경한다. 이때 shrinkResources라는 속성도 추가해서 true로 설정하면 minify 작업 후 사용하지 않는 리소스를 삭제한다.
ProGuard를 사용한 코드 난독화와 최적화. 사용되지 않는 코드를 제거하고 클래스 및 메서드 이름을 난독화하여 APK 파일의 크기를 줄일 수 있다.
APK파일 사이즈를 줄이는것이 AAB파일 사이즈에도 영향을 줄까??
APK 파일 크기를 줄이는 것은 AAB 파일의 최종 크기에도 영향을 미칠 수 있다. 하지만, AAB 파일의 최종 크기는 Google Play Store의 압축 및 최적화 알고리즘에 따라 달라질 수 있다.
APK파일 난독화와 압축
Android 소스 난독화 “앱의 소스 코드를 난독화하는 기술” 안드로이드 앱 소스 난독화는 안드로이드 앱의 소스 코드를 분석하기 어렵게 만들기 위한 기술. 이를 통해 앱의 소스 코드를 더욱 안전하게 보호가능.
소스 코드 난독화를 사용하면 디컴파일러가 코드를 해석하기 어려워지므로, 해커가 앱의 코드를 이해하고 악성 기능을 추가하는 것을 어렵게 만들 수 있다.
이미 서비스하고 있는 앱과 완전히 똑같은 앱이 Google Play Store에 배포될 수 있을까?
누구나 따라 만들 수 있다.
Play Store에 배포된 Android 앱의 경우, 누구나 자유롭게 해당 앱을 다운로드 받아 APK를 추출하는 건 누구나 가능하다. 개발자가 아닌 일반 사용자도 구글링만 해도 충분히 할 수 있다.
여기서 추출된 APK를 디컴파일(Decompile)하여 소스 코드를 보는 것도 dex2jar, JD-GUI 등 라이브러리를 통해 진행할 수 있다.
즉, 만약 소스 코드가 난독화 되어있지 않을 경우, 악의를 가진 사용자가 해당 앱을 다운로드 받아 APK를 추출하고 디컴파일하여 해당 소스 코드를 그대로 가져와서 앱을 출시할 수 있다는 의미이다.
이 글에서 APK만 언급하는 이유
구글 플레이스토어와 애플 스토어 앱 업로드 방식 간에는 몇 가지 차이가 있다.
구글 플레이스토어: AAB 파일 업로드
- AAB 파일: AAB(Android App Bundle) 파일은 Google Play 스토어에서 사용되는 Android 애플리케이션의 압축된 파일 형식이다. 이 파일에는 앱의 모든 리소스와 코드가 포함되어 있다.
- 동작
- 개발자는 Android Studio 또는 Gradle을 사용하여 AAB 파일을 빌드.
- AAB 파일을 Google Play 스토어에 업로드하면 Google은 앱 번들을 다운로드하고, 앱에 필요한 리소스를 선택적으로 다운로드하고 압축하여 사용자의 기기에 최적화된 APK를 동적으로 생성.
- 이렇게 하면 각 사용자에게 최적화된 APK 파일이 제공되어 다운로드 크기가 최소화되고 디바이스의 용량이 절약됨.
** 애플 스토어: IPA파일 업로드**
- IPA 파일:IPA 파일은 iOS 애플리케이션의 패키지 파일. 이 파일에는 앱의 모든 코드, 리소스 및 설정이 포함되어 있다.
- 동작
- 개발자는 Xcode를 사용하여 iOS 애플리케이션을 빌드
- Archive를 생성한 다음 이를 앱 스토어 Connect에 IPA 파일을 업로드
- Apple은 업로드된 앱을 검토하고 승인한 후 앱 스토어에서 사용자에게 배포.
따라서 AAB 파일은 Google Play 스토어에서 사용되며 APK를 최적화하는 데 사용되는 반면, IPA 파일은 애플 스토어에서 사용되며 iOS 애플리케이션을 패키징하고 배포하는 데 사용된다.
Xcode는 자동으로 해주던데?
IPA 파일의 경우, 동적 임포트, 코드 난독화 및 압축 등의 작업은 개발자가 Xcode를 사용하여 iOS 애플리케이션을 빌드할 때 자동으로 처리된다. 여러 가지 최적화 및 보안 기능이 Xcode 내부에서 자동으로 실행되며, 이는 개발자가 따로 설정할 필요가 없다.
- 동적 임포트: iOS 애플리케이션의 모든 리소스 및 코드는 Xcode 빌드 과정에서 자동으로 번들링되고 포함된다. 동적 임포트는 애플리케이션의 실행 중에 필요한 리소스 및 모듈을 필요할 때 로드하는 방식을 지원.
- 코드 난독화: Xcode는 코드 난독화 기능을 내장하고 있어, 애플리케이션의 코드를 난독화하여 외부에서 해석하기 어렵게 만든다. 이를 통해 앱의 보안을 강화하고 코드의 안전성을 높인다.
- 압축: IPA 파일은 Xcode 빌드 과정에서 자동으로 압축되어 생성됩니다. 이러한 압축은 애플리케이션의 크기를 최소화하고 다운로드 및 설치 시간을 단축합니다.
따라서 동적 임포트, 코드 난독화 및 압축과 같은 작업은 개발자가 Xcode를 사용하여 iOS 애플리케이션을 빌드할 때 자동으로 처리되며, 개발자가 따로 설정할 필요가 없다.
더 나은 방법은 없을까?
꼭 Native App을 고집해야 할까?
- 프로그레시브 웹 앱 (PWA): PWA를 사용하여 사용자가 앱을 다운로드하지 않고도 웹 브라우저에서 앱을 실행할 수 있다. 이를 통해 앱을 설치하는 과정을 생략할 수 있으며, 네트워크 환경에 상관없이 앱을 사용할 수 있다. 이는 앱을 다운로드하는 도중 이탈하는 사용자들을 막을 수 있다고 본다.
꼭 App을 사용해야 한다면?
- 네이티브 앱에서 WebView 사용 :네이티브 앱에서 WebView 사용으로 네이티브 앱에 비해 상대적으로 가벼운 용량을 유지할 수 있다. 네이티브 앱과 달리 앱의 대부분의 콘텐츠를 웹 서버에서 동적으로 제공하기 때문이다. 다만, 네이티브 앱에 비해 성능이나 앱 스토어의 가시성 등에서는 제약이 있을 수 있다. 또한, 일부 고급 기능이나 하드웨어 접근에 제한이 있을 수 있다는건 안비밀:)
참고자료
- https://developer.android.com/topic/performance/reduce-apk-size
- https://choboit.tistory.com/35
- https://brunch.co.kr/@oemilk/64
- https://adjh54.tistory.com/252
- https://blog.imqa.io/android-obfuscation/
- https://brunch.co.kr/@oemilk/64
- https://workspace-dev.medium.com/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EC%82%AC%EC%9D%B4%EC%A6%88-50-%EA%B0%90%EC%86%8C%EB%A5%BC-%EC%9D%B4%EB%A4%84%EB%82%B8-%EC%9D%B4%EC%95%BC%EA%B8%B0-6ebf845800da
- https://medium.com/@kimtaesoo188/reducing-an-android-apks-size-by-99-99-e5bd241ad005