본문으로 이동

안드로이드 런타임

한울위키, 우리 모두의 백과사전.
ART
개발자구글
저장소android.googlesource.com/platform/art/
프로그래밍 언어C++
엔진
    모듈:EditAtWikidata 29번째 줄에서 Lua 오류: attempt to index field 'wikibase' (a nil value).
    운영 체제안드로이드
    플랫폼ARM64 RISC-V x86
    기본 포함안드로이드
    대체한 소프트웨어달빅
    종류런타임 시스템
    라이선스아파치 라이선스 2.0[1]

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

    개요

    파일:ART view.png
    달빅과 ART 아키텍처의 비교

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

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

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

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

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

    역사

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

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

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

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

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

    같이 보기

    각주

    1. “NOTICE - platform/art - Git at Google”. 2023년 3월 4일에 원본 문서에서 보존된 문서. 2021년 6월 25일에 확인함. 
    2. Andrei Frumusanu (2014년 7월 1일). “A Closer Look at Android RunTime (ART) in Android L”. AnandTech. 2014년 7월 5일에 원본 문서에서 보존된 문서. 2014년 7월 5일에 확인함. 
    3. Ben Cheng; Bill Buzbee (May 2010). “A JIT Compiler for Android's Dalvik VM” (PDF). 《android-app-developer.co.uk》. Google. 5–14쪽. 2015년 11월 6일에 원본 문서 (PDF)에서 보존된 문서. 2015년 3월 18일에 확인함. 
    4. Phil Nickinson (2010년 5월 26일). “Google Android developer explains more about Dalvik and the JIT in Froyo”. 《androidcentral.com》. 2017년 4월 8일에 원본 문서에서 보존된 문서. 2014년 7월 8일에 확인함. 
    5. “Android Developers: ART and Dalvik”. 《source.android.com》. 2015년 3월 9일. 2015년 3월 15일에 원본 문서에서 보존된 문서. 2015년 3월 18일에 확인함. 
    6. “Android Developers: Configuring ART – How ART works”. 《source.android.com》. 2015년 3월 9일. 2015년 3월 18일에 확인함. 
    7. Amadeo, Ron (2016년 8월 22일). “Android 7.0 Nougat review—Do more on your gigantic smartphone” (미국 영어). 《아르스 테크니카. 2023년 4월 5일에 확인함. 
    8. Sean Buckley (2013년 11월 6일). 'ART' experiment in Android KitKat improves battery life and speeds up apps”. 엔가젯. 2017년 1월 27일에 원본 문서에서 보존된 문서. 2014년 7월 5일에 확인함. 
    9. Daniel P. (2013년 11월 7일). “Experimental Google ART runtime in Android KitKat can bring twice faster app executions”. 《phonearena.com》. 2014년 7월 7일에 원본 문서에서 보존된 문서. 2014년 7월 5일에 확인함. 
    10. “Android 7.0 for Developers” (영어). 《Android Developers》. 2021년 3월 22일에 확인함. 
    11. Amadeo, Ron (2016년 8월 22일). “Android 7.0 Nougat review—Do more on your gigantic smartphone” (미국 영어). 《아르스 테크니카. 2023년 4월 5일에 확인함. 
    12. “Implementing ART Just-In-Time (JIT) Compiler”. 《source.android.com》. 2017년 1월 22일. 2023년 8월 8일에 원본 문서에서 보존된 문서. 2017년 1월 22일에 확인함. 
    13. Amadeo, Ron (2018년 9월 13일). “Android 9 Pie, thoroughly reviewed” (미국 영어). 《Ars Technica》. 2018년 11월 30일에 원본 문서에서 보존된 문서. 2022년 8월 16일에 확인함. 
    14. “ProfileInstaller | Jetpack” (영어). 《Android Developers》. 2023년 8월 8일에 원본 문서에서 보존된 문서. 2023년 7월 5일에 확인함. 
    15. Semenova, Kateryna; Ravikumar, Rahul; Craik, Chris (2022년 1월 28일). “Improving App Performance with Baseline Profiles” (영어). 《Android Developers Blog》. 2023년 8월 8일에 원본 문서에서 보존된 문서. 2023년 7월 5일에 확인함. 
    16. Gidra, Lokesh (2022년 5월 12일), 《What's new in app performance》 (영어), 2022년 8월 16일에 원본 문서에서 보존된 문서, 2022년 8월 16일에 확인함 
    17. Gidra, Lokesh; Boehm, Hans-J.; Fernandes, Joel (2020년 10월 12일). 《Utilizing the Linux Userfaultfd System Call in a Compaction Phase of a Garbage Collection Process》. 《Defensive Publications Series》. 2022년 8월 16일에 원본 문서에서 보존된 문서. 2022년 8월 16일에 확인함. 
    18. “Android 13 is in AOSP!” (영어). 《Android Developers Blog》. 2022년 8월 15일에 원본 문서에서 보존된 문서. 2022년 8월 16일에 확인함. 

    외부 링크

    • 모듈:Official_website 90번째 줄에서 Lua 오류: attempt to index field 'wikibase' (a nil value).