본문 바로가기

CS/[Embedded]Embedded System Software

[Embedded] Android Runtime Walkthrough 안드로이드 실행 과정

android architecture에 대해 다시 보면 다음과 같다.

Application level, Application Framework level, Android Runtime level, Libraries level, Linux kernel level

로 전체적으로 5개의 level로 나뉘어 있음을 확인할 수 있었다.

 

그럼 실제로 android 실행은 어떻게 되는 것일지에 대해 알아보자.

ANDORID BOOTING PROCESS

 

Runtime Walkthrough(init)

안드로이드가 맨 처음 실행되게 되면 대부분의 Linux 기반 시스템과 같이

1. bootloader가 linux kernel에 load가 되고

2. init process가 시작하게 된다.

3. 해당 init process는 linux daemon 들을 시작한다.

4. 또한 init process는 zygote process도 시작한다.

5. 또한 init process는 runtime process를 시작하여 service manager를 초기화할 수 있도록 한다.

Runtime Walkthrough(zygote)

linux kernel이 init process를 시작하고,

init process가 zygote process도 시작하는 것을 확인할 수 있었다.

 

zygote라고 하는 것은 안드로이드에서 가장 먼저 만들어 지는 Process이고, dalvik vm 인스턴스를 initialize 하는 process이다.

java의 다양한 class 들을 loading 하고 들어오는 요청을 리스닝하기 위해 socket을 bind 한다. 요청이 들어오면 새로운 Process를 fork를 통해 띄워 주고 VM instance를 만들어주는 역할을 한다.

zygote를 포함한 모든 앱들은 리눅스의 관점에서 보았을 때 단지 app_process의 일종인 것이다.

zygote 는 copy on write(COW)방식을 이용하여 재사용을 최대화 하고 footprint를 최소화 한다,

 

 

 

creating process과정을 더욱 자세히 보면 다음과 같다.

1. start zygote

2.initialize dalvik VM , execute

3. Load classes, resources 

4. fork

5. Load application, execute

이미 load 시킨 class 와 resource를 사용하기 때문에 속도가 더욱 빨라지게 된다.

 

zygote를 사용하는 이유로는 크게 두가지가 있다.

1. application 시작 시간을 크게 감축

2. 메모리 공유를 최적화

:zygote에서 모든 가상 머신이 fork 되기 때문에 커널에서 수행하는 메모리 공유 기능을 이용할 수 있다.

app_process인스턴스는 자신만의 가상 메모리를 가져도 메모리 대부분은 메모리를 공유한다.

즉, 안드로이드 앱은 암묵적으로 그들의 메모리의 다수를 다른 앱과 공유하는 것이다. 이로 메모리 사용량을 극대화할 수 있다.

 

만약 zygote가 없다면, application 실행시 .apk  dex file 을 돌려주려주어야 하는데 process안에 dex file이 돌아가는 환경 dvm, art가 필요하고, 이외에도 여러 이미지 library도 필요하게 된다. 이러한 것들을 모두 application 실행할 때 마다 setting 하고 loading 하게 되면 시간이 상당히 오래 걸리게 된다.

 

 

Runtime Walkthrough(Runtime Process)

init process는 zygote process를 시작하고 runtime process을 시작한다.

여기서 runtime은 ART DVM을 의미하지 않는다.

 

runtime process는 service manager를 생성한다. 안드로이드에서 gps 기능이나 alarm 기능 같이 기능을 보통 Service라고 하는데, 이러한 모든 서비스를 관리하는 것을 Service Manager라고 한다.

service를 service manager에 등록하고 찾는 형식으로 동작되며, 만약 activity가 어떤 service를 요청했을 때 service manager가 해당 service의  reference를 알려주는 형식으로 동작한다.

 

이러한 service manager를 launching 해주는 것이 바로 runtime process인 것이다.

Runtime Walkthrough(System Server)

service manager가 launch 되고 나면, service manager는 zygote에 system server라는 process를 띄워달라는 요청을 하게 된다.

system server는 native system services를 띄워 주고, java system services도 띄워주게 된다.

이러한 c, java로 작성된 services들을 모두 service manager에 등록하게 되는 과정을 거치게 되는 것이다.

 

 

 

Runtime Walkthrough(Activity Manager)

service 중 하나인 activity manager가 zygote에 main 화면을 그려주는 process(home application)를 띄워주도록 요청한다.

이후 home 화면이 오른쪽 휴대폰 화면 처럼 나타나게 되는 것이다.

 

Runtime Walkthrough(Launch application)

홈 화면 까지 띄웠으니, 이제 application 실행을 해볼 차례다. 

application 아이콘을 클릭 하게 되면 home application에서  startActivity()함수로 service manager에 activity manager을 요청하게 되고, activity manager가 해당 application을 띄울 수 있도록 zygote에 요청하게 된다. 이렇게 새로운 프로세스가 띄워지고 application이 실행되게 되는 것이다.