안드로이드 실행환경

2018. 10. 19. 16:03Android

반응형

안드로이드는 리눅스 커널 위에 탑재되어 있는 DVM(Dalvik Virtual Machine)이라는 안드로이드 런타임에서 동작합니다. DVM에서 동작하는 안드로이드는 각각의 영역으로 구분되어 있는 주요 컴포넌트가 존재합니다.


드로이드 런타임(Android Runtime)

안드로이드 런타임은 자바를 기반으로 동작하지만 JVM(Java Virtual Machine)을 그대로 사용하지 않고 DVM(Dalvik Virtual Machine)을 사용합니다.

DVM은 자바로 작성된 소스 코드(.java)를 자바 컴파일러를 통해 클래스 파일(.class)로 변환시킵니다. 그리고 클래스 파일은 DX 컴파일러를 통해 Dalvik 바이트 코드로 변환됩니다.

즉, 자바 소스 코드가 실행파일(.dex, Dalvik Executable)과 최적화된 실행파일(.odex, Optimized Dalvik Executable)로 저장되며 이 파일들은 안드로이드 기기에서 실행됩니다.

안드로이드 4.4(KitKat) 이전에는 Dalvik을 기반으로 동작했지만 4.4 버전 부터 ART(Android Run Time)이 새롭게 도입되었습니다. 이 후 안드로이드 5.0(Lollipop)부터는 ART를 기반으로 동작하도록 변경되었습니다.

ART(Android Run Time)은 아래와 같은 장점을 가지며 하위 호환성을 위해 Dalvik과 동일한 바이트 코드를 사용합니다.

- AOT(Ahead-of-time) 컴파일

- 가비지컬렉션 기능 향상

- 디버깅 지원 기능 향상

Dalvik은 앱을 실행 할 때마다 바이트 코드를 머신 코드로 변경하는 JIT(Just-in-time) 컴파일 방식을 사용합니다. JIT 컴파일 방식은 바이트 코드를 머신 코드로 변경하는 과정에서 추가적인 메모리를 필요로 합니다.

AOT(Ahead-of-time) 방식은 앱이 실행될 때 코드를 변환하지 않고 앱이 설치될 때 DEX 바이트 코드를 머신 코드로 변환합니다. 이 방식은 설치 시간이 길어지는 단점이 있지만 실행 시간은 짧아지는 장점이 있습니다.


리눅스 커널(Linux Kernel)

안드로이드는 리눅스 커널 3.0.1(안드로이드 4.0)을 기반으로 보안, 메모리 관리, 프로세스 관리, 네트워크 스택과 같은 각종 드라이버를 제공합니다.

AOT(Ahead of Time) - 실행 시간 이전에 이루어지는 컴파일 방식이며 (실행시점이 아닌 설치시점에 미리 이루어진다는 뜻),

컴파일 타임에 중간언어로 번역한 다음 가상 머신 코드(중간 언어)를 최종 기계어로 번역한다.


JIT(Just In Time) - 실행 시간 이전에 컴파일 한 내용을 미리 가상 머신 코드(중간 언어)로 저장해놓고

                        컴포넌트 사용시 (매번 실행시 마다)에 가상 머신 코드를 최종 기계어로 바꾸어 명령어가 실행되도록 한다.

JIT 컴파일러의 경우 바이트코드를 재실행하는 경우 네이티브 코드를 다시 사용한다.

이 NativeCode의 단위는 class단위가 아니고 method단위이다.

JIT 컴파일러는 byte코드를 최적화한다.


AOT 컴파일러의 경우

- JIT와 동일하게 ByteCode->NativeCode로 컴파일한다. 

- 다른점은, 하나의 JVM에서만 사용할 수 있는게 아니라,여러 JVM에서 사용할 수 있다는 것이다.

- AOT Compiler는 생성한 AOT code를 Shared Cache에 저장한다. 그러면 이 Shared cache를 사용하는 JVM은 기동 시 AOT Code를 바로 사용할 수 있게 되어 기동시간이 줄어드는 이점이 있다


반응형

'Android' 카테고리의 다른 글

BarCode, QRCode&Scan  (0) 2018.11.06
NFC  (0) 2018.10.22
가로 막대 프로그레스바  (0) 2018.10.15
MD5, SHA1, SHA256  (0) 2018.10.03
BCrypt 암호화  (0) 2018.10.03