한국 사용자들은 대부분 네트워크 환경이 좋고, 최신 플래그십은 256GB, 심지어 보급형 기기도 128GB 고용량의 스마트폰을 사용한다. 하지만 모두가 이런 환경을 가지고 있을까? 전 세계적으로는 그렇지 않은 경우가 많다는걸 이번 프로젝트를 통해 알게 되었다.
회사는 글로벌 시장을 대상으로 하고 있으며, 특히 인도와 아랍 국가들을 타겟 Meta광고를 하고 있다. 이로 인해 앱 다운로드 수는 증가했지만, 설치 후 바로 삭제되는 현상이 발생하고 있다. 또한 Sentry에서 가장 많이 관측되는 에러는 Network에러 였다. 이는 사용자들이 용량이 큰 앱을 피하는 경향이 있으며, 네트워크 환경이 열악한 경우가 많기 때문으로 보인다.
따라서 앱의 용량이 설치 결정에 큰 영향을 미친다는 것을 알 수 있다. 특히 3D 렌더링에 사용되는 Babylon.js와 같은 무거운 자원은 이러한 문제를 더 악화시킬 수 있다.
위의 상황을 고려할 때, 다음과 같은 조치를 취할 필요가 있다:
앱 용량 최적화: Babylon.js와 같은 3D 렌더링 라이브러리 및 3D 파일들의 용량을 최적화하여 앱의 전체 용량을 줄인다. 이를 통해 사용자가 앱을 다운로드하는 것을 꺼리지 않도록 한다.
런타임 로딩: 앱을 처음 시작할 때 필요하지 않은 3D 자원은 런타임에 다운로드하도록 하여 초기 다운로드 용량을 최소화한다. 필요한 경우에만 자원을 다운로드하여 네트워크 환경에 민감한 사용자에게도 부담을 줄인다.
최적화된 콘텐츠 제공: 사용자가 주로 사용하는 기능 및 콘텐츠에 집중하여 해당 부분을 최적화하여 제공한다. 불필요한 자원을 포함하지 않고, 사용자가 실제 필요로 하는 콘텐츠에 집중하여 제공함으로써 사용자 경험을 향상시킨다.
이러한 조치를 통해 앱의 용량을 최적화하고, 네트워크 환경에 민감한 사용자에게도 원활한 서비스를 제공할 수 있게해야 한다.
이하에서는 React native 를 사용하여 앱을 만들때 APK 파일 크기를 줄이는 방법에 초점을 두고 이야기해보고자 한다.
사용하지 않는 리소스 삭제
리소스 축소(shrinkResources) 사용
Android Studio로 작업할 때 minifyEnabled라는 속성을 볼 수 있다. 보통 false로 설정되어 있고 소스코드를 난독화해서 보안을 강화하고 싶거나 앱의 크기를 줄이고 싶을 때 true로 변경한다.
이때 shrinkResources라는 속성도 추가해서 true로 설정하면 minify 작업 후 사용하지 않는 리소스를 삭제한다.
ProGuard를 사용한 코드 난독화와 최적화. 사용되지 않는 코드를 제거하고 클래스 및 메서드 이름을 난독화하여 APK 파일의 크기를 줄일 수 있다.
APK 파일 크기를 줄이는 것은 AAB 파일의 최종 크기에도 영향을 미칠 수 있다. 하지만, AAB 파일의 최종 크기는 Google Play Store의 압축 및 최적화 알고리즘에 따라 달라질 수 있다.
Android 소스 난독화
“앱의 소스 코드를 난독화하는 기술”
안드로이드 앱 소스 난독화는 안드로이드 앱의 소스 코드를 분석하기 어렵게 만들기 위한 기술. 이를 통해 앱의 소스 코드를 더욱 안전하게 보호가능.
소스 코드 난독화를 사용하면 디컴파일러가 코드를 해석하기 어려워지므로, 해커가 앱의 코드를 이해하고 악성 기능을 추가하는 것을 어렵게 만들 수 있다.
이미 서비스하고 있는 앱과 완전히 똑같은 앱이 Google Play Store에 배포될 수 있을까?
Play Store에 배포된 Android 앱의 경우, 누구나 자유롭게 해당 앱을 다운로드 받아 APK를 추출하는 건 누구나 가능하다. 개발자가 아닌 일반 사용자도 구글링만 해도 충분히 할 수 있다.
여기서 추출된 APK를 디컴파일(Decompile)하여 소스 코드를 보는 것도 dex2jar, JD-GUI 등 라이브러리를 통해 진행할 수 있다.
즉, 만약 소스 코드가 난독화 되어있지 않을 경우, 악의를 가진 사용자가 해당 앱을 다운로드 받아 APK를 추출하고 디컴파일하여 해당 소스 코드를 그대로 가져와서 앱을 출시할 수 있다는 의미이다.
구글 플레이스토어와 애플 스토어 앱 업로드 방식 간에는 몇 가지 차이가 있다.
따라서 AAB 파일은 Google Play 스토어에서 사용되며 APK를 최적화하는 데 사용되는 반면, IPA 파일은 애플 스토어에서 사용되며 iOS 애플리케이션을 패키징하고 배포하는 데 사용된다.
IPA 파일의 경우, 동적 임포트, 코드 난독화 및 압축 등의 작업은 개발자가 Xcode를 사용하여 iOS 애플리케이션을 빌드할 때 자동으로 처리된다. 여러 가지 최적화 및 보안 기능이 Xcode 내부에서 자동으로 실행되며, 이는 개발자가 따로 설정할 필요가 없다.
따라서 동적 임포트, 코드 난독화 및 압축과 같은 작업은 개발자가 Xcode를 사용하여 iOS 애플리케이션을 빌드할 때 자동으로 처리되며, 개발자가 따로 설정할 필요가 없다.
꼭 Native App을 고집해야 할까?
꼭 App을 사용해야 한다면?
참고자료