안드로이드 런타임
| 개발자 | 구글 |
|---|---|
| 저장소 | android |
| 프로그래밍 언어 | C++ |
| 엔진 | |
| 운영 체제 | 안드로이드 |
| 플랫폼 | ARM64 RISC-V x86 |
| 기본 포함 | 안드로이드 |
| 대체한 소프트웨어 | 달빅 |
| 종류 | 런타임 시스템 |
| 라이선스 | 아파치 라이선스 2.0[1] |
| 프로그램 실행 |
|---|
| 일반 개념 |
| 코드의 종류 |
| 컴파일 전략 |
| 저명한 런타임 |
| 저명한 컴파일러 및 툴체인 |
|
안드로이드 런타임(Android Runtime, ART)은 안드로이드가 사용하는 애플리케이션 런타임 시스템이다. 안드로이드에서 원래 사용되던 가상 머신인 달빅을 대체하는 ART는 애플리케이션의 바이트코드 일부를 장치의 런타임 환경에서 나중에 실행되는 기계어로 트랜슬레이션하는 작업을 수행한다.[2]
개요
안드로이드 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]
같이 보기
각주
- ↑ “NOTICE - platform/art - Git at Google”. 2023년 3월 4일에 원본 문서에서 보존된 문서. 2021년 6월 25일에 확인함.
- ↑ 가 나 다 Andrei Frumusanu (2014년 7월 1일). “A Closer Look at Android RunTime (ART) in Android L”. AnandTech. 2014년 7월 5일에 원본 문서에서 보존된 문서. 2014년 7월 5일에 확인함.
- ↑ 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일에 확인함.
- ↑ 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일에 확인함.
- ↑ 가 나 “Android Developers: ART and Dalvik”. 《source.android.com》. 2015년 3월 9일. 2015년 3월 15일에 원본 문서에서 보존된 문서. 2015년 3월 18일에 확인함.
- ↑ 가 나 “Android Developers: Configuring ART – How ART works”. 《source.android.com》. 2015년 3월 9일. 2015년 3월 18일에 확인함.
- ↑ Amadeo, Ron (2016년 8월 22일). “Android 7.0 Nougat review—Do more on your gigantic smartphone” (미국 영어). 《아르스 테크니카》. 2023년 4월 5일에 확인함.
- ↑ Sean Buckley (2013년 11월 6일). “'ART' experiment in Android KitKat improves battery life and speeds up apps”. 엔가젯. 2017년 1월 27일에 원본 문서에서 보존된 문서. 2014년 7월 5일에 확인함.
- ↑ 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일에 확인함.
- ↑ “Android 7.0 for Developers” (영어). 《Android Developers》. 2021년 3월 22일에 확인함.
- ↑ Amadeo, Ron (2016년 8월 22일). “Android 7.0 Nougat review—Do more on your gigantic smartphone” (미국 영어). 《아르스 테크니카》. 2023년 4월 5일에 확인함.
- ↑ “Implementing ART Just-In-Time (JIT) Compiler”. 《source.android.com》. 2017년 1월 22일. 2023년 8월 8일에 원본 문서에서 보존된 문서. 2017년 1월 22일에 확인함.
- ↑ Amadeo, Ron (2018년 9월 13일). “Android 9 Pie, thoroughly reviewed” (미국 영어). 《Ars Technica》. 2018년 11월 30일에 원본 문서에서 보존된 문서. 2022년 8월 16일에 확인함.
- ↑ “ProfileInstaller | Jetpack” (영어). 《Android Developers》. 2023년 8월 8일에 원본 문서에서 보존된 문서. 2023년 7월 5일에 확인함.
- ↑ Semenova, Kateryna; Ravikumar, Rahul; Craik, Chris (2022년 1월 28일). “Improving App Performance with Baseline Profiles” (영어). 《Android Developers Blog》. 2023년 8월 8일에 원본 문서에서 보존된 문서. 2023년 7월 5일에 확인함.
- ↑ 가 나 Gidra, Lokesh (2022년 5월 12일), 《What's new in app performance》 (영어), 2022년 8월 16일에 원본 문서에서 보존된 문서, 2022년 8월 16일에 확인함
- ↑ 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일에 확인함.
- ↑ 가 나 다 “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).
- 스크립트 오류가 있는 문서
- CS1 - 미국 영어 인용 (en)
- CS1 - 영어 인용 (en)
- 잘못된 파일 링크가 포함된 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 안드로이드 (운영체제)
- 자바 가상 머신