안드로이드의 부팅과정은 리눅스를 Base 진행한다.

기본적으로 가장 먼저 power 가들어오면 리눅스 kernel 동작하게 된다. 그리고 리눅스와 마찬가지로 kernel 조상 프로세스격인 init process 생성한다.

 

1. init 프로세스

Linux Kernel 통해 init process 실행되면 init process 아래와 같은 동작을 진행한다.

init 프로세스의 동작은 AOSP 정의되어 있으며 해당 init process 동작을 정의하는 main code

system/core/init/init.c 경로에 존재한다.

 

init 프로세스의 메인 역할은 위와 같다.

 

1) 부팅에 필요한 디바이스 드라이버 마운트

 

기본적으로 /dev 부팅에 필요한 장치들을 mount하는 역할을 진행한다.

init process 정적(콜드플러그), 동적 디바이스 생성( 플러그) 모두 지원하며 리눅스 kernel 2.6 version이후 udev 도움을 받아 device 메이저 마이너 번호 등록을 진행한다.(2.6이후 udev 인해 자동으로 device 번호 할당 등록을 진행한다)

안드로이드는 /dev 등의 디렉터리를 init 통해 생성하며 프로그램 종료시 삭제하기 때문에 init 생성을 진행할 directory 권한 등을을 설정한다.(소스 코드에 참조된 값으로 설정) 결과적으로 부팅된 안드로이드 경로 권한을 수정해도 재부팅하면 디렉터리가 삭제 재생성 되기때문에 내가 바꾼 권한설정이 적용되지 않는다.

 

추가적으로 안드로이드에서 플러그 등의 동작을 진행하기위해 poll 이벤트(polling아님..) 이용한다.

poll 이벤트란 fd값을 셋팅하면 해당 fd 주의깊게 보고있다가 이벤트 발생 알려주며 정해진 동작을 수행하도록 하는 시스템이다. 사용자는 해당 어떤 이벤트가 발생되었고 이를 어떻게 처리했는지 확인할 있도록 poll event 지원한다.

(/system/core/init/ueventd.c 파일이 hot plug 방식을 지원하는 소스 코드인데 여기서 poll event 통해 이벤트가 들어온 경우 handler 통해 동적으로 device 등록을 진행한다)

 

2) 자식 프로세스 종료

해당 기능은 안드로이드의 최상 루트 proces init process 리눅스와 마찬가지로 여러 프로세스 부모 process 자식 process보다 먼저 kill되어 남은 좀비 process 제거하기 위한 역할을 말한다.

 

3) 커널 로그 기록

init process 커널로그를 기록하기 위해 kmsg 파일을 생성하고 write 함수를 통해 커널 로그를 기록한다.(부팅 과정의 로그들을 기록)

해당 로그는 리눅스와 마찬가지로 dmesg 명령어를 통해 확인이 가능하다.

 

4) 프로퍼티 서비스

android에서는 크게 java, system 종류의 property 존재하며 adb shell getprop 통해 android 직접적인 연관된 데이터(시스템 프로퍼티) 가져올 있다. 여기서 이야기하는 프로퍼티는 android.os.proerty이다.

 

추가적으로 ro.xxxxxx 같이 ro. 붙은 프로퍼티는 1 쓰기가가능한 프로퍼티 입니다.( 써지면 다시 없음)

해당 프로퍼티는 android shared memory 이용한다. 일정 영역을 지정한 해당 부분에 공유메모리형태로 메모리를 관리하며 프로퍼티 값들을 셋팅한다. 이렇게 진행하면 어느 프로세서에서든 android shared memory 통해 프로퍼티 값을 얻어올 있다.(물론 wrtie init process 가능하기 때문에 값을 변경하는 경우 init process에게 요청하는 방식을 채택한다)

 

 

5) init.rc

안드로이드 부팅 환경설정, 시스템 셋팅 등의 작업을 진행하며 실제 zygote, media 등의 안드로이드 관련 파일들을 실행하는 init 바로 init.rc 말하는 것이다.

 

init.rc 기본적으로 rc 문법을 적용하여 action, service, command, trigger 이루어져있으며 작성된 문법에 맞게 service 등을 실행한다.

기본적으로 환경변수 등을 셋업하며 console, abdb, servicemanager, zygote, keystore, hcid, bootsound, media 등의 서비스를 실행한다.

daemon, zygote, Runtime 안드로이드 고유의 여러 서비스를 동작시키는 곳은 init.rc라고 생각하면된다.

물론 해당 내용은 모두 init.rc 소스코드 내에 rc 문법으로 정의되어 있다.

 

이렇게 실행된 여러 서비스들이 APK 동작시킬 환경을 구축하고 해당 환경위에서 APK 생성되고 실행됨으로써 안드로이드 OS 동작하게 된다.

+ Recent posts