Android booting Process/Sequence (안드로이드 부팅 과정)

안드로이드 부팅과정을 정리해 보았습니다.

 

Step 1. Power On and System Startup (Boot ROM)

시스템에 전원이 공급되면 Boot ROM 코드가 시작된다. Root ROM Code의 주요 기능은 Boot Loader를 RAM에 적재하는 것이다.

 

Setp 2. Boot Loader

Boot Loader는 안드로이드 구동 전 시작하는 작은 프로그램이며, 안드로이드와는 별개의 프로그램이다.

Boot Loader는 두개의 스테이지로 나뉘어져 있다.

  1. First Stage
    1. External RAM을 찾고 난 뒤, Second Stage를 위한 프로그램을 External RAM에 적재한다.
  2. Second Stage
    1. Network, memory 등 커널 구동을 위한 설정 작업을 한다.
    2. 또한 커널을 특별한 목적으로 구동시키기 위한 설정값 입력도 Boot Loader가 제공할 수 있다.

 

Boot Loader는 다양한 종류가 있는데, 필자는 Linux Embedded System에서는 uBoot(Universal Boot Loader)를, Android System에서는 LK Boot(Little Kernel based Android Boot Loader)를 사용해 봤다. Boot Loader는 다양한 종류가 있으며 그 용도가 각기 다르다.

현재 자신이 사용하고 있는 Android의 Boot Loader 관련 정보는 아래 위치에서 확인할 수 있다.

  • <android source>/bootable/bootloader/legacy/usbloader

 

일반 Boot Loader의 핵심 파일은 다음과 같다.

  1. Init.s
    • Stack 초기화, BSS 영역 초기화
    • main.c의 call_main() 함수 호출
  2. Main.c
    • 하드웨어 초기화 (clocks, board, keyboard, console) 등의 작업

 

Setp 3. Kernel

Android Kernel은 일반 데스크탑 Linux와 비슷한 일을 수행한다.

  • Cache 설정
  • memory 보호
  • 스케쥴링(scheduling)
  • 드라이버 로드 등..

System Setup 완료 후 Android Kernel은 Init을 찾고, root process나 System의 first process를 런칭하여 init process를 실행시킨다.

 

 

기존 Kernel에 비해 Android Kernel에서 추가된 특성은 다음과 같다.

  • Alarm manager
    • It lets user space tell the kernel when it would like to wake up.
  • Low Memory Killer (OOM handling)
    • It kills processes as available memory becomes low.
  • Ashmem
    • Android 공유 메모리
    • POSIX SHM과 비슷하지만, simpler file-based API로 지원
  • Binder
    • Android의 interprocess communication mechanism
    • remote method invocation 시스템
  • pmem
    • 프로세스 메모리 할당자
    • user space와 kernel drivers 사이의 연속적인 실제 공유 메모리 영역을 관리: large (1-16+ MB) physically contigous regions of memory shared.
  • Power Management (wakelocks)
    • It is used for power management files. It holds the machine awake on a per-event basis until wakelock is released.
  • logger
    • 커널 기능 중 logcat 지원
  • 기타
    •  RAM_CONSOLE: Allows to save kernel printk messages to a buffer in RAM, so that after a kernel panic they can be viewed in the next kernel invocation.
    • USB gadget driver for ADB
    • yaffs2 flash filesystem

 

Setp 4. Init Process

Init process는 가장 최초에 실행되는 process이며, root process 혹은 할아버지 프로세스(grandfather of all processes) 라고도 부른다.

Init process의 핵심 기능은 다음과 같다.

  1. 모든 폴더 Mount
    • /sys, /dev, /proc, …
  2. init.rc 스크립트 실행
    • 각 device 초기화
    • framework 동작에 필요한 각 daemon, context manager, media server, zygote 등을 실행

 

관련 코드의 위치는 다음과 같다.

  1. Init Process
    • <android source>/system/core/init
  2. init.rc
    • <android source>/system/core/rootdir/init.rc
  3. readme.txt
    • <andorid source>/system/core/init/readme.txt

안드로이드 init.rc는 “Android Init Language“라는 독자적인 문법을 가지고 있다.

 

Setp 5. Zygote and Dalvik

Android에서는 기존 Java 대비 속도 향상을 위해 Zygote와 Dalvik 이라는 기법을 사용하고 있다.

Zygote은 Android에서 Application을 빠르게 실행시키기 위하여 미리 fork 되어있는 Process이다. 즉, Zygote은 시스템이 시작할 때 여러개가 자동으로 만들어지고, 그 pool이 관리된다.

자바는 각 Application마다 독립된 메모리 공간을 JVM(Java Vertual Machine)에 할당받으며, Application이 실행되는 시점에 할당는다. Android에서는 최소한의 libraries만 탑재하고 있는 process인 Zygote을 미리 여러개 만들어두고, Application 실행 시 Zygote를 통해 Application을 실행하는 구조이다.

 

Zygote 로딩 프로세스는 다음과 같다.

  1. Load Zygote Init class
    • <android source>/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  2. registerZygoteSocket()
    • It registers a server socket for zygote command connections.
  3. preloadClasses()
    • Is a simple text file that contains a list of classes that need to be preloaded, you can find the file at <android source>/framework/base
  4. preloadResources()
    • Everything that is included in the android.R file will be loaded with this method (themes and layouts).

 

Dalvik VM은 Register-Based Architecture이다.  Java VM은 Stack-Based Architecture이다.

Java VM에서는 값의 처리를 stack를 통해 진행한다. 그래서 다양한 길이의 parameter를 처리할 수 있지만 RAM에 접근해야 하기 때문에 속도가 느린 단점이 있다.

Dalvik VM은 값의 처리를 4개의 Register를 통해 진행한다. 그래서 32bit 인덱싱만 가능하지만, Register에 직접 접근하기 때문에 처리 속도가 빠르다.

 

Android 구조

여기서 잠깐 Android의 구조에 대해 짚고 넘어가자

안드로이드는 크게 4개의 영역으로 나뉘어져 있다.

  1. Linux Kernel
    • 기존 리눅스 커널을 기본으로 하여 모바일 특성에 맞게 몇개의 특징을 더하고 빼고 했다. 하지만 기본 구조 및 핵심 기능은 동일하다.
  2. Hardware Abstraction Layer(HAL)
    • C/C++ Base Code이다.
    • 하트웨어 추상화 계층이다.
    • 기존에는 하드웨어 드라이버를 하드웨어 제작사가 만들었지만, HAL로 인해 하드웨어의 상위 driver와 하위 native driver를 서로 독립적으로 개발 가능해졌다. 이를 위해 표준화된 API가 정의되었다.
  3. Libraries
  4. Application Framework & Applications
    • Java Base Code이다.
    • OOP 지향적으로 작성할 수 있다.

 

Android Application은 기본적으로 Java 기반으로 작성된다. 하지만 하위 Library 및 HAL 계층은 C/C++ 기반이다. 그래서 Java와 C/C++ 사이의 정보 교환을 위해 JNI(Java Native Interface)가 도입되었다. JNI는 Native Code(C/C++)를 Java VM에서 사용하기 위한 규격이며, JVM 및 Dalvik VM이 지원한다.

 

Setp 6. System Service

Zygote가 System Service를 런칭시킨다. System Service는 Android를 지원하는 다양한 기능들을 수행한다.

System Service의 목록은 다음과 같다.

  1. Core Services
    1. Starting Power Manager
    2. Creating Activity Manager
    3. Starting Telephony Registry
    4. Starting Package Manager
    5. Set Activity Manager Service as System Process
    6. Starting Context Manager
    7. Starting System Context Providers
    8. Starting Battery Service
    9. Starting Alarm Manager
    10. Starting Sensor Service
    11. Starting Window Manager
    12. Starting Bluetooth Service
    13. Starting Mount Service
  2. Other Services
    1. Starting Status Bar Service
    2. Starting Hardware Service
    3. Starting NetStat Service
    4. Starting Connectivity Service
    5. Starting Notification Manager
    6. Starting DeviceStorageMonitor Service
    7. Starting Location Manager
    8. Starting Search Service
    9. Starting Clipboard Service
    10. Starting Checkin Service
    11. Starting Wallpaper Service
    12. Starting Audio Service
    13. Starting HeadsetObserver
    14. Starting AdbSettingsObserver

 

위 과정을 마치면 Android System이 정상 동작한다.

 


ref.

https://community.nxp.com/docs/DOC-102546

http://www.kpbird.com/2012/11/in-depth-android-boot-sequence-process.html

http://maca.egloos.com/5383289#comment_5383289

http://yotteum.tistory.com/1

http://bulldozer121.tistory.com/18