1. Init.rc
Zygote에 대한 내용을 분석하기 전에 먼저 Zygote를 실행시키는 init.rc에 관한 내용을 보면
init.rc는 daemon, Zygote, Runtime을 실행하며 여기서 daemon은 init.rc 소스 코드에 정의된 daemon으로 부팅 시점에 바로 실행되는 daemon들이다. 실행하고 싶은 daemon을 등록할 때는 당연히 ini.rc 파일의 수정이 필요하고 이 때 SELinux 정책에 영향을 받게 된다.
그리고 Runtime을 생성하는데 Runtime은 ART, Dalvik을 의미하지 않는다 (얘네는 Zytgote아래에 생성)
여기서 생성되는 것은 Runtime을 통해 Service Manager를 생성한다.
Service Manager는 Context 즉 BInder 기능을 제공하는 Context를 관리하는 것으로 Service Manager실행을 통해 Context BInder과정이 가능하다.
2. Zygote
Dalvik, ART VM을 로드해서 빌드환경을 구축한다.
그리고 System Server를 자식 프로세스로 생성한다. System Server는 System동작을 관할한다. APK에서도 system 동작 수행 시 결국 System Server process로 해당 일을 전달하고 처리는 system server 프로세스가 처리한다. 여기서 system server이 처리하는 동작에 포함되는 내용은 아래와 같다.
1) System Server
Entropy, Power, Activity Manager, Telephony Registry, Package Manager, Battery, Light, Vibrator, Alaram, Window, Bluetooth 등을 처리한다.
물론 위의 서비스들은 모두 Context로 bind 과정을 통해 동작을 제어할 수 있기 때문에 실제적으로 Service Manager와도 연결이 되어있다.
즉 실제적으로 Service Manager와 System Server가 모두 필요한 상황이며 실제 소스코드로 해당 기능을 제어할 때도 아래와 같이
val powerManager = context.getSystemService(Context.POWER_SERVICE) |
context를 이용해서 system service를 bind한 후 제어할 수 있다.
2) APK 동작
위와 같이 이루어진 안드로이드의 내부에서 홈 화면역시 하나의 Activity와 같다.
여기서 Activity를 실행한다는 것은 빌드 및 실행을 한다는 것이고 즉 Dalvik과 ART를 이용해서 실행을 하는 것이다.
즉 홈화면이라는 하나의 Activity를 띄우기위해 device내에서는 실제로 Zygote가 fork를 통해 Dalvick VM을 하나더 생성하고 해당 VM위에서 Home 화면이라는 Activity가 빌드되고 실행 되는 것이다.
마찬가지로 여기서 우리가 임의로 만든 APK등이 동작한다면.?
마찬가지도 이러한 APK 하나하나가 모두 하나의 MainActivity를 가지며 화면 하나하나가 Activity이다.
때문에 Zygote는 fork를 통해서 하나의 VM을 더 만들게 되고 해당 VM 아래에서 APK가 동작하게 된다.
결론적으로 APK를 실행한다는 것은 APK 실행 (app 아이콘 클릭) 명령이 떨어 졌을 때 해당 Context를 System Server에서 Activity Manager를 통해서 생성하고 또한 해당 Activity가 실행 될 수 있는 VM 환경을 Zygote를 통해 fork 후 해당 VM을 활용하여 Apk를 실행할 activity를 구성하여 실행하는 것이다.
부팅이 시작되면 init.rc를 통해 Zygote 과정과 Service Manager를 구축(BInd 과정 구축 및 VM을 생성하여 System Server, Home Activity 등 생성)과 init.rc에 구현된 daemon들의 실행이 진행된다. 일련의 작업들이 마무리되면 우리는 정상적인 home화면(부팅완료된 모습)을 볼 수 있다.
-> 물론 여기서 일종의 daemon은 home activity 구성 후 실행될 수 있다.(처음 부팅 시 home directory 만들어진 직후 폰을 사용하는데 있어 동작시 약간 느린 이유가 바로 이 때문이라 할 수 있다)
'Android > 안드로이드 운영체제' 카테고리의 다른 글
[Android] 안드로이드(6) - Biometric (0) | 2020.11.01 |
---|---|
[Android] 안드로이드(5) - HAL (2) | 2020.10.25 |
[Android] 안드로이드(3) - 부팅 (0) | 2020.10.10 |
[Android] 안드로이드(2) - 런타임 (0) | 2020.10.04 |
[Android] 안드로이드(1) - 구조 (0) | 2020.10.04 |