Android Compiler의 이해

2019. 9. 22. 13:21

Android Compiler의 이해

 

Compiler란?

 

  • 컴퓨터가 직접 이해할 수 있는 언어로 바꾸어 주는 역할을 하는 프로그램
  • 프로그램 개발자들은 자바와 같이 인간이 이해할 수 있는 고급언어 개발하고 이를 컴퓨터 언어로 번역
  • 컴파일러는 소스코드를 컴파일하여 목적코드(Object Code)를 생성하고, 목적 코드는 링커가 라이브러리와 연결하여 실행 가능한 코드를 생성하여 실행한다. 

 

Dalvik이란?

 

  • Dalvik은 VM이다. 줄여서 DVM(Dalvik Virtual Machine)
  • 안드로이드는 Java를 사용하면서 JVM(Java Virtual Machine)을 사용하지 않고, DVM을 쓰는 이유는 라이센스 문제와 메모리 효율성의 이유로 설계되었다.

 

 

Java의 컴파일 과정

 

  • 바이트 코드(Byte code)는 기계어(Machine code)가 아니다.
  • 바이트 코드는 특정 플랫폼에 종속되는 것이 아니며 VM을 위한 코드
  • VM은 인터프리터를 이용하여 기계어를 해석하는 과정이 필요

 

ART(Anroid Runtime)란?

 

  • Android 5.0(API 21) 이상에서 기본 런타임
  • ART는 VM이 아니다. 런타임시 사용되는 라이브러리
  • Dalvik은 JIT(Just In Time) 방식을 사용하고, ART는 AOT(Ahead Of Time) 방식을 사용
  • Android N(7.0)부터는 AOT와 JIT를 조합

 

 

 

 

JIT(Just In Time)란?

 

  • 호환성(VM은 인터프리터를 이용하여 기계어를 해석하는 과정)을 위한 VM의 특성으로 인해 Java는 실행 속도가 느리다.
  • 프로그램 실행시 자주 사용되는 바이트 코드에 대해서는 미리 기계어로 해석. 재해석 없어 속도 향상 효과
  • 초기 DVM에는 JIT가 없었고. Android 2.2 Froyo부터 적용

 

  • 앱 실행시 컴파일
  • 설치 시 컴파일을 하지 않기 때문에 AOT보다 설치 속도가 빠름
  • 실행 시 컴파일을 하기 때문에 AOT에 비해 실행 속도가 느림
  • 용량이 작음

 

AOT(Ahead Of Time)란?

 

  • 앱 설치시 컴파일
  • 설치 시 컴파일을 완료하기 때문에 JIT에 비해 설치 속도가 느림
  • 실행 시 컴파일을 하지 않기 때문에 JIT에 비해 실행 속도가 빠름
  • 용량이 큼(JIT에서 실행 시 컴파일하는 것을 미리 컴파일하여 가지고 있기 때문)

 

딜레마

  • 설치 속도가 느리면 앱을 설치하지 않고, 실행 속도가 느리면 앱을 삭제한다.

 

 

구글 I/O 2016의 발표에 따른 추가 사항

 

  • Android N(7.0) 에서는 ART에 JIT 컴파일러도 추가
  • 프로필 가이드 방식의 JIT/AOT 컴파일

 

Android N에서 코드 프로파일링을 포함한 JIT 컴파일러를 ART에 추가했으며, 실행 시에 Android 앱의 성능이 계속해서 향상되었다. JIT 컴파일러는 ART의 AOT 컴파일러를 보완하고 런타임 성능을 개선하며, 저장 공간을 절약하고,
앱 업데이트 및 시스템 업데이트 속도를 빠르게 해 준다.

 

Android N에서는 최초 설치 시에는 JIT를 사용하여 설치 속도를 높이고, 차후 기기를 사용하지 않을 때나 충전 중일 경우 컴파일을 조금씩 하여, 자주 사용되는 앱을 AOT 방식으로 전환하는 것으로 바뀌었다. 즉, 양 방식의 장점을 합치고 단점을 극복하려 시도한 것이며 실제로 애플리케이션의 설치 속도가 기존 AOT 방식에 비해 매우 빨라졌다. 단, 용량 문제는 여전하다.

히지만 용량 문제는 하드웨어 성능이 지속적으로 발전해 나감으로써 크게 문제가 되지 않는다.

 

 

 

D8이란?

 

D8은 Dex compiler이다.

DX는 안드로이드 스튜디오 3.0 전(D8보다 시간이 오래 걸리고 용량도 큼)

D8는 안드로이드 스튜디오 3.1 부터 기본 컴파일러(안드로드 스튜디오 3.0에서 D8은 optional 지원됨)

 

// gradle.properties
android.enableD8 = false 

 

  • .dex file size, runtime performance 등에 영향을 미친다.

 

 

참고문서