24년 3월 기준으로 작성되었습니다.
1. 안드로이드 아키텍처 개요
안드로이드는 소프트웨어 스택(Software stack)의 구조를 갖고 있으며,
이 구조는 애플리케이션, 운영체제, 런타임 환경, 미들웨어, 서비스, 라이브러리로 구성된다.
스택은 각 레이어, 각 레이어 내의 해당 요소들은 긴밀하게 통합되어 있어, 모바일 기기를 위한 최적의 애플리케이션 개발 및 실행 환경을 제공한다.
1-1. 리눅스 커널
안드로이드 소프트웨어 스택의 맨 아래에 위치한 리눅스 커널(Linux Kernel)은 기기 하드웨어 및 안드로이드 소프트웨어 스택 상위 계층 사이의 추상화 레벨을 제공한다.
커널은 선점형 멀티태스킹(Preemptive Multitasking) 및 저레벨 코어 시스템 서비스를 제공하는데, 여기에는 메모리, 프로세스, 전원관리 등이 포함된다.
또한 네트워크 스택과 하드웨어를 위한 기기 드라이버를 제공하는데, 여기에는 기기 디스플레이, 와이파이, 오디오 등이 포함된다.
안드로이드는 다양한 리눅스 배포판 중에서 리눅스 커널만 이용한다는 점을 알아두어야 한다.
즉, 리눅스 커널은 원래 데스크톱 및 서버 형태의 컴퓨터에서 이용하기 위해서 개발되었다는 점에 주목할 필요가 있다.
안드로이드 소프트웨어 스택의 핵심에서 리눅스를 찾을 수 있다는 것은 -> 오늘날의 모바일 기기 성능과 리눅스 커널의 효율성 및 성능을 입증하는 증거이다.
1-2. 안드로이드 런타임
안드로이드 스튜디오 안에서 안드로이드 앱을 빌드하면, 중간 바이트코드 형식(DEX 형식)으로 컴파일 된다.
이후 기기에 애플리케이션이 로드되면, 안드로이드 런타임(Android Runtime, ART)은 AOT(Ahead-Of-Time) 컴파일이라고 불리는 프로세스를 통해, 바이트코드를 기기의 프로세스가 요청하는 기본 명령으로 변환한다.
이 형식을 실행 및 연결 가능한 형식(Executable and Linkable Format, ELF)이라 부른다.
이후 애플리케이션이 실행될 때마다, ELF 실행 버전이 실행되어 성능이 빨라지고 배터리 수명이 향상된다.
이는 애플리케이션을 실행할 때마다, 가상 머신(Virtual Machine, VM) 안에서 바이트코드를 변환했던,
이전 안드로이드 구현에서의 JIT(Just-In-Time) 컴파일 방식과 대조된다.
1-3. 라이브러리
표준 자바 개발 라이브러리 집합(문자열 처리, 네트워킹, 파일 조작과 같은 범용 작업에 대한 지원 제공) 외에도 안드로이드 라이브러리들이 포함된다. 이들은 안드로이드 개발에 특화된 자바 및 코틀린 기반 라이브러리의 집합이다.
여기에 속하는 라이브러리에는 사용자 인터페이스 구축, 그래픽 표현, 데이터베이스 접근 지원, 애플리케이션 프레임워크 라이브러리 등이 있다.
이런 자바 기반 외에도, 안드로이드 런타임 코어 라이브러리는 실제 작업을 많이 수행하지 않으며, 실제로 C/C++ 기반 라이브러리 집합을 둘러싼 자바 '래퍼(Wrapper)' 라는 점에 유의해야 한다.
실제로 전형적인 안드로이드 개발자는 자바 기반의 안드로이드 코어 라이브러리 API를 통해서만 이 라이브러리에 접근하게 될 것이다. 이런 라이브러리에 직접 접근할 때는 안드로이드 네이티브 개발 키트(Native Development Kit, NDK)를 이용해야 한다. 이 키트는 자바 네이티브 인터페이스(Java Native Interface, JNI) 를 이용해, 비자바 또는 비코틀린 프로그래밍 언어의 네이티브 메서드를 호출하기 위한 것이다.
1-4. 애플리케이션 프레임워크 (Application Framework)
안드로이드 애플리케이션 실행 및 관리 환경을 전체적으로 구성하는 서비스의 집합이다.
이 프레임워크는 안드로이드 애플리케이션을 재사용도 가능하고, 교체 가능한 요소들로 구성한다는 개념을 구현한다.
이 개념은 한 단계 더 발전된 것으로, 애플리케이션과 그 기능을 데이터와 함께 게시(Publish)함으로써, 다른 애플리케이션에서의 검색과 재사용을 허용한다.
1) 액티비티 관리자 (Activity Manager) : 애플리케이션 수명 주기 및 활동 스택의 모든 모든 측면을 제어한다.
2) 콘텐츠 프로바이더 (Content Providers) : 애플리케이션이 다른 애플리케이션에 데이터를 게시하고, 공유할 수 있도록 한다.
3) 리소스 관리자 (Resource Manager) : 문자열, 색상 설정, UI 레이아웃 등 비(非)코드 내장 리소스에 관한 접근을 허용한다.
4) 알림 관리자 (Notifications Manager) : 애플리케이션이 사용자에게 경고 및 알림을 표시하도록 허용한다.
5) 뷰 시스템(View System) : 애플리케이션 UI를 만드는 데 이용되는, 확장 가능한 뷰의 집합이다.
6) 패키지 관리자 (Package Manager) : 애플리케이션이 현재 기기에 설치된 다른 애플리케이션에 관한 정보를 찾을 수 있도록 하는 시스템이다.
7) 전화 통신 관리자 (Telephony Manager) : 애플리케이션에 전화 통신 서비스에 관한 정보(상태 및 가입자 정보)를 제공한다.
8) 위치 관리자 (Location Manager) : 애플리케이션이 위치 변경에 관한 업데이트를 받을 수 있도록, 위치 서비스에 관한 접근을 제공한다.
1-5. 정리
안드로이드는 "소프트웨어 스택 아키텍처" 형태로 구현되어 있으며, 리눅스 커널 / 런타임 환경 및 해당 라이브러리 / 애플리케이션 프레임워크 / 애플리케이션 일체를 포함한다.
애플리케이션은 주로 자바나 코틀린으로 작성되며, 빌드 환경 내에서 바이트코드 형식으로 컴파일 된다.
이후 애플리케이션을 기기에 설치하면, 안드로이드 런타임이 이 바이트코드를 CPU에서 이용하는 기본 형식으로 컴파일 한다.
안드로이드 아키텍처의 핵심 목표는 -> "애플리케이션 실행" 및 "애플리케이션 디자인에서의 재사용 구현" 모두에 있어 성능과 효율성을 향상하는 것이다.
'안드로이드 > 도서 내용 정리' 카테고리의 다른 글
내용 정리 Part. 2 - [SNS 앱을 만들면서 배우는 안드로이드 클라이언트 개발] (0) | 2024.04.09 |
---|---|
내용 정리 Part. 1 - [SNS 앱을 만들면서 배우는 안드로이드 클라이언트 개발] (0) | 2024.04.03 |
[2023년 11월 기준] 직접 해보면서 참고/추가 설명 - [Joyce의 안드로이드 앱 프로그래밍] (0) | 2023.12.15 |