https://developer.android.com/guide/platform/index.html?hl=ko#art


Android는 모바일 기기를 위한 Linux 기반 커널과 미들웨어, 핵심 애플리케이션들을 포함한 소프트웨어 스택이라고 볼 수 있다.


ART, Android Runtime

```

.class    ---   DX  --->    .dex    : Dalvik

.dex      -- dex2oat -->    .oat    : ART

```

안드로이드 5.0 롤리팝(API 21)부터는 Dalvik VM 대신 ART VM을 사용한다.

안드로이드 7.0 누가(API 24) 이후의 ART VM에서는 JIT와 AOT를 모두 사용한다.

최초 설치시에는 JIT를 사용하도록 하여 설치 시간과 용량을 적게 소모하도록 한 뒤, 자주 사용하는 앱일 경우 AOT로 컴파일하는 식이다.


Dalvik VM 방식 : JIT

자바 바이트 코드(`` .class``)를 달빅 바이트 코드(`` .dex``)로 변환해 두고, 이를 런타임에 JIT 컴파일 하며 실행하는 방식.

장점은 여러 `` .class``파일에 있는 중복된 코드를 재사용하기 때문에 용량을 절약할 수 있다는 점.

결국 중간 언어를 실행하는 것이라 JVM처럼 중간 언어를 해석해줄 Dalvik VM이 필요하다.


ART VM 방식 : AOT, Ahead-Of-Time (+ JIT)

AOT는 중간 언어를 받아 Native binary로 컴파일하는 방식. 중간 언어를 받는다는 점만 빼면 소스 코드 컴파일과 같다. 주로 설치 시점에 컴파일한다.

이 경우 `` .dex`` 파일을 `` .oat`` 파일로 컴파일하는 거니까 컴파일에 사용하는 중간 언어는 달빅 바이트 코드.


안드로이드에서는 바이트 코드 바이너리를 둘 다 유지하고 있어 JIT 방식 보다 용량이 더 필요하다는 단점이 있다.

`` .oat`` 파일은 Native machine code로 되어 있기 때문에 VM 없이 실행 가능하지만 Dalvik과의 하위 호환성을 제공해야 하기 때문에 VM 위에서 돌아가는 것 처럼 실행된다.


Java 8 지원

Android는 Java 7 까지는 모두 지원하고, Java 8은 플랫폼 버전에 따라서 지원 정도가 다르기 때문에 선택적으로 사용한다. Java 8 기능을 사용하기 위해서 이런 식으로 `` desugar``를 거치게 된다.