안드로이드 런타임

안드로이드 런타임(Android Runtime, ART)은 안드로이드가 사용하는 애플리케이션 런타임 시스템이다. 안드로이드에서 원래 사용되던 가상 머신인 달빅을 대체하는 ART는 애플리케이션의 바이트코드 일부를 장치의 런타임 환경에서 나중에 실행되는 기계어로 트랜슬레이션하는 작업을 수행한다.

 개요 
섬네일|upright=1.8|right|달빅과 ART 아키텍처의 비교
안드로이드 2.2 "프로요"는 달빅에 트레이싱 JIT 컴파일 방식을 도입하여, 앱이 실행될 때마다 지속적으로 프로파일링을 수행하고 자주 실행되는 짧은 바이트코드 세그먼트를 컴파일러를 통해 동적으로 기계어로 컴파일함으로써 애플리케이션 실행을 최적화했다. 달빅이 애플리케이션 바이트코드의 나머지 부분을 인터프리터 방식으로 해석하는 동안, "트레이스"라고 불리는 짧은 바이트코드 세그먼트의 네이티브 실행은 상당한 성능 향상을 제공한다.

달빅과 달리 ART는 애플리케이션 설치 시 성능이 가장 중요한 부분(이전에는 앱 전체)을 네이티브 기계어로 컴파일하는 AOT 컴파일 방식을 도입했다. 이러한 방식으로 ART는 전반적인 실행 효율성을 높이고 전력 소비를 줄여 모바일 장치의 배터리 자율성을 개선한다. 동시에 ART는 애플리케이션의 더 빠른 실행, 개선된 메모리 할당 및 쓰레기 수집(GC) 메커니즘, 새로운 애플리케이션 디버그 기능, 그리고 더 정확한 상위 수준의 애플리케이션 프로파일링을 제공한다.

하위 호환성을 유지하기 위해 ART는 APK의 일부로 제공되는 표준 .dex 파일과 동일한 입력 바이트코드를 사용하는 반면, .odex 파일은 ELF 파일 형식 실행 파일로 대체된다. 애플리케이션이 ART의 장치 내  유틸리티를 사용하여 컴파일되면 컴파일된 ELF 실행 파일에서 실행된다. 그 결과, ART는 달빅의 인터프리터 방식 및 트레이싱 기반 JIT 컴파일과 관련된 다양한 애플리케이션 실행 오버헤드를 제거한다.

ART의 단점은 애플리케이션 설치 시 컴파일을 위한 추가 시간이 필요하고, 컴파일된 코드를 저장하기 위해 애플리케이션이 보조 기억 장치(보통 플래시 메모리)를 약간 더 많이 차지한다는 점이다. 긴 AOT 컴파일 시간은 월간 보안 업데이트가 일반화되면서 특히 문제가 되었는데, 업데이트 후 매번 사용자가 오랫동안 OS를 사용할 수 없게 만들었기 때문이다.

이를 개선하기 위해 안드로이드 7.0 (누가)에서는 하이브리드 방식이 도입되었다. 처음에는 JIT 컴파일에 의존하다가, 나중에 장치가 유휴 상태이고 충전 중일 때 UI 스레드에서 실행되는 코드와 가장 자주 사용되는 코드를 네이티브 코드로 컴파일한다.

 역사 
안드로이드 4.4 "킷캣"은 기본 가상 머신으로 유지된 달빅의 대안 런타임 환경으로 ART의 기술 프리뷰를 도입했다. 이후 주요 안드로이드 릴리스인 안드로이드 5.0 "롤리팝"에서 달빅은 ART로 완전히 대체되었다.

안드로이드 7.0 "누가"에서는 ART를 순수 AOT 방식에서 하이브리드 JIT/AOT 솔루션으로 전환하는 동시에, 자바 런타임 환경을 중단된 아파치 하모니에서 OpenJDK로 교체하고 코드 프로파일링 기능이 포함된 JIT 컴파일러를 도입했다. JIT 컴파일러는 ART의 AOT 컴파일러를 보완하여, "핫 코드"(자주 사용되거나 UI 스레드에서 실행되거나 시작 시간에 영향을 미치는 코드)를 식별해 성능을 높이고 저장 공간을 절약하는 데 도움을 준다. AOT 컴파일러는 장치가 유휴 상태이고 충전 중일 때 이 핫 코드를 기계어로 컴파일하며, 덜 자주 사용되는 코드는 JIT 컴파일에 의존한다.

안드로이드 9 "파이"는 압축된 바이트코드 파일을 사용하여 [[Apk (파일 포맷)|APK 포맷]|]이 사용하는 저장 공간을 줄였으며, 프로파일러 데이터를 구글 플레이 서버에 업로드하여 유사한 기기를 가진 사용자가 앱을 다운로드할 때 함께 묶어 제공할 수 있게 했다. 이를 통해 구글 플레이의 다운로드 시간을 최대 40%까지 단축할 수 있다. 구글 플레이 클라우드 프로필을 통해 앱 설치 시 최적화가 가능해져 안드로이드 7.0에서 8.1 사이에 나타났던 초기 성능 문제를 피하는 데 도움이 된다.

2021년 7월, 베이스라인 프로필(baseline profiles) 개념이 도입되었다. 베이스라인 프로필은 앱의 첫 실행부터 AOT 컴파일을 거쳐야 하는 메서드와 클래스를 정의하는 ART 프로필로, 안드로이드 7.0 이상과 호환된다. 이는 안드로이드 9의 구글 플레이 클라우드 프로필을 사용할 수 없을 때 유사한 기능을 제공하며, 사용 가능할 때는 클라우드 프로필과 자동으로 병합된다. 베이스라인 프로필은 AndroidX 라이브러리 및 Jetpack Compose의 릴리스에 포함되어 있다.

안드로이드 13에서 ART는 리눅스 커널의 userfaultfd 시스템 호출을 활용하는 새로운 쓰레기 수집(GC)으로 업데이트되었다. 이는 메모리 압박, 컴파일된 코드 크기 및 버벅임을 줄여주며, 쓰레기 수집 중 메모리 부족으로 인해 앱이 강제 종료될 위험을 방지한다. 다른 변경 사항들도 앱 시작 속도를 개선하고 버벅임을 줄이며 성능을 향상시킨다. 메인라인(Mainline) 프로젝트 덕분에 안드로이드 12의 ART도 업데이트될 예정이다.

 같이 보기 
 안드로이드 소프트웨어 개발
 안드로이드 버전 역사
 가상 머신

 각주 

 외부 링크 



런타임
분류:자바 가상 머신