테크 지식
안드로이드 런타임(Android Rumtime)
런타임(Runtime)이란?
애플리케이션을 관리하기 위해서 특정한 컴파일러나 가상머신이 사용하는 기본 코드 라이브러리 또는 애플리케이션이 실행되고 있는 동안의 동작을 말합니다.
런타임 환경(Runtime Enviroment)이란?
프로세스나 애플리케이션을 위한 서비스를 제공하는 가상머신의 상태를 말합니다. 운영체제 자체에 속하는 경우도 있으며, 운영체제 위에서 돌아가는 경우도 있습니다.
안드로이드 런타임(Android Rumtime)이란?
안드로이드 런타임은 흔히 ART 로 이야기하며, 런타임 환경으로 부르는 것이 조금 더 정확합니다. ART의 주요기능은 다음과 같습니다.
- ART의 주요기능
- AOT(Ahead Of Time)나 JIT(Just In Time) 컴파일
- 최적화된 가비지 수집 CG
- 전용 샘플링 프로파일러, 상세 진단 예외 및 크래시 보고, watchpoint를 생성하여 특정 필드를 모니터링 할수 있는 기능을 포함한 디버깅 기능 지원
이 부분이 이해가 잘 안되거나 무엇인지 궁금할 것이라고 생각됩니다. 안드로이드 런타임에 대해서 세부적으로 알아보기 위해서는 기본적으로 자바라는 언어의 구동환경에 대해서 이야기 할 필요성이 있습니다.
일반적인 컴파일러 언어는 CPU와 플랫폼 환경에 맞추어 기계어로 컴파일됩니다. 즉 간단하게 말하자면 우리가 이야기 하는 것을 하드웨어가 알아들을 수 있또록 번역하여 저장한다는 뜻입니다. 하지만 자바는 한 종류의 CPU와 플랫폼 환경에 맞추어서 저장되는 것이 아니라 바이트코드로 저장되며, 이를 실행하기 위해서는 자바가상머신(JVM : Java Virtual Machine)이 필요로 합니다. 이는 자바의 목표가 하나의 바이트코드로 여러가지 CPU와 플랫폼 환경에서 구동되기 위해서입니다. 즉 CPU와 플랫폼 환경에 맞는 가상머신이 있다면 하나의 실행파일가지고 여러가지 환경에서 사용 할 수 있다는 것입니다.
안드로이드도 기본 언어를 JAVA를 사용하기 때문에 VM은 필수적입니다. 이에 자바가상머신(JVM)을 사용 할 수 있지만 오라클과의 라이센스 문제 해결과 JVM이 안드로이드의 구조에 맞추어서 구동할 수 있도록 만들어진 것이 달빅VM(Dalvik VM)과 ART입니다. 이 둘의 차이는 JIT컴파일러(달빅 VM)을 사용하느냐 AOT컴파일러(ART)를 사용하는가로 나누어지며 이에 따라서 동작하는 형태도 다릅니다.
JIT(Just In Time) 같은 경우 안드로이드 2.2부터 달빅VM에 추가되었으며, 이전까지는 애플리케이션이 구동되면 실시간으로 CPU에 맞추어 자바코드를 변환하였습니다. 하지만 JIT가 도입되고 난 뒤로는 최초 앱 실행시 자바코드가 일정부분 한꺼번에 변환, RAM 상에 올려두고 작업하게 됩니다. 이를 통해서 성능적 향상은 엄청난 차이가 보일정도로 이루어졌지만 여러가지 문제점이 나타났습니다.
- JIT(Just In Time)의 문제점
- JIT컴파일러가 돌아가는 동안에 하드웨어의 부하가 크게 발생, 배터리 소모가 심각해졌으며 동작중인 화면이 많을수록 배퍼리 소모량은 더 커졌습니다.
- 애플리케이션 실행시, 실행부분 전체를 RAM에 상주시켜야하며, 각 앱이 다른 OS보다 더 많은 RAM을 사용합니다.
이러한 부분을 해결하기 위해서 AOT컴파일러를 기반으로 만들어진 것이 ART입니다. AOT(Ahead Of Time)는 JIT과 달리 애플리케이션 설치시 한 번에 컴파일하여 바이트코드로 변환해두고 있다가 프로그램 실생히 변환된 코드를 읽어들이는 형태입니다. 이를 바탕으로 ART는 JIT를 사용하는 달빅VM에 비해서 압도적으로 성능개선이 이루어졌습니다. 미리 컴파일 해놓는덕에 JAVA 애플리케이션으로의 문제점이 많이 개선되었으며, 네이티브 언어와 동급의 성능을 체검하게 되었습니다. 하지만 ART에도 분명한 단점이 있습니다.
- ART 의 문제점
- 애플리케이션 설치 공간이 달빅 VM에 비해서 약 1.5 ~ 2배 정도 더 필요로 합니다.
- 애플리케이션 설치 시간이 더 느립니다.
이러한 문제는 ART의 태생적 한계입니다. JIT는 매번 필요한 부분에 대해서 컴파일하는 반면 ART는 설치와 동시에 모든 컴파일 작업을 완료해두기 때문에 발생합니다. 안드로이드 7.0 부터는 앱 설치시간을 단축하기 위해서 최초 설치시에는 JIT를 사용, 충전중이거나 기기를 사용하지 않을때, 즉 대기모드 상태일때 일부분 컴파일 작업을 실시하여 점진적으로 AOT방식으로 바꾸어 나가도록 되어있습니다. 즉 달빅VM과 ART의 장점을 합치고 단점을 해결하려는 시도가 이루어졌습니다.
번외 1. ART는 네이티브인가요?
ART를 사용하는 경우 앱이 가상머신 위에서 작동하지 않아 네이티브라고 생각 할 수 있지만, 조금 애매한 부분입니다. 기존 달빅 VM같은 경우 DEX파일을 가상머신 위에 올려두고 필요에 따라 실시간으로 컴파일 하는 형태라면, ART를 사용하는 경우 최초 1회 DEX2OAT툴을 이용하여 DEX파일을 OAT파일로 미리 컴파일 해두고 있습니다. OAT파일 안에는 DEX파일을 컴파일 한 NAVTIVE MACHINE CODE를 담고 있으며, 가상머신을 거치지 않고 실행되어 네이티브로 볼 수 있지만, 달빅VM에서 실행하는 것과 논리적으로 동일한 결과물을 제공하기 위해서 OAT에 저장된 NATIVE MACHINE CODE 안에는 가상머신 상태를 흉내낸 부가적인 코드도 있습니다. 즉 ART는 앱이 가상머신 위에서 사용되지 않지만, 그렇다고 가상머신으로부터 자유롭지도 않은 형태입니다.
번외 2. 데이터를 삭제했는데 느려지는 경우
간혹 데이터를 삭제했는데, 느린 애플리케이션이거나 설치시 오래 걸리는 애플리케이션이 있다면, 이 경우 ART컴파일 과정 중 부하가 많이 걸리는 애플리케이션으로 볼 수 있습니다.