본문 바로가기

개발 공부 정리

안드로이드 앱은 어떻게 실행될까? - 안드로이드 부팅

안드로이드 앱 개발을 할 때 마다 궁금한게 있었습니다. 안드로이드 앱이 실행되고 부터는 제가 개발한 코드가 돌아가는걸 알고 있는데 사용자가 앱 아이콘을 클릭한 시점부터 안드로이드 앱이 동작하기 까지 어떠한 과정을 거쳐서 제가 짠 코드가 돌아가게 되는걸까요? 제가 개발하는 건 안드로이드에 있는 수많은 앱들 중 하나인데 이 많은 앱들을 실행시키는 이 안드로이드는 도대체 어떻게 만들어져 있는걸까요? 이러한 궁금증들이 계속 있었고 이번에 기회에 생겨 안드로이드 OS 가 부팅되는 시점부터 앱이 실행되어 내가 짠 코드에 진입하는 순간까지를 안드로이드 프레임워크 관점에서 공부해보기로 마음먹었습니다.

 

안드로이드 앱은 어떻게 실행될까?

(1) 안드로이드 프레임워크 : preludez.tistory.com/8

(2) 안드로이드 부팅 : 현재 글

 

 


 

 

전 시간에는 안드로이드 프레임워크의 기본 구성과 각 요소별로 어떠한 역할을 하는지 간략하게 공부해 보았습니다. 이번 시간에는 전에 공부한 기본 구성요소들을 바탕으로 안드로이드의 부팅 과정에 대해 공부해 보겠습니다.

 

 

 

 

안드로이드 부팅 프로세스

 

 

 

이처럼 안드로이드 기기의 전원버튼을 누르면 위와 같은 과정들을 거쳐 기기가 켜지게 됩니다. 지금부터 안드로이드 부팅 과정을 각 단계별로 설명해보겠습니다.

 

Step 0 : 전원 버튼 눌러 시스템 시작

전원 버튼을 누르게 되면 Boot ROM 은 미리 지정된 코드를 통해 BootLoader 를 램에 올려 실행을 시작합니다. BootLoader 는 커널을 디바이스로 불러오는 역할을 하는 프로그램인데 커널을 실행하기 위해 필요한 보드나 프로세서, 시계, 키패드, 네트워크, 메모리 등등을 셋업하는 역할을 합니다. 

 

Step 1 : 리눅스 커널

안드로이드는 리눅스 기반의 플랫폼입니다. 위의 BootLoader 를 통해 리눅스 커널이 부팅되면 일반적인 리눅스 부팅처럼 커널 초기화 작업을 거칩니다. 메모리, 캐시 등을 셋업하고 스케쥴링하는 작업을 하고 드라이버도 로딩합니다. 커널이 이러한 시스템 셋업 과정들을 끝내고 부팅을 완료하면 마지막으로 시스템 파일 중에서 "init" 파일을 찾아 root process 또는 시스템의 첫 프로세스로 지정된 것을 실행합니다. 

 

Step 2 : init

init 프로세스는 모든 프로세스의 조상이라 부를 수 있는 root process, 즉, 가장 최초의 프로세스입니다.

 

init 프로세스는 각종 디바이스를 초기화하는 작업을 비롯해서 안드로이드 프레임워크 동작에 필요한 각종 데몬, 컨텍스트 매니저 (Context Manager), 미디어 서버(Meia Server), Zygote 등을 실행하는 역할을 합니다.

 

다음은 init 프로세스가 실행하는 데몬 프로세스들 입니다. 

 

  • USB 데몬(usbd): USB 연결 관리
  • 안드로이드 디버그 브리지 데몬(adbd): 안드로이드 디버그 브리지(ADB) 연결 관리
  • 디버거 데몬(debuggerd): 디버그 시스템 시작
  • 무선 인터페이스 레이어 데몬(rild): 무선 통신 연결 관리

이 단계에서 우리는 기기 전원을 킬 때 처음으로 보이는 화면인 안드로이드 로고를 볼 수 있습니다.

 

 

부팅 시 보이는 안드로이드 로고

 

Step 3 : Context Manager

Context Manager 는 안드로이드의 System Service 를 관리하는 중요한 프로세스입니다.

 

System Service 는 안드로이드 프레임워크를 구성하는 중요한 컴포넌트로서 카메라, 오디오, 비디오 처리에서부터 각종 애플리케이션 제작에 필요한 중요 API 를 제공하는 등의 역할을 수행합니다. 

 

안드로이드 내에서 동작하는 각종 System Service 에 대한 정보는 Context Manager 로부터 얻을 수 있습니다. 따라서 System Service 를 이용하고자 하는 애플리케이션이나 프레임워크의 내부 모듈은 이를 서비스 매니저에게 요청해야 합니다. 요청 후에는 바인더(Binder)라는 안드로이드의 자체적인 IPC(Inter-process communication) 메커니즘을 통해 System Service 를 이용할 수 있습니다. 이를 위해서는 안드로이드의 모든 System Service 는 부팅시 자신의 핸들 정보를 컨텍스트 매니저에 등록해야 하며, 이러한 서비스 등록 과정에서도 프로세스 간 통신을 수행하기 위해 바인더 IPC가 이용됩니다.

 

Step 4 : Media Server

Media Server 프로세스는 안드로이드에서 Audio Flinger(오디오 출력을 담당)나 Camera 서비스와 같이 C/C++ 기반으로 작성돼 있는 네이티브 시스템 서비스를 실행하는 역할을 합니다.

 

Step 5 : Zygote 초기화

Zygote 는 '분할 전의 세포나 수정란', 개체가 생성되기 이전의 불완전한 상태이란 뜻으로 안드로이드 어플리케이션의 로딩 시간을 단축하기 위해 고안된 프로세스입니다. 모든 자바 기반 안드로이드 어플리케이션은 Zygote 를 통해 포크(fork)된 프로세스 상에서 동작합니다.

 

  • 안드로이드 애플리케이션은 자바로 작성돼 있어 리눅스 상에서 네이티브 프로세스로 실행될 수 없으며 Darvik Virtual Machine(OS 5.0부터 ART)에서 동작합니다.
  • 각 안드로이드 어플리케이션은 독립적인 VM(Virtual Machine) 위에서 동작하는데, 실행될 때마다 자신이 동작할 VM 을 초기화하고 실행하는 과정에는 많은 시간이 소요되며 어플리케이션의 실행을 느리게 하는 요인이 됐습니다.
  • 때문에 안드로이드 Zygote 프로세스는 어플리케이션이 실행되기 전에 실행된 VM 의 코드 및 메모리 정보를 공유함으로써 어플리케이션이 실행되는 시간을 단축시킬 수 있게 됐습니다.
  • 여기에 더해 Zygote 는 안드로이드 프레임워크에서 동작하는 어플리케이션이 사용할 core library classes 와 자원을 미리 메모리에 로딩해 두고 이러한 자원에 대한 연결 정보를 구성합니다. 보통 이러한 Core clasees 는 read-only 이고 Android SDK 나 Core frameworks 의 일부분입니다. 그래서 새로 실행되는 안드로이드 어플리케이션은 필요한 자원들에 대한 연결정보를 매번 새롭게 구성하지 않고 그대로 사용하기 때문에 빠르게 실행할 수 있습니다.

위와 같이 Zygote 는 Virtual Machine 을 구동한 이후, Virtual Machine Instance 를 생성해 System Server 라는 자바 서비스를 실행합니다. 

 

Step 6 : System Server

System Server 는 Zygote 에서 최초로 포크되어 실행되는 안드로이드 어플리케이션 프로세스입니다.

 

처음에 System Server Audio Flinger 와 Surface Flinger 라는 네이티브 서비스를 실행합니다. 필요한 네이티브 서비스가 실행되고 나면 System Server 는 안드로이드 프레임워크 서비스들을 시작합니다. 이 때 시작되는 서비스로는 안드로이드 어플리케이션의 Activity 를 관리하는 Activity Manager. 어플리케이션을 설치하거나 관리하는 Package Manager, 단말기의 위치 정보를 제공하는 Location Manager 등이 있습니다.

 

그런데 System Server 에서 실행하는 자바 시스템 서비스도 안드로이드 어플리케이션이나 프레임워크 내부 모듈에서 개발자가 사용할 수 있게 하기 위해서는 Context Manager 에 등록되어 있어야 합니다.그래서 바인더 IPC 를 통해 자바 시스템 서비스를 C언어 기반의 서비스 매니저에 등록하려면 자바와 C언어 간의 인터페이스 역할을 하는 JNI(Java Native Interface) 를 추가로 사용해야 합니다.

 

 

 

 

 

 

 

지금까지 안드로이드 부팅 과정에 대해 간략히 알아보았습니다. 공부하고 정리할수록 부분부분 더 깊게 공부해야 이해되는 내용들이 나오네요. 하나씩 차근차근 정리해 나가야 할 것 같습니다. 다음 시간에는 Zygote 에 대해 좀더 깊이 알아보고 Zygote 를 통해 어떻게 안드로이드 앱이 시작되는지 알아보겠습니다.

 

 

 

 

 

 

 

[레퍼런스]

 

Android Boot Sequence / Process

A blog for Java and Android interview question and answers.

madhusudhanrc.blogspot.com

 

안드로이드 - Init 프로세스

- 리눅스와 마찬가지로 안드로이드에서는 커널 부팅이 완료되면 최초의 사용자 프로세스인 init 프로세스를 실행 한다.  리눅스의 프로세스들은 서로 정보를 교환하기 위해 메시지를 주고 받는

dev-ahn.tistory.com