본문 바로가기
IT 이야기/Android

Android System booting 순서

by KaySeo 2024. 6. 20.
반응형

안드로이드 시스템의 부팅 과정은 리눅스 커널을 기반으로 하지만, 안드로이드 고유의 초기화 과정과 서비스 관리가 추가됩니다. 안드로이드의 init 프로세스는 리눅스의 init 프로세스와 유사하지만, 안드로이드에 특화된 설정과 스크립트를 사용합니다. 그럼 안드로이드 시스템에서의 부팅 순서를 자세히 살펴보겠습니다.


1. 부트로더 (Bootloader)

부트로더는 안드로이드 디바이스가 켜질 때 가장 먼저 실행되는 소프트웨어입니다.
부트로더는 하드웨어 초기화 및 설정을 수행하고, 커널과 램디스크(initramfs)를 메모리에 로드하고나서, 커널의 시작 지점으로 제어를 넘깁니다.

2. 커널 초기화

커널이 메모리에 로드되면, 커널의 초기화 코드가 실행됩니다.
CPU, 메모리, 인터럽트, 타이머 등의 하드웨어 초기화가 수행되고, 커널에서 가상 메모리 시스템을 설정한 뒤에 페이지 테이블을 구성합니다.
또한 초기 램디스크(initramfs)를 마운트하여, 루트 파일 시스템을 준비합니다.

3. init 프로세스 실행

커널 초기화가 완료되면, 커널은 init 프로세스를 실행합니다. 안드로이드에서는 /system/bin/init 바이너리가 실행되며, init 바이너리는 /init.rc와 같은 초기화 스크립트를 읽어들입니다.

init 바이너리의 위치는 아래 명령어를 이용하여 확인할 수 있습니다:

adb shell> which init
/system/bin/init


4. init.rc 스크립트 처리

안드로이드의 init 프로세스는 /init.rc 파일을 읽어 시스템 초기화를 수행합니다. 이 파일은 안드로이드 시스템의 초기화와 서비스 관리를 정의하는 스크립트입니다.
/init.rc 파일은 여러 가지 설정과 명령을 포함하고 있으며, 다음과 같은 주요 섹션으로 구성됩니다:

참고로 Android Init Language는 /android/system/core/init/README.md 에 자세히 설명되어 있습니다.

on boot: 부팅 시 실행할 명령을 정의합니다.
service: 시작할 서비스와 데몬을 정의합니다.
import: 다른 초기화 스크립트를 포함합니다.

5. 기본 설정 및 초기화

init 프로세스는 /init.rc 파일의 on boot 섹션에 정의된 명령을 실행하여 기본 설정을 수행합니다.

참고로 안드로이드의 init.rc는 /system/core/rootdir/init.rc 에 위치하고 있습니다.
예를 들어, 파일 시스템을 마운트하고, 기본 디바이스 노드를 생성하며, 시스템 속성을 설정합니다.
또한 on boot 섹션은 다음과 같은 명령을 포함할 수 있습니다:

on boot
    mount rootfs rootfs / ro remount
    mkdir /dev 0755 root root
    mkdir /proc 0755 root root
    mkdir /sys 0755 root root
    mount tmpfs tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755
    mount proc proc /proc proc rw,relatime
    mount sysfs sysfs /sys sysfs rw,seclabel,relatime


6. 서비스 시작

init 프로세스는 /init.rc 파일의 service 섹션에 정의된 서비스를 시작합니다.
각 서비스는 이름, 실행할 명령, 실행 조건 등을 정의합니다.
예를 들어, zygote 서비스는 안드로이드의 애플리케이션 런타임 환경을 초기화하는 중요한 서비스로 아래와 같이 실행됩니다.

...
import /system/etc/init/hw/init.${ro.zygote}.rc
...
 service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    socket usap_pool_primary stream 660 root system
    onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
    onrestart write /sys/power/state on
    # NOTE: If the wakelock name here is changed, then also
    # update it in SystemSuspend.cpp
    onrestart write /sys/power/wake_lock zygote_kwl
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart --only-if-running media.tuner
    onrestart restart netd
    onrestart restart wificond
    task_profiles ProcessCapacityHigh MaxPerformance
    critical window=${zygote.critical_window.minute:-off} target=zygote-fatal


7. 추가 초기화 스크립트 처리

init 프로세스는 /init.rc 파일의 import 명령을 사용하여 다른 초기화 스크립트를 포함합니다.
예를 들어, 아래와 같이 특정 하드웨어에 대한 설정을 포함하는 스크립트를 불러올 수 있습니다:

import /init.${ro.hardware}.rc


8. 런타임 환경 초기화

init 프로세스는 안드로이드 런타임 환경을 초기화합니다. 여기에는 zygote와 system_server 프로세스가 포함됩니다.
Zygote: Zygote는 안드로이드 애플리케이션 프로세스의 부모 프로세스로, 새로운 애플리케이션 프로세스를 생성하는 역할을 합니다.
System Server: System Server는 안드로이드 시스템 서비스(예: Activity Manager, Window Manager 등)를 관리하는 중요한 프로세스입니다.

9. User Space 초기화 완료

init 프로세스는 모든 초기화 작업과 서비스 시작을 완료하면, 시스템은 User Space에서 정상적으로 동작할 준비가 됩니다.
안드로이드 시스템은 이제 User Interface를 표시하고, 사용자가 디바이스를 사용할 수 있는 상태가 됩니다.

요약
안드로이드 시스템의 부팅 과정에서 init 프로세스는 매우 중요한 역할을 합니다. init 프로세스는 /init.rc 스크립트를 읽어 시스템 초기화와 서비스 관리를 수행하며, 안드로이드 런타임 환경을 설정합니다. 이를 통해 안드로이드 디바이스는 정상적으로 부팅되고, 사용자가 디바이스를 사용할 수 있는 상태가 됩니다.

반응형