study record
[안드로이드] 안드로이드 런타임 본문
런타임
- 프로그램을 관리하기 위해 특정한 컴파일러나 가상 머신이 사용하는 기본 코드의 라이브러리나 프로그램을 가리키는 런타임 라이브러리
- 프로그램이 실행되고 있을 때 존재하는 곳 (JavaScript가 브라우저에서 작동하면 브라우저가 런타임, Node.js 환경에서 구동되면 Node.js가 런타임)
- 프로그램이 실행되는 동안의 시간
+ 런타임 환경: 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태이다.
예시) Javascript 코드를 컴퓨터가 이해할 수 있도록 자연어로 바꿔주는 것을 브라우저 내부의 interpreter와 compiler가 진행한다. 여기서 브라우저가 런타임(런타임 환경)이다.
ART (Android Run Time)
ART는 안드로이드에서 사용되던 기존의 달빅VM의 한계점을 해결하기 위해 구글에서 새로 개발한 런타임(실행환경)이다.
킷캣 버전에서 처음 시작되어 안드로이드 5.0 롤리팝부터는 달빅VM을 완전히 폐지하고 ART를 새로운 런타임으로 완전히 대체하였다.
ART 또한 달빅과 같은 가상머신의 일종이다. 기존 안드로이드는 DEX 파일을 Dalvik 가상머신 위에 올려두고 필요에 따라 실시간으로 컴파일하는 방식이었다. ART를 사용하는 경우는 DEX 파일을 미리 컴파일하여 OAT 파일에 저장해두고 실행 돌리는 것으로 변했을 뿐이다. OAT 파일은 DEX를 컴파일한 native machine code를 담고 있으며, 가상머신을 거치지 않고 바로 실행된다. 하지만 ART를 사용한다고 해도 Dalvik에서 실행하는 것과 논리적으로 동일한 결과물을 제공해야 하기 때문에, OAT에 저장된 native machine code에는 가상머신의 상태를 흉내내기 위한 부가적인 코드들이 잔뜩 들어가게 된다. ART를 사용하는 경우 앱이 가상머신 위에서 작동하지는 않지만 가상머신으로부터 완전히 자유롭지도 않다.
컴파일러
특정 프로그래밍 언어를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램.
컴파일(compile): 원시코드에서 목적코드로 옮기는 과정 (무조건 기계어로 번역할 필요는 없다.)
인터프리터(interpreter): 소스프로그램을 읽어서 즉시 결과를 출력
JIT와 AOT
자바의 경우는 기본적으로 한 가지 CPU의 아키텍쳐나 환경에 맞추는 것이 아닌 바이트코드라는 것으로 컴파일 되며, 이를 실행하기 위해서는 자바 가상 머신이 필요하다. 이렇게 하는 이유는 자바는 바이트코드 하나만으로 여러 가지 아키텍쳐나 플랫폼에서 작동할 수 있도록 하는 것이 목표이기 때문이다. 안드로이드도 Java 언어를 사용하기 때문에 VM이 필수적이다. 이에 자바 가상머신(JVM)을 사용할 수 있지만, JVM은 라이선스 문제가 있어서 구글에서는 Dalvik VM을 따로 개발해서 안드로이드에 넣었다.
JIT 컴파일러는 프로그램 최초 실행시마다 코드를 변환한다. 반면, AOT 컴파일러는 프로그램 최초 실행시가 아닌, 그 이전에(주로 설치시에) 한번에 전체를 변환해 두고 저장한 뒤, 프로그램 실행시 마다 변환된 코드를 읽어들이게 된다.
안드로이드 4.4 킷캣이 실행 중인 안드로이드 기기에서 런타임을 ART로 설정해 놓으면, 앱이 설치 될 때 앱에 들어 있는 중간 언어를 모조리 번역을 미리 해 놓는다. 그 덕분에 기존의 Java 기반 앱 플랫폼으로써의 문제점들은 모두 사라지고, 네이티브 언어와 동급의 성능을 체감할 수 있게 되었다.
AOT 컴파일러도 단점은 있다. 앱을 설치하면 공간을 1.5배에서 2배 가량을 더 많이 차지하고, 설치 속도가 달빅VM보다 더 느리다는 것. 이는 JIT 없는 초창기 달빅 머신은 모든 명령어를 실행 시마다 한줄한줄 인터프리트하고, JIT는 필요한 부분에 한해 실행 시마다 인터프리트하는 반면에 ART의 AOT 컴파일러는 처음 인스톨할 때 필요한 컴파일 작업을 다 해놓기 때문에 생기는 근본적인 한계이다. 또한 킷캣까지의 앱은 런타임을 모두 달빅에 초점을 잡아 개발했기 때문에 ART 환경에서는 안 돌아가는(즉 호환성 문제가 있는) 앱들도 존재한다. 그리고, 킷캣~롤리팝 초기(5.0) 기준으로 ART는 아직 적용 초기 단계인지라 사용자도 구글도 밝혀내지 못한 잠재적인 문제들이 산재해 있을 가능성이 있다. 다만 2017년 시점은 이미 5.1.1을 넘어 마시멜로와 누가, 오레오, 파이를 향해 가고 있는 만큼 이러한 미검증의 문제는 초기에 비해 적어졌다고 할 수 있다.
ART라고 해서 무조건 AOT는 아니다.
참고 블로그:
namu.wiki/w/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%9F%B0%ED%83%80%EC%9E%84
'안드로이드' 카테고리의 다른 글
[안드로이드] 프래그먼트 생명주기(Fragment LifeCycle) (1) | 2021.03.18 |
---|---|
[안드로이드] 액티비티 생명주기(Activity LifeCycle) (0) | 2021.03.16 |
[안드로이드] Android Thread 안드로이드 스레드 (0) | 2021.03.05 |
[안드로이드] 캘린더 팝업 기능 AlertDialog (0) | 2021.02.28 |
[안드로이드] 리스트뷰 즐겨찾기(찜하기) 기능 구현 (5) | 2021.02.28 |