feat. JIT & AOT
prev) 안드로이드 Dalvik & ART (1/2)
DVM는 앱을 실행할 때마다 인터프리터를 통해 해석을 하거나 JIT 컴파일러를 통해 부분적으로 해석한 기계어를 저장 및 실행한다. 하지만 ART는 AOT 컴파일러를 사용하여 앱을 설치할 때 바이트코드를 기계어로 해석 완료한다. 따라서 설치하는 시간은 느리지만 일단 설치를 마치면 실행할 때는 빠르다는 장점이 있다.
ART를 DVM과 JVM의 컴파일 과정과 함께 비교해보면 위 그림처럼 나타낼 수 있다. 여기서 주목할 만점은 AOT 컴파일러는 APK를 설치할 때 기계어로 해석한다. 이때 사용되는 것은 APK에 포함된 Dalvik에서 사용하는 dex 파일이다. 사실 DVM도 dex 파일을 그대로 사용하는 것이 아니라 odex 파일로 변경하여 사용한다.
dex 파일이 변경되는 과정을 좀 더 자세히 알아보기 위해서 다음 그림을 살펴보자.
Dalvik은 dexopt라는 Tool을 통해서 dex 파일을 최적화(optimized)한 odex(optimized dex)라는 파일을 만든다. odex는 특정 기기의 시스템에 최적화된 코드이기 때문에 다른 기기에서 사용할 수 없다. DVM은 이 odex 파일을 앱 실행 시 기계어로 해석한다.
ART는 AOT 컴파일 시 dex2oat라는 Tool을 사용해서 dex 파일을 odex로 변경한 후에 다시 oat 파일로 다시 변경한다. oat 파일은 elf 파일 형식의 기계어를 포함하는 파일이다. elf 파일은 간단히 말하면 실행파일(executable file)이다.
ART의 단점으로 용량이 크다는 점이 있는데 oat 파일이 dex/odex 파일을 포함하고 있어서 용량이 큰 것이다.
ref.)
jennysgap 블로그 : https://jennysgap.tistory.com/entry/%EC%95%B1%EB%B6%84%EC%84%9D-02-Dalvik-VM-vs-ART-VM
stackoverflow : https://stackoverflow.com/questions/26254538/difference-between-dexopt-and-dex2oat/26263071