[Android] 1-1. 안드로이드 구조
안드로이드 구조
- 애플리케이션
- 프레임워크
- 런타임
- 네이티브 라이브러리
- 커널
애플리케이션 계층
Androud 구조 스택의 최상위 계층으로써, 사용자와의 상호작용
배포하여 설치하는 APK가 여기에 속함
시스템 애플리케이션
/system 디렉터리에 존재하며 사용자가 제거/변경 불가능
메세지 애플리케이션, 기본 애플리케이션 등이 해당
사용자 애플리케이션
/data 디렉터리에 존재하며 사용자가 제거/변경 가능
각각의 애플리케이션은 샌드박스에 설치되어 영향을 주거나 데이터 통신 불가
각 애플리케이션의 권한을 가진 리소스에만 접근 가능
인스타그램과 같은 일반 애플리케이션 등이 해당
프렘임워크 계층
이 계층부터 JAVA로 작성하며 기본 라이브러리와 안드로이드 런타임을 추상화한 계층
JAVA API 가 존재하며, 안드로이드 OS의 기능은 해당 API를 통해 접근
주요 API
- Active Manager : 애플리케이션 내 Activity들 관리
- Content Manager : 애플리케이션 간 데이터 공유 관리
- Telephony Manager : 음성 통화 관리
- Resource Manager : 위치 정보 관리
- Notification Manager : 애플리케이션에서 사용하는 리소스들 관리
런타임 계층(ART, 구 Dalvik)
안드로이드 전용 JVM(Java Virtual Machine)
JAVA는 컴파일 시 CPU나 플랫폼 환경에 맞는 언어가 아닌 바이트 코드로 컴파일된다.
JAVA는 바이트 코드 하나로 여러가지 플랫폼에서 작동할 수 있게 하는 것이 목표이고,
플랫폼에 맞는 가상 머신만 있다면 하나의 실행 파일로 각종 장치에 쓸 수 있기 때문이다.
따라서, 바이트 코드를 실행하기 위해서는 JVM이 필요하다.
이 JVM은 자바 바이트 코드를 DEX 포맷으로 변환(컴파일)하여 패키징 후 실행
Dalvik - JIT
JIT(Just In Time) : 앱이 실행되는 순간 자주 사용되는 코드를 컴파일
- 실행시간 느림
- JVM 라이선스 문제로 Dalvik VM을 따로 개발
ART - AOT
AOT(Ahead On Time) : 앱 설치 시 모든 코드를 컴파일
- 설치속도는 느리지만 실행속도는 빠름, 배터리 소모 큼
- Android 5.0 부터 사용
- 현재는 Dalvik과 ART를 결합한 JVM을 사용중이다.
네이티브 라이브러리 계층
Android는 상대적으로 작은 주기억장치와 저전력의 CPU에서 동작하기에 이러한 기기에 최적화된 원시코드로 컴파일 된다.
libc, libm 과 같은 네이티브 라이브러리는 특히 메모리 소비가 적기에 안드로이드에 적합한데,
이러한, 네이티브 라이브러리를 제공하는 기능을 하는게 네이티브 라이브러리 계층이다.
C/C++로 작성되어 있다.
라이브러리
- SGL : 2D 그래픽 담당
- Open GL ES : 2D/3D 그래픽 담당
- Free Type : 폰트 렌더링
- Seface : Surface 결합을 담당
- Webkit : 웹 브라우저 엔진
- SQLite : 경량 DB 엔진
- SSL : Secure Socket Layer 프로토콜
- Media : 코덱 지원
- libc : 시스템 C 라이브러리
커널 계층
Android 계층 최하단 위치하며, 시스템 전체의 중심 역할
사용자나 개발자가 이쪽 계층에서 작업하거나, 상호 작용할 일은 없다.
리눅스 커널을 기반으로 제작된 OS로써 안드로이드 버전과 함께 커널의 버전도 업데이트 되고 있다.
기능
- 하드웨어 추상화
- 보안 설정
- 메모리 관리
- 전원 관리
- 네트워크 시스템 관리
- 장치 드라이버 관리
- H/W, 네트워크, 파일 시스템 접근
커널과 라이브러리를 제외하고는 JAVA로 작성되어 가상머신상에서 동작한다.