안드로이드 구조는 아래의 출처에서 확인할 수 있다. 아래의 내용은 출처의 내용을 가져온 것이다.
https://source.android.com/devices/architecture
- 애플리케이션 프레임워크. 애플리케이션 프레임워크는 애플리케이션 개발자가 가장 자주 사용합니다. 하드웨어 개발자는 개발자 API에 대해 알고 있어야 합니다. 이는 다수의 API가 기본적인 HAL 인터페이스에 매핑되고 구현 드라이버에 대한 유용한 정보를 제공할 수 있기 때문입니다.
- 바인더 IPC. 바인더 IPC(프로세스 간 커뮤니케이션) 메커니즘은 애플리케이션 프레임워크에서 경계를 교차 처리하고 Android 시스템 서비스 코드를 호출할 수 있게 해줍니다. 그러면 상위 수준의 프레임워크 API가 Android 시스템 서비스와 상호작용할 수 있습니다. 애플리케이션 프레임워크 수준에서는 이 통신이 개발자로부터 숨겨지며 상황은 '단순하게 돌아가는' 것처럼 보입니다.
- 시스템 서비스. 시스템 서비스는 창 관리자, 검색 서비스 또는 알림 관리자와 같은 집중된 형식의 모듈식 구성요소입니다. 애플리케이션 프레임워크 API에 의해 노출된 기능은 시스템 서비스와 통신하여 기본 하드웨어에 액세스합니다. Android에는 시스템(창 관리자 및 알림 관리자 등)과 미디어(미디어 재생 및 기록 관련 서비스), 이렇게 두 가지 서비스 그룹이 포함됩니다.
- 하드웨어 추상화 레이어(HAL). HAL은 하드웨어 공급업체에서 구현해야 하는 표준 인터페이스를 정의하며, Android는 하위 수준의 드라이버 구현에 대해 구속받지 않아도 됩니다. HAL을 사용하면 상위 수준 시스템을 수정하거나 시스템에 영향을 주지 않고도 기능을 구현할 수 있습니다. HAL 구현은 모듈로 패키징되며 적절한 시점에 Android 시스템에 의해 로드됩니다. 자세한 내용은 하드웨어 추상화 레이어를 참조하세요.
- Linux 커널. 기기 드라이버 개발은 일반적인 Linux 기기 개발과 유사합니다. Android는 Linux 커널의 버전을 사용합니다. 여기에는 Low Memory Killer(메모리를 좀 더 적극적으로 보존하는 메모리 관리 시스템), wake lock(PowerManager 시스템 서비스), 바인더 IPC 드라이버 및 모바일 내장 플랫폼에 중요한 기타 기능과 같은 몇 가지 특별한 추가 기능이 포함되어 있습니다. 이러한 추가 기능은 주로 시스템 기능과 관련이 있으며, 드라이버 개발에는 영향을 미치지 않습니다. 필수 기능(예: 바인더 드라이버)을 지원하는 이상 모든 버전의 커널을 사용할 수 있습니다. 하지만 최신 버전의 Android 커널을 사용하는 것이 좋습니다. 자세한 내용은 커널 빌드를 참조하세요.
위의 내용이 안드로이드의 아키텍처라면 이번에는 안드로이드 플랫폼 구조이다. 내용은 아래에서 얻을 수 있다.
https://developer.android.com/guide/platform?hl=ko
주로 볼곳은 네이티브 C/C++ 라이브러리이다. 이곳의 내용을 가져오면 다음과 같다.
ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스가 C 및 C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드를 기반으로 빌드되었습니다. Android 플랫폼은 Java 프레임워크 API를 제공하여 이러한 일부 네이티브 라이브러리의 기능을 앱에 노출합니다. 예를 들어, Android 프레임워크의 Java OpenGL API를 통해 OpenGL ES에 액세스하여 앱에서 2D 및 3D 그래픽을 그리고 조작할 수 있는 지원 기능을 추가할 수 있습니다.
여기서 주로 알아볼 곳은 시스템 서비스와 Linux 커널이다. 시스템 서비스의 미디어와 Linux 커널에서의 부팅 단계이다.
여기서는 linux 커널의 부팅시작부터 간단하게 살펴본다.
안드로이드 기기를 부팅하면 가장 먼저 시작되는 프로세스를 Init Process 라고 한다.
리눅스상에서 동작하는 모든 프로세스는 init 프로세스에서 생성되어 실행된다. 리눅스 커널이 부팅하고 나면 사용자 영역에서 init 프로세스가 최초로 실행된 다음 시스템 동작에 필요한 다른 프로세스를 순차적으로 실행시킨다. 시스템이 부팅이 완료되 후, init 프로세스는 백그라운드 프로세스로 동작하면서 다른 프로세스를 감시한다.
init process는 먼저 Uevented / Watchdogd을 통해 환경 변수를 설정하고 파일 시스템 및 디렉토리를 생성한 후, 로그 출력을 초기화 한다. 안드로이드 풀 소스 코드의 system/core/init/init.cpp의 main()함수를 분석하면 알 수 있다.
다음으로 프로세스 세션 키를 생성하고 속성 시스템을 초기화한 후 SELinux를 실행하여 보안 컨텍스트와 관련된 작업을 수행한다. 이후, 새 epoll을 만들고 시스템 속성과 관련된 작업을 수행한다.
system/core/init/ 의 각 클래스 cpp 파일을 통해 확인할 수 있다.
마지막으로 init.rc 파일을 구문 분석하고 일부 이벤트 및 action 매니저를 실행하고 main 루프를 통해 action을 순차적으로 수행한다.
init.rc 파일은 init 초기화시 init process에 의해 로드되는 .rc파일로 시스템 초기화에 주로 사용되며 핵심 공급 업체(ODM)에서 제공하는 /init.{ro.hardware}.rc를 가져온다.
init.rc 파일에서 중요한 몇몇 구문들은 아래와 같다.
Reference
https://android.jlelse.eu/android-boot-process-8f7d94ff9889
https://programmer.ink/think/android-8.0-init-process-of-system-startup-process-3.html