Android Framework(안드로이드 프레임워크)에 대한 정리

Hudson Park
8 min readAug 21, 2019

--

안드로이드에 대해 계속 공부하고 있지만, 프로젝트나 기능 위주로만 보다 보니 안드로이드 OS처럼 내 안드로이드 지식도 파편화(?)가 되는 것 같다.

그래서 오늘 문득 안드로이드라는 큰 숲을 보고 싶었다.

아래는 오늘 본 등산지도(?)이다

  1. Application의 설치 과정

자바 소스 파일 → .dex 파일 → .apk 파일 → 다운로드 → 인스톨

  • 자바 컴파일러에 의해 컴파일된 자바 소스 파일은 Dalvik Machine(Lolipop 이후는 ART)에 의해 .dex 파일로 변경되어서, 이후 ApkBuilder 에 의해 apk파일로 변경되는 과정을 거친다.
  • 각 어플리케이션은 리눅스 운영체제 상 각기 다른 사용자 아이디를 부여받고, 완벽하게 분리/독립되게 된다.(같은 앱이라도 서로 다른 설정이나 상태일 수 있는 이유)
  • 위 사진의 맨 위 계층부터 리눅스 커널로 깊이 들어가보자.

2. Application Layer

  • 안드로이드에서 기본적으로 제공하는 앱(전화, 문자, 캘린더 등)과 앱스토어에서 다운로드하여 쓰는 일반 앱이 속하는 영역
  • 기본앱의 경우 높은 시스템 우선권을 가지고 있어 Low Memory 상태에도 종료되지 않게 설정되어 있다.

3. Application Framework Layer

  • 실제로 개발자인 우리가 많이 이용하게 되는 부분이다.
  • 개발자를 위한 API를 제공하며, 어플리케이션의 기반이 되는 layer
  • 액티비티 생명주기, 환경 설정의 언어 설정 등 프레임워크 레벨의 기능을 담당한다.

3–1. Activity Manager : 액티비티의 생명주기를 호출, 공통적인 네비게이션 백스택을 제공 (onStart(), onResume(), onCreate(), onStop(), onPause(), onDestroy(), onRestart() 메서드가 호출되는 것을 관리)

3–2. Resource Manager : 문자열, 그래픽, 레이아웃 파일 등 리소스를 찾아주는 역할

3–3. View System : 리스트, 그리드, 텍스트 뷰, 버튼, 웹 뷰 등 뷰들의 집합

3–4. Content Provider : 안드로이드 4대 컴포넌트 중 하나, 어플리케이션이 다른 어플리케이션으로부터 데이터를 엑세스하거나, 자신의 데이터를 공유하는 게 가능하게 함

3–5. Package Manager : 현재 디바이스에 설치된 어플리케이션과 관련된 정보를 가지고 있음

3–6. Notification Manager : 모든 어플리케이션의 상태표시줄에 커스텀 알럿 창을 보여주게 함(FCM 기능 구현시 이용한다.)

3–7. Window Manager : 화면에 대한 정보, 배치 등을 관리하는 시스템 서비스(투명한 액티비티를 만들거나 화면의 크기를 구할 때 쓰임)

3–8. Telephony Manager : 단말기의 상태에 대한 정보를 얻을 수 있는 서비스

3–9. Location Manager : 단말의 위치 값을 지속적으로 얻을 수 있는 서비스(위치 기반 서비스를 만들 때 쓰임)

4. Android Runtime

자바 프로그래밍 언어의 코어 라이브러리의 집합

4–1. Dalvik Virtual Machine : Java/C/C++로 작성된 레지스터 기반의 가상머신, JVM보다 명령이 단순하고 속도가 빠름

  • 하나의 디바이스에서 효율적으로 여러개의 가상머신을 실행할 수 있게 한다.
  • dx를 이용하여 .dex 포맷으로 변경하여, 자바 컴파일러에 의해 컴파일된 클래스를 실행한다.

# Lolipop(API 21) 이후 Dalvik 대신 ART(Android RunTime)이 적용됨

4–2. Core Library : 리눅스 커널을 래핑하거나 추가 기능을 제공하는 역할

  • Binoic 커스텀 C 라이브러리
  • Webkit / SQLite / OpenGL 라이브러리
  • 네이티브 시스템 서비스 Surface Manager, Media Framework

5. Library

5–1. System C library : 임베디드 리눅스 기반 장치에 맞춰진 표준 C 시스템 라이브러리, BSD에서 파생됨

5–2. Media Libraries : PacketVideo의 OpenCORE에 기반하여 대중적인 오디오와 비디오 포맷 뿐만 아니라 정적 이미지 파일(MPEG4, H.264, AAC, AMR, JPG, PNG)을 제공

5–3. Surface Manager : 디스플레이의 서브시스템을 관리하며, 여러 어플리케이션으로부터 나온 2D, 3D 그래픽 레이어를 렉 없이 합성

5–4. LibWebCore : 웹 브라우저를 구현하는 첨단의 웹 브라우저 엔진

5–5. 3D libraries : OpenGL es 1.0 APIs를 기반으로 구현됨, 하드웨어 3D 가속 또는 3D 소프트웨어인 래스터라이저를 사용

5–6. FreeType : 비트맵과 벡터 폰트 렌더링을 담당

5–7. SQLite : 모바일용 관계형 데이터 베이스

6. 리눅스 커널

  • 부팅 시 부트 로더를 통해 리눅스 커널이 먼저 시작되게 된다.
  • 보안, 메모리 관리, 프로세스 관리, 네트워크 스택, 드라이버 모델과 같은 코어 시스템 서비스를 위해서 리눅스 2.6 버전에 의존하는 구조

하드웨어와 나머지 소프트웨어 스택 사이의 추상화 계층으로서 동작하며, 하드웨어가 다르더라도 상위 계층에 균일한 환경을 제공한다.(마치 Java의 JVM과 같은 기능을 수행하는 것 같다. 개인적인 의견이다.)

6–1. Binder IPC

  • 프로세스 간 통신에 사용됨
  • 바인더는 하부 메커니즘인 IPC(Inter Process Communication)와 RPC(Remote Procedure Call)로 나뉨
  • Android의 모든 시스템 기능은 서버 프로세스로 제공되기 때문에 프로세스 사이에 최적화된 통신 방법으로서 고안됨
  • 안드로이드 컴포넌트 중 Service, Content Providers는 이 Binder를 통해 다른 프로세스에 접근할 수 있게 된다.

6–2. Binder Thread

  • 네이티브 스레드 풀, 최대 16개까지 생성이 가능
  • 다른 프로세스에서 Binder IPC 통신을 할 때 이 스레드 풀을 통해 접근하게 된다.

6–3. Init

각종 디바이스를 초기화하는 작업과 안드로이드 프레임워크 동작에 필요한 데몬, 컨텍스트 매니저, 미디어 서버, Zygote 등을 실행하는 역할

6–4. 컨텍스트 매니저

안드로이드 시스템 서비스를 관리하는 프로세스

# 시스템 서비스 : 안드로이드 프레임워크의 중요 컴포넌트, 카메라, 오디오, 비디오 처리에서부터 각종 어플리케이션 제작에 필요한 중요 API를 제공하는 역할을 수행(실제로 이런 기능을 구현할 때 SystemService를 호출하여 구현한다.)

6–5. 미디어 서버

Audio Flinger(오디오 출력 담당)나 Camera 서비스와 같이 C/C++ 기반으로 작성되어 있는 네이티브 시스템 서비스를 실행하는 역할

6–6. Zygote

  • 안드로이드 어플리케이션의 로딩 시간을 단축하기 위한 프로세스
  • 모든 자바 기반 안드로이드 어플리케이션은 Zygote를 통해 포크된 프로세스 상에서 동작

6–7. 시스템 서버

  • Zygote에서 최초로 포크되어 실행되는 안드로이드 어플리케이션 프로세스
  • Activity Manager Service와 Location Manager Service 같은 자바 시스템 서비스를 실행하는 역할

7. 정리

자바 소스 파일 → .dex 파일 → .apk 파일 → 다운로드 → 인스톨

위와 같은 설치 과정을 거친 안드로이드 어플리케이션은 아래의 과정을 거쳐 실행된다고 볼 수 있다.

부트 로더 → 리눅스 커널 → init → 데몬, 컨텍스트매니저, 미디어 서버, Zygote → Zygote → 시스템 서버 → Activity Manager Service → 액티비티 생명주기 발생

Reference

--

--

Hudson Park

stay hungry, stay foolish / cool head and warm heart