안드로이드 OS 구조를 알아보기 앞서 먼저 안드로이드 개념에 대해 간단히 살펴보겠습니다.
안드로이드(Android)란?
안드로이드(영어: Android)는 다양한 기기와 폼 팩터에 사용할 수 있도록 제작된 Linux 기반의 오픈 소스 소프트웨어 스택입니다. 안드로이드는 리눅스 커널 위에서 동작하며, 자바와 코틀린으로 앱을 만들어 동작합니다. 또한 다양한 안드로이드 시스템 구성 요소에서 사용되는 C/C++ 라이브러리들을 포함하고 있습니다. 안드로이드는 기존의 자바 가상 머신과는 다른 가상 머신인 안드로이드 런타임을 통해 자바와 코틀린으로 작성된 응용 프로그램을 별도의 프로세스에서 실행하는 구조로 되어 있습니다.
이제 본격적으로 안드로이드 OS 구조에 대해 알아보겠습니다!
안드로이드는 어떤 구조로 동작할까?
안드로이드 구조를 그림으로 먼저 살펴보겠습니다.
안드로이드는 위 이미지와 같이 총 5개의 계층으로 이루어져 있습니다.
1. 리눅스 커널 계층
2. 하드웨어 추상화(HAL) 계층
3. 네이티브 C/C++ 라이브러리, 안드로이드 런타임 계층
4. 자바 API 프레임워크 계층
5. 애플리케이션 계층
리눅스 커널 계층
안드로이드 구조에서 최하단에 위치한 계층으로 시스템 전체의 중심 역할을 합니다.
안드로이드 OS는 리눅스 기반으로 설계됐기 때문에 커널도 리눅스로 이루어져 있습니다.
커널(Kernel)이란?
'Kernel'은 영어사전에서 '알맹이', '핵심'이라는 뜻을 가지고 있습니다. 단어의 뜻에서 유츄해 볼 수 있듯이 커널은 운영체제(Linux, MacOS, Windows 등)의 핵심부로 컴퓨터 자원(CPU, 메모리, 파일 등)들을 관리하는 역할을 수행합니다.
쉽게 말해서 운영체제 안에서 비서 역할을 한다고 생각하면 됩니다.
커널에서 담당하는 일은 다음과 같습니다.
- 하드웨어 추상화
- 메모리 관리
- 보안 설정
- 전원관리
- 다른 하드웨어 장치의 드라이버 관리 (카메라, 블루투스, 오디오 등)
- 네트워크 시스템 관리
하드웨어 추상화(HAL) 계층
HAL이란 Hardware Abstraction Layer의 약자로서, 컴퓨터 하드웨어와 소프트웨어 사이의 추상화 계층입니다. HAL에서는 추상화 개념을 사용하는데, 여기서 추상화는 복잡한 문제나 시스템을 간결하고 이해하기 쉽게 만드는 과정이라고 할 수 있습니다.
하드웨어는 '010101...' 같은 기계어나 어셈블리어 같은 저급 언어를 사용합니다. 소프트웨어에서 하드웨어에 직접 접근하는 방식은 매우 복잡하며, 수많은 종류의 하드웨어를 일일이 인식하기에는 어려움이 있습니다. 이러한 점을 해결하기 위해 복잡한 내부를 감추고 일관성 있는 인터페이스를 제공해 주는 것이 HAL입니다. HAL은 하드웨어 부품에 따라 해야 할 복잡한 과정을 일관성 있고 간략한 인터페이스로 제공하기 위해 같은 종류의 하드웨어를 공통 모듈로 묶습니다. 카메라 모듈, 블루투스 모듈 등 여러 라이브러리 모듈 형태로 이루어져 있습니다.
하드웨어에 액세스하기 위해 호출을 수행하면 Android 시스템이 필요한 모듈을 HAL 계층에서 로드합니다.
네이티브 C/C++ 라이브러리, 안드로이드 런타임 계층
네이티브 C/C++ 라이브러리
Low 한 레벨에서 동작하는 라이브러리입니다. 런타임(ART) 및 하드웨어 추상화(HAL) 등의 많은 핵심 안드로이드 시스템 구성요소와 서비스는 C/C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드 기반으로 빌드 됩니다.
안드로이드는 Java 프레임워크 API를 제공하여 이러한 일부 네이티브 라이브러리의 기능을 앱에 노출합니다. 예를 들어, Android 프레임워크의 Java OpenGL API를 통해 OpenGL ES에 액세스하여 앱에서 2D 및 3D 그래픽을 그리고 조작할 수 있는 지원 기능을 추가할 수 있습니다. 그 외에도 다음과 같은 오픈 소스 라이브러리를 포함하고 있습니다.
* SGL : 2D 그래픽 담당
* Open GL ES : 2D/3D 그래픽 담당
* Free Type : 폰트 렌더링
* WebKit : 웹 브라우저 엔진
* libc : 시스템 C 라이브러리
* SQLite : 모바일을 위한 경량화된 데이터 베이스
* SSL : Secure Socket Layer 프로토콜
C 또는 C++ 코드가 필요한 앱을 개발하는 경우에는 Android NDK를 사용하여 네이티브 코드에서 직접 이러한 몇몇 네이티브 플랫폼 라이브러리에 액세스할 수 있습니다.
안드로이드 런타임(ART) 계층
런타임 계층이란 앱 코드를 운영체제에서 동작할 수 있도록 컴파일 하는 계층입니다.
안드로이드 런타임(ART)을 이해하기 전 먼저 자바의 JVM 개념에 대해 알아야 합니다.
JVM(Java Virtual Machine)을 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'입니다. 일반적으로 사람이 작성한 프로그램 코드는 OS 환경에 맞춰 CPU가 알아들을 수 있도록 기계어로 컴파일 하는 과정이 필요합니다. 자바는 OS에 종속적이지 않다는 특징이 있는데, 이때 OS에 종속 받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터가 바로 JVM입니다. 자바는 Java 코드를 Java Compiler를 통해 JVM이 인식할 수 있도록 바이트코드(bytecode)로 변환합니다. JVM은 변환된 바이트코드 파일(.class)을 OS가 인식할 수 있는 역할을 합니다. 그래서 바이트코드는 JVM 위에서 OS 상관없이 실행될 수 있는 것입니다.
안드로이드의 런타임
안드로이드도 자바 언어를 사용하기 때문에 JVM이 필요하지만, JVM은 라이선스 문제와 모바일에 사용하기에는 성능 문제가 있어서 초기 구글에서는 DVM((Dalvik Virtual Machine)을 따로 개발해서 안드로이드에 넣었습니다. DVM은 JIT(Just-In-Time) 방식을 사용합니다. JIT는 바이트코드를 기계어로 번역해 캐시에 저장해두었다가 다시 실행하는 경우 캐시에서 내용을 불러오기 때문에 기존 방식에서 퍼포먼스가 개선되었지만 별도의 메모리 캐시가 필요하다는 점이 단점이 있습니다.
안드로이드 5.0 롤리팝부터는 DVM을 폐지하고 ART를 새로운 런타임으로 완전히 대체했습니다. ART는 AOT( Ahead-Of-Time) 방식을 사용합니다. AOT는 JIT와 달리 앱이 설치되는 시점에 전체 바이트 코드를 기계어로 번역합니다. 그렇기 때문에 설치 시간이 오래 걸린다는 단점이 있지만, 런타임에서 바이트 코드를 해설하는 시간을 제거했기 때문에 전체적인 속도와 배터리 수명이 향샹되었습니다.
JIT vs AOT
두 방식에 대해 상대적으로 비교하면 다음과 같습니다.
JIT(Just In Time) | AOT(Ahead-Of-Time) |
앱 실행 시 컴파일 | 앱 설치 시 컴파일 |
앱 설치속도 빠름 | 앱 설치속도 느림 |
앱 실행속도 느림 | 앱 실행속도 빠름 |
배터리 수명 짧음 | 배터리 수명 김 |
앱 설치공간 작게 필요 | 앱 설치공간 크게 필요 |
안드로이드 7.0(Nougat 또는 N)부터는 AOT, JIT 컴파일, 프로필 기반 컴파일을 조합하여 사용합니다. JIT 컴파일러는 ART의 현재 AOT(ahead-of-time) 컴파일러를 보완하고 런타임 성능을 개선하며 저장 공간을 절약하고 애플리케이션 및 시스템 업데이트를 가속화합니다.
자바 API 프레임워크 계층
안드로이드는 Java 언어로 작성된 API 프레임워크를 통해 액세스 할 수 있습니다. 애플리케이션을 개발할 때 필요한 기능들을 이곳에 접근하여 사용할 수 있습니다. 프레임워크 API에는 다음이 포함됩니다.
Activity Manager - 앱 수명 주기 관리, 스택 관리
Content Provider - 앱 데이터 액세스 및 공유 담당
Telephony Manager - 앱 음성통화 관리
Location Manager - 앱 위치정보 관리
Resource Manager - 앱 리소스 관리
Notification Manager - 앱 알림 관리
Package Manager : 앱 패키지 정보 관리
Window Manager - 앱이 화면에 내용을 표시하는 Window에 접근할 수 있도록 지원
View System: 앱 View 기능 지원
애플리케이션 계층
안드로이드 최상위 계층이며, 안드로이드 기기를 사용하는 사용자가 직접적으로 상호작용하는 계층입니다. 개발자가 앱을 개발한 다음 배포하여 설치하는 APK가 해당 애플리케이션 계층에 속하게 됩니다.
'Study' 카테고리의 다른 글
안드로이드 권장 아키텍처 (0) | 2022.07.26 |
---|---|
디자인 패턴 (2) | 2022.07.21 |
안드로이드 APK 구조 (0) | 2022.07.06 |
구글 안드로이드 역사 (0) | 2022.06.29 |
댓글