Android 바이너리 크기 줄이기

Android에서 프로젝트의 바이너리 파일의 크기를 줄이는 옵션에 관하여 알아봅니다.

Choose your operating system:

Windows

macOS

Linux

추가 참고

모바일 스토어프런트에서는 셀룰러 데이터를 통해 게임을 제공할 때 디바이스로 보낼 수 있는 데이터의 양을 제한할 수 있습니다. 많은 스토어에서 APK 및 OBB의 크기에 대해 강제 제한을 적용합니다. 이로 인해 모바일 애플리케이션의 크기를 가능한 한 줄이는 것이 좋습니다. [Google Play Asset Delivery]() 및 [ChunkDownloader]()와 같은 콘텐츠 제공 시스템은 바이너리에서 에셋을 분리하여 코어 실행파일의 크기를 줄일 수 있지만 바이너리 크기를 최적화하는 데에도 유용합니다.

이 페이지에서는 Android 프로젝트의 바이너리를 최적화하는 데 사용할 수 있는 언리얼 엔진(UE) 툴에 대한 가이드를 제공합니다.

UE4 이후 변경사항

UE5는 불필요한 코드 제거 및 동일한 코드 접기를 가능하게 하는 업데이트된 컴파일러 및 링커 플래그를 제공합니다. 일부 UE4 코드는 코드 팽창을 줄이기 위해 UE5용으로 재작성되었으며, 이를 통해 크기가 크게 줄어듭니다. 이러한 변경사항은 기본적으로 활성화되어 있고 별도로 작업을 수행할 필요가 없습니다.

고급 최적화

특정 Android SDK 버전에서만 고급 바이너리 최적화가 제공되며 수동으로 활성화해야 합니다. 프로젝트 세팅(Project Settings) > 플랫폼(Platforms) > Android 에서 최소 SDK 버전을 변경하거나 *Engine.ini 파일에서 이를 변경할 수 있습니다.

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]

MinSDKVersion=23

고급 최적화를 활성화하려면 *AndroidEngine.ini 파일에 다음 세팅을 추가합니다.

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]

bEnableAdvancedBinaryCompression = true

이후에는 SDK 버전에 대해 사용 가능한 최적화가 프로젝트 패키징 시 적용됩니다. 최적화에 대한 내용은 아래에 요약되어 있습니다.

Android SDK 23 이상

다음 최적화는 프로젝트의 최소 Android SDK 버전이 23인 경우 사용 가능합니다.

GNU 해시 및 시작 시간

SDK 23 이상인 프로젝트는 이전 포맷 대신 새로운 GNU 해시 ELF 섹션을 사용합니다. 이를 통해 퍼포먼스가 개선되고 시작 시간이 빨라집니다.

APS 리로케이션 테이블 압축

추가로, 진행 중인 프로젝트에서 Android 전용 압축 포맷인 APS 리로케이션 테이블 압축(APS Relocation Table Compression)을 활용할 수 있습니다. 에픽의 테스트에서 크기가 62MB인 리로케이션 테이블에 이 포맷을 사용하자 크기가 약 8MB로 줄어들었습니다.

APK 압축 .so 바이너리의 직접 로드

최소 SDK 버전을 23 이상으로 설정한 경우 Android OS는 애플리케이션의 APK에서 직접 .so 바이너리를 로드하므로 압축된 APK에서 디바이스에 별도로 바이너리를 언패킹하거나 설치할 필요가 없습니다.

언리얼 엔진은 기본적으로 APK 압축을 시행하지만 *Engine.ini 파일에 다음 환경설정 변수를 사용하여 비활성화할 수 있습니다.

[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]

bExtractNativeLibs = false

bExtractNativeLibs를 false로 설정한 경우 애플리케이션이 직접 .so 바이너리를 로드하고 압축을 방지합니다. 하지만 APK가 Google Play 스토어의 150MB 셀룰러 데이터 제한보다 작은 경우 이 세팅을 비활성화할 것을 권장합니다. Google Play 스토어의 On-the-Fly 압축이 APK의 zip 압축보다 더 작은 파일 크기를 제공하고 애플리케이션에서 발생하는 셀룰러 트래픽을 줄이기 때문입니다.

bExtractNativeLibs를 활성화한 채로 두는 경우 더 작은 APK가 생성되지만 OS에서 이를 언패킹하고 .so 바이너리를 별도로 설치하므로 실질적으로 더 많은 디스크 공간을 사용합니다. 하지만 Google Play 스토어 외의 스토어에서는 권장됩니다.

Android SDK 28 이상

다음 최적화는 프로젝트의 최소 Android SDK 버전이 28인 경우 사용 가능합니다.

RELR 리로케이션 테이블 압축

최소 SDK 버전이 28 이상인 프로젝트는 APS보다 효율성이 높은 RELR 리로케이션 테이블 압축(RELR Relocation Table Compression)을 활용할 수 있습니다. 예를 들어 62MB 리로케이션 테이블은 RELR을 사용할 때 크기가 약 600KB로 감소했습니다. RELR은 APS에 비해 더 높은 퍼포먼스를 제공합니다.