안드로이드에서 앱이 실행되기 위해서는 CPU가 이해할 수 있는 기계어(Machine Code)로 변환되어야 한다. 이 변환 방식에 따라 크게 두 가지 방식이 존재한다.
과거에는 Dalvik 가상 머신(DVM)이 JIT 방식으로 실행되었지만, 이후 Android Runtime(ART)이 도입되면서 AOT 방식으로 변경되었고, 이후에는 JIT과 AOT를 혼합한 하이브리드 방식이 사용되고 있다.
안드로이드 초기 버전(Kitkat 이전)에서는 Dalvik Virtual Machine(DVM)을 사용했으며, JIT 컴파일 방식을 채택했다.
이처럼 Dalvik은 앱 실행 시마다 JIT 컴파일을 수행하므로 실행 속도가 느려질 수 있다는 단점이 있었다.
Android 4.4 Kitkat 버전(2013년)부터는 새로운 앱 실행 환경인 ART(Android Runtime)가 도입되었다. ART는 AOT(Ahead Of Time) 컴파일 방식을 채택하여 기존 Dalvik의 성능 문제를 해결했다.
DEX 파일: 안드로이드 앱을 개발할 때, 코드(Java나 Kotlin 등)는 DEX(Dalvik Executable) 파일로 컴파일된다. DEX 파일은 안드로이드 기기에서 실행할 수 있는 바이너리 형식으로 변환된 앱의 코드다.
DEX2OAT(최적화 과정): DEX 파일은 기기에 설치될 때, "DEX to OAT" 변환 과정을 거친다. DEX2OAT는 DEX 파일을 OAT(Optimized Android Executable) 파일로 변환하는 툴이다. 이 과정에서 앱의 코드가 최적화되고, 실행 성능을 높이기 위해 특정 최적화 작업이 이루어진다. 이 과정은 주로 앱 설치 시에 이루어진다.
Native Code로 변환 후 ROM에 저장: 변환된 OAT 파일은 ROM에 저장된다.
ROM에 저장된 OAT 파일은 실제 하드웨어에서 빠르게 실행될 수 있도록, CPU 아키텍처에 맞게 최적화된 네이티브 코드 형태로 변환된다.
Native Code 실행: 기기의 ART(Android Runtime)에서 이 최적화된 네이티브 코드를 실행한다. ART는 앱을 실행하기 위한 런타임 환경으로, 코드 실행 시 JIT(Just-In-Time) 방식이나 AOT(Ahead-Of-Time) 방식으로 최적화된 네이티브 코드를 실행한다.
Android 7.0 Nougat(2016년) 버전부터는 JIT과 AOT 방식을 혼합한 하이브리드 방식이 도입되었다. 이 방식은 JIT과 AOT의 장점을 조합하여 최적의 성능을 제공한다.
Dalvik (JIT) | ART (AOT) | 하이브리드 (JIT + AOT) | |
---|---|---|---|
컴파일 시점 | 실행할 때 변환 | 설치할 때 변환 | 실행 중 JIT, 이후 AOT 최적화 |
앱 설치 속도 | 빠름 | 느림 | 적당함 |
앱 실행 속도 | 느림 | 빠름 | 빠름 |
앱 용량 | 작음 | 큼 | 적당함 |
배터리/RAM 사용량 | 많음 | 적음 | 절충 |