sh711 님의 블로그

Dalvik & ART 본문

Study/Android

Dalvik & ART

sh711 2025. 2. 28. 00:57
Dalvik ART는 안드로이드의 런타임 환경을 의미한다.
원래는 앱 개발 시 Java를 활용하여 개발하였고 JVM 환경이 아닌 Dalvik VM이라는 환경을 사용하였지만 현재는 ART에서 실행된다.

Dalvik

Dalvik VM은 안드로이드 Api 2.1 ~ 5.1 까지 사용된 런타임 환경이다.

JIT(Just In Time) 컴파일러를 사용하였으며 이 방식은 실행되는 시점에서 당장 필요한 부분만 컴파일 하여 앱 자체가 느려지는 단점이 있다.

 

ART

ART는 안드로이드 Api 4.4 ~ 현재까지 사용되는 런타임 환경이다.

AOT(Ahead of Time) 컴파일러를 사용하며 이 방식은 설치되는 시점에 코드를 컴파일 하고 미리 캐시하여 실행하는 방식으로 JIT에 비해 실행 속도가 빠르다.

dex2oat 도구를 사용하여 앱을 컴파일하며 앱 설치 시 모든 코드를 기계어로 컴파일(AOT 파일) 하여 앱 패키지 안에 저장한다.

 

현재

안드로이드 누가 Nougat (7.0) 버전 부터는 JIT와 AOT를 같이 사용

최초 설치시 JIT를 사용하여 설치시간과 용량을 적게 소모하고, 나중에 기기가 충전 중이거나 사용되지 않을 때 컴파일을 조금씩 하여 앱을 AOT 방식으로 전환

 

DEX(Dalvik Excutable)

1. APK 파일 생성 시 작성된 코드가 컴파일 되어 자바 바이트코드(.class)로 변환 => DEX 파일

2. 이러한 자바 파이트코드 파일들을 하나로 합쳐서 .dex 파일로 변환

3. .dex 파일과 리소스 파일을 합쳐서 APK 파일 생성

 

JNI (JAVA Native Interface)

JNI는 C/C++을 통한 연산 및 작업 과정을 자바에선 jvm 환경, 안드로이드에선 dalvik/art 환경에서 상호작용할 수 있게 해주는 표준 인터페이스이다.

따라서, 특정 작업을 진행할 때 성능 최적화 등의 이유로 C나 C++을 사용할 수 있다. (게임 엔진, 고성능 연산 등)

 

주요 파일 형식

 

  • DEX => 앱의 자바 코드가 변환된 바이트코드
  • ODex => DEX 파일이 최적화되어 Dalvik 또는 ART 환경에서 빠르게 실행될 수 있도록 변환된 파일 => 실행 가능 포맷 아님
  • OAT => ART에서 사용되는 최적화된 네이티브 코드 파일, 앱 설치 시 AOT 방식으로 컴파일되어 생성

 

ART에 올라가 구동되기까지 과정

1. Kotlin 코드 작성

  • 개발자는 코틀린으로 Android 애플리케이션을 작성
  • 코틀린은 JVM 언어로 설계되었기 때문에, Java와 동일하게 바이트코드(bytecode)로 컴파일

2. 코틀린 코드 컴파일

  • kotlin 컴파일러를 통해 바이트 코드 (.class)로 변환
  • 컴파일 된 .class 파일은 jvm에서 실행 가능한 코드

3. D8/Dalvik 변환

  • 생성된 .class 파일은 Android 빌드 시스템(gradle)에 의해 Dex(dlavilk executable) 파일로 변환
  • dex 파일은 Dalvik VM 및 ART가 이해할 수 있는 실행 파일 포맷

D8: Android용 최신 DEX 컴파일러로, .class(바이트 코드) 파일을 .dex 파일로 변환

4. APK 생성

  • dex 파일, 리소스 파일 (이미지, xml 등), 네이티브 라이브러리 등이 하나로 묶여 APK 파일 생성됨

5. 서명 및 배포

  • apk는 반드시 디지털 서명이 필요

개발 단계 : 디버그 키로 서명

배포 단계 : 릴리스 키로 서명

6. Android Runtime(ART)에서 실행 준비

  • 이제 apk를 설치하면 apk 파일에서 .dex파일과 리소스를 추출
  • .dex 파일을 /data/dalvik-cache/ 에 저장
  • 네이티브 라이브러리 및 리소스 파일을 적절한 경로에 배치

7. AOT(Ahead of time) 컴파일

  • ART는 AOT 컴파일을 수행
  • .dex 파일을 기계어(machine code)로 미리 변환하여 저장
  • 변환된 코드는 OAT 파일 형식으로 저장되며, 위치는 /data/dalvik-cache/

8. ART에서 애플리케이션 실행

  • 사용자가 앱 실행
  • 앱마다 별도의 Linux 프로세스 생성 ⇒ 각 프로세스는 ART 인스턴스를 통해 실행
  • 메모리 공간할당 ⇒ ART는 앱을 위한 독립적인 힙 메모리 영역 설정

9. ART에서 코드 실행

  • AOT 컴파일로 생성된 OAT(Odexed ART file) 파일 실행 =⇒ OAT 파일은 ART에서 실행가능한 포멧

 

'Study > Android' 카테고리의 다른 글

frida 라이브러리 덤프  (0) 2025.03.12