Android Platform Architecture overview

Android platform architecture overview

1. 개요

Android Platform Architecture

이번 시간은 안드로이드의 구조에 대해서 알아보고 애플리케이션이 어떻게 구동되는지 추론해보는 시간을 가져보겠습니다.

제목은 안드로이드 플랫폼 아키텍쳐라고 정했습니다.

여기서 플랫폼은 컴퓨터 시스템의 기본이 되는 특정 프로세서 모델과 하나의 컴퓨터 시스템을 바탕으로 하는 운영체제를 뜻하며

아키텍쳐란 소프트웨어의 구성요소 사이의 관계, 시스템에 대한 구조의 집합이라고 보시면 되겠습니다.

Android Platform Architecture

안드로이드 플랫폼 아키텍쳐를 크게 나누어 보면, 리눅스 커널/ 하드웨어 추상화계층 / 네이티브 라이브러리 / 안드로이드 런타임 / 안드로이드 프레임워크/ 애플리케이션으로 나누어져 있습니다.

이들이 어떠한 역할을 하는지 한번 살펴보겠습니다.

2. Linux Kernel

Android Platform Architecture

안드로이드는 리눅스 커널을 기반으로 하고 있는 리눅스 계열 OS 입니다.

요기서 커널이란 하드웨어와 우리가 사용하고 있는 OS를 연결시켜주는 다리와 같은 존재로 운영체제에 있어서 핵심이기도 합니다.

커널이 담당하고 있는 것으로는 크게 5가지가 있습니다.

* 첫번째는 보안으로 하드웨어와 프로세서의 보안을 담당합니다.

* 두번째는 자원관리로서 한정된 시스템 자원을 효율적으로 관리, 프로그램의 실행을 원만하게 합니다.

프로세스 처리를 관리하는 스케쥴링을 관리하고 오랫동안 사용되지 않았고 우선순위가 높지 않은 컴포넌트를 구동하는 프로세스들을 제거하는 로우 메모리 킬러를 실행합니다.

* 세번째는 추상화입니다. 이는 뒤에서 하드웨어 추상화때 더 자세히 이야기 하겠습니다.

간단히 설명하자면 같은 종류의 부품으로 수 많은 종류의 하드웨어를 설계할 수 있기 때문에 하드웨어에 직접 접근하는 것은 다소 복잡하게 될 수 있습니다.

일반적으로 커널은 운영체제의 복잡한 내부를 감추고 일관성 있는 인터페이스를 하드웨어에 제공하기 위해 같은 종류의 하드웨어에 대한 공통 명령어 집합인 추상화들로 이루어집니다.





* 네번째는 하드웨어 드라이버입니다.

Android Platform Architecture

카메라, 블루투스등 각종 하드웨어를 제어하는데 필요로하는 명령어 모음인 드라이버들을 포한하고 있습니다.





* 마지막으로 전원 관리입니다.

Android Platform Architecture

전력을 끄거나 비활성화 하는 등 wifi / Bluetooth / cpu / gpu등 하드웨어에 공급되는 전력에 대해서 관리합니다.

기본적으로 리눅스의 전원 관리가 많이 사용되는 곳은 노트북입니다.

노트북에서의 절전 모드는 시스템의 상태는 램에 보존 되지만 다른 하드웨어 부품들은 모두 정지됩니다.

이런 전원 관리는 노트북에는 어울리지만 스마트폰등 모바일 기계에서는 어울리지 않습니다.

그래서 안드로이드는 변형된 전원 관리를 사용해 사용자가 명령해야 절전 모드로 가는 대신 안드로이드화된 커널은 가능한 자주 그리고 빨리 절전 모드로 전환합니다.

만약 앱이 중요한 작업중이거나 사용자의 입력을 기다리고 있으면 절전모드로 전환되지 않게 하려고 웨어크락이 시스템을 계속 깨웁니다. (앱에서 명시적으로 사용 가능)





* 안드로이드화된 리눅스 커널에서 중요한 개념중 하나는 바인더 입니다.

Android Platform Architecture

바인더의 핵심 컨셉은 모든 프로세스가 공유할 수 있는 영역에 요청 내용과 응답 내용을 쓰고, 각 프로세스가 그 메모리 주소를 참조하게 하자입니다.

IPC(inter Process Communication) 도구이지만 안드로이드에서는 다른 프로세스에 있는 함수를 마치 현재 프로세스에 존재하는 함수 처럼 사용할 수 있게 해주는 RPC(Remote Procedure Call)을 지원하는데 주로 이용합니다.

3. 하드웨어 추상화 계층

Android Platform Architecture

하드웨어 추상화는 커널에서 잠시 설명했던 것 처럼, 같은 종류의 부품으로 다양하게 많은 종류의 하드웨어를 설계 할 수 있어

직접 하드웨어에 접근하는 형태는 다소 복잡하게 될 수 있습니다.

이점을 해결하고 복잡한 내부 구조를 감추고 일관성 있는 인터페이스를 제공하기 위해,

같은 종류의 하드웨어에 대한 공통 명령어 집합으로 묶어 둡니다. 이를 하드웨어 추상화라 하며,

프로그래머가 여러 장비에서 개발하는 것을 도와줍니다.

하드웨어 추상화 계층은 장비 제조사의 장비 규격에 대한 특정한 명령어를 제공하는 소프트웨어 드라이버에 의존합니다.

Android Platform Architecture

HAL(하드웨어 추상화 계층)은 상위 수준의 Java API 프레임워크에 기기 하드웨어 기능을 노출하는 표준 인터페이스를 제공합니다.

HAL은 여러 라이브러리 모듈로 구성되어 있으며, 카메라 또는 블루투스 모듈과 같은 특정 유형의 하드웨어 구성 요소를 위한 인터페이스를 구현합니다.

프레임워크 API가 기기 하드웨어에 액세스하기 위해 호출을 수행하면 Android 시스템이 해당 하드웨어 구성 요소에 대한 라이브러리 모듈을 로드합니다. AOSP(Android open source project)

4. 안드로이드 런타임

Android Platform Architecture

안드로이드 런타임은 흔히 ART로도 이야기하며, ART의 주요 기능은 화면과 같습니다.
Android Platform Architecture

안드로이드 런타임에 대해서 세부적으로 알아보기 위해서는 기본적으로 자바라는 언어의 구동환경에 대해서 이야기 할 필요성이 있습니다.

Android Platform Architecture

일반적으로 컴파일러 언어는 CPU와 플랫폼 환경에 맞추어 기계어로 컴파일 됩니다.

즉 간단하게 말하자면 우리가 이야기 하는 것을 하드웨어가 알아들을 수 있도록 번역하여 저장한다는 뜻입니다.

하지만 자바는 한종류의 CPU와 플랫폼 환경에 맞추어 저장되는 것이 아니라 바이트 코드로 저장되며,

이를 실행하기 위해서는 자바가상머신(JVM, Java Virture Machine)이 필요로 합니다.

이는 자바의 목표가 하나의 바이트 코드로 여러가지 CPU와 플랫폼 환경에서 구동되기 위해서 입니다.

즉 CPU와 플랫폼 환경에 맞는 가상머신이 있다면 하나의 실행파일을가지고 여러가지 환경에서 사용할 수 있다는 뜻입니다.

안드로이드도 기본언어를 JAVA를 사용하기 때문에 VM은 필수적입니다.

이에 자바가상머신을 사용할 수 있지만 오라클과의 라이선스 문제 해결과 JVM이 안드로이드의 구조에 맞추어서 구동할 수 있도록 만들어진 것이 달빅VM과 ART입니다.

이 둘의 차이는 JIT 컴파일러(달빅)을 사용하느냐 AOT컴파일러(ART)를 사용하는가로 나누어 집니다.

둘의 차이는 간단히 말해서 실시간으로 CPU에 맞추어 자바코드로 변환하느냐(달빅) / 앱설치와 최초 앱 실행시 자바코드가 일정부분 한꺼번에 변환, RAM상에 올려두고 작업을 하게 되는가 입니다.

JIT는 컴파일러가 돌아가는 동안 하드웨어 부하가 크게 발생하여 배터리 소모가 심한 단점이 있었습니다.

AOT는 애플리케이션 설치 공간이 달빅에 비해 1.5~2배 이상 더필요하고 애플리케이션 설치 시간이 더 느린 단점이 있습니다.

현재는 AOT를 사용하기 때문에 애플리케이션 설치시 오래 걸리는 애플리케이션이 있다면 ART 컴파일 과정 중 부하가 많이 걸리는 애플리케이션으로 볼 수 있습니다.

5. 네이티브 라이브러리

Android Platform Architecture


ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스가 C 및 C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드를 기반으로 빌드되었습니다.

Android 플랫폼은 Java 프레임워크 API를 제공하여 이러한 일부 네이티브 라이브러리의 기능을 앱에 노출합니다.

예를 들어, Android 프레임워크의 Java OpenGL API를 통해 OpenGL ES에 액세스하여 앱에서 2D 및 3D 그래픽을 그리고 조작할 수 있는 지원 기능을 추가할 수 있습니다.
(OpenGL ES (임베디드 시스템을 위한 OpenGL)는 크로노스 그룹이 정의한 3차원 컴퓨터 그래픽스 API인 OpenGL의 서브셋으로, 휴대전화, PDA 등과 같은 임베디드 시스템을 위한 API이다.)

C 또는 C++ 코드가 필요한 앱을 개발하는 경우에는 Android NDK(Native Development Kit)를 사용하여 네이티브 코드에서 직접 이러한 몇몇 네이티브 플랫폼 라이브러리에 액세스할 수 있습니다.

6. 안드로이드 프레임 워크

Android Platform Architecture

안드로이드 프레임 워크는 JAVA API 프레임 워크를 말합니다.

안드로이드 OS의 전체기능은 JAVA로 작성된 API를 통해서 접근이 가능합니다.

이 API의 핵심 시스템 구성요소 모듈과 서비스 재사용을 단순화하여 안드로이드 애플리케이션을 제작하는데 필요로 하는 빌딩 블록을 구성합니다.

  • 뷰 시스템 - 목록, 그리드, 텍스트 상자, 버튼 및 삽입 가능한 웹 브라우저를 포함하여 앱의 UI를 빌드하는 데 사용 가능

  • Resource Manager - 현지화된 문자열, 그래픽 및 레이아웃 파일과 같은 코드가 아닌 리소스에 대한 액세스 제공

  • Notification Manager - 모든 앱이 상태 표시줄에 사용자 지정 알림을 표시할 수 있도록 지원

  • Activity Manager - 앱의 수명 주기를 관리하고 공통 탐색 백 스택 제공

  • 콘텐츠 제공자 - 앱이 주소록 앱과 같은 다른 앱의 데이터에 액세스하거나 자신의 데이터를 공유할 수 있도록 지원

7. 애플리케이션

Android Platform Architecture

여기서 말하는 애플리케이션은 시스템 애플리케이션을 말합니다.

안드로이드는 이메일 / SMS 메시지 / 캘린더 / 인터넷 브라우저 / 주소록등 주요 애플리케이션 세트와 함께 제공됩니다.

Android Platform Architecture


Android Platform Architecture

플랫폼에 기본적으로 포함된 앱은 사용자가 선택하여 설치하는 애플리케이션과 특별한 구분이 없기 때문에 설정등 일부 애플리케이션을 제외하면 사용자가 설치한 다른 애플리케이션이 기본 애플리케이션으로 지정 가능합니다.

시스템 애플리케이션은 사용자가 직접 사용하는 앱으로도 동작하기도 하지만, 개발자가 자신의 앱에서 접근할 수 있는 주요 기능을 제공하기 위한 용도로도 사용됩니다.

예를 들어서 SMS메세지 애플리케이션 같은 경우 개발자가 해당 기능을 직접 만들 필요 없이, 시스템 앱에 내장된 SMS 메시지 애플리케이션을 호출, 데이터를 주고 받아 지정한 사람에게 메시지를 전달할 수 있습니다.

8. 애플리케이션의 구동

Android Platform Architecture

이번에는 공부한 아키텍쳐 구조를 토대로 카메라가 어떻게 구현되는지 추론해 보겠습니다.

Android Platform Architecture

사용자가 애플리 케이션을 실행시키면 안드로이드 런타임 위에서 컴파일 된 코드들이 동작할 것입니다.

JAVA API와 네이티브 라이브러리는 이에 포함되어 있습니다.

그리고 HAL과 커널안의 드라이버를 이용하여 카메라 하드웨어 모듈이 동작할 것이고
사용자가 촬영하고 있는 내용을 이미지 센서를 통해서 받아올 것입니다.

이를 다시 JAVA API와 네이티브 라이브러리를 이용해서 사용자에게 결과값을 보내줄 것입니다.

그리고 사용자가 이미지를 저장한다면 다시 해당 이미지의 데이터를 메모리에 저장하는 작업을 진행하게 될 것입니다.

공유하기