안드로이드 컴파일러 (JIT 컴파일러와 AOT 컴파일러)


1. Java Compiler
소스코드(.java)를 바이트코드(.class)로 번역한다.


2. android apk build 과정
.java → .class → .dex → .apk → 서명 및 최적화 → release
- java compiler에 의해 .class 파일로 컴파일
- 생성된 .class 파일을 android DX tool을 통해 .dex로 변환
- .dex과 resource를 합쳐 .apk로 압축


3. JIT Compiler (Just In Time) → Dalvik
실행 시점에 바이트코드(.dex)를 기계어로 번역한다.
인터프리터 방식의 언어들이 성능 향상을 목적으로 도입하는 경우가 많으며,
자주 사용되는 코드는 매 번 번역하지 않고, 캐싱하여 성능을 개선한다.

메소드 단위로 JIT 컴파일하는 방식과
실행 흐름을 실시간으로 추적하며 컴파일하는 Tracing JIT 방식으로 분류된다.
용량↓, 설치속도↑, 실행속도↓, 배터리 사용↑, CPU 사용↑


4. AOT Compiler (Ahead Of Time) → Android RunTime
설치 시점에 기계어로 번역한다.
용량↑, 설치 속도↓, 실행 속도↑, 배터리 사용↓, CPU 사용↓



Dalvik은 dexopt를 통해 dex 파일을 최적화한 odex(optimized dex)를 만든다.
odex는 특정 시스템에 최적화된 코드로 다른 시스템(기기)에서는 사용할 수 없다.
DVM은 odex 파일을 앱 실행시 기계어로 번역한다.

ART는 AOT 컴파일 시 dex2oat를 통해 dex → odex → oat로 변경한다.
oat 파일은 elf 파일 형식의 기계어를 포함하는 파일이다.
oat 파일은 기계어로 완전히 번역된 파일이기 때문에 VM없이도 바로 실행가능하나,
Dalvik과의 호환성을 위하여 VM 위에서 돌아가는 것처럼 실행된다.

L-OS(5.0, API 21)부터 ART(AOT)가 적용되었으며,
N-OS(7.0, API 24)부터 ART에 AOT와 함께 JIT도 사용된다.


댓글

이 블로그의 인기 게시물

아스키 코드(ASCII)와 유니코드(unicode)

네트워크의 기본 #2 - TCP/IP 4계층

디자인 패턴 #5 - 컴포지트 패턴 (composite pattern)