Architecture, Framework, Platform에 대해 알아보자
안드로이드 플랫폼 아키텍쳐의 구조
안드로이드는 리눅스 커널을 기반으로 하고 있는 리눅스 계열 OS입니다.
커널이란 하드웨어와 우리가 사용하고 있는 OS를 연결시켜주는 다리와 같은 존재로 운영체제에 있어서 핵심이기도 합니다.
1. 커널(kernel)의 담당
1) 보안
- 하드웨어와 프로세서의 보안을 담당합니다.
2) 자원관리
- 한정된 시스템 자원을 효율적 관리, 프로그램의 실행을 원만하게 합니다.
*프로세스 처리를 관리하는 것을 스케쥴링이라 합니다.
3) 추상화
- 같은 종류의 부품으로 수 많은 종류의 하드웨어를 설계할 수 있기 때문에
하드웨어에 직접 접근하는 것은 다소 복잡하게 될 수 있습니다.
일반적으로 커널은 운영체제의 복잡한 내부를 감추고
일관성 있는 인터페이스를 하드웨어에 제공하기 위해
같은 종류의 하드웨어에 대한 공통 명령어 집합인 추상화들로 이루어집니다.
4)하드웨어 드라이버
-카메라, 블루투스 등 각종 하드웨어를 제어하는데
필요로하는 명령어 모음인 드라이버들을 포함하고 있습니다.
5) 전력관리
-전원을 끄거나 비활성화 하는 등 WIFI / BLUETOOTH / CPU / GPU등 하드웨어에 공급되는 전력에 대해서 관리합니다.
2. 하드웨어 추상화 계층 (HAL)
같은 종류의 부품으로 다양하게 많은 종류의 하드웨어를 설계 할 수 있어 직접 하드웨어에 접근하는 형태는
다소 복잡하게 될 수 있습니다.
이 점을 해결하고 복잡한 내부를 감추고 일관성 있는 인터페이스를 제공하기 위해, 같은 종류의 하드웨어에 대한 공통
명령어 집합으로 묶어둡니다. 이를 하드웨어 추상화 라 하며,
프로그래머가 여러 장비에서 개발하는 것을 도와줍니다. 하드웨어 추상화 계층은 장비 제조사의 장비 규격에 대한 특정한 명령어를 제공하는
소프트웨어 드라이버에 의존 합니다.
안드로이드에서 HAL은 자바 API프레임워크에 대해서 기기 하드웨어 기능을 사용할 수 있도록 표준 인터페이스를 제공.
여러가지 모듈 형태로 이루어져 있으며, 카메라 모듈 또는 블루투스 모듈 같은 유형으로 하드웨어 구성요소의 인터페이스를 구혐ㄴ합니다.
프레임워크 API가 하드웨어에 접근하기 위해서 호출 명령을 수행하면, 안드로이드 시스템에서 해당 하드웨어 구성요소에 대한 라이브러리 모듈을 불러옵니다.
3. 안드로이드 런타임(Android runtime)
안드로이드 런타임은 흔히 ART로도 이야기하며, ART의 주요기능을 살펴보면 다음과 같다.
1)AOT(Ahead Of Time)나 JIT(Just In Time) 컴파일
2)최적화된 가비지 수집 CG
3)전용 샘플링 프로파일러, 상세 진단 예외 및 크래시 보고,
watchpoint를 생성하여 특정 필드를 모니터링 할수 있는 기능을 포함한 디버깅 기능지원
일반적인 컴파일러 언어는 CPU와 플랫폼 환경에 맞추어 기계어로 컴파일 됩니다.
즉 간단하게 말하자면 우리가 이야기 하는 것을 하드웨어가 알아들을 수 있도록 번역하여 저장한다는 뜻입니다.
하지만 자바는 한 종류의 CPU와 플랫폼 환경에 맞추어서 저장되는 것이 아니라 바이트코드로 저장되며,
이를 실행하기 위해서는 자바가상머신(JVM: Java Virtual Machin)이 필요로 합니다.
이는 자바의 목표가 하나의 바이트코드로 여러가지 CPU와 플랫폼 환경에서 구동되기 위해서입니다.
즉 CPU와 플랫폼 환경에 맞는 가상머신이 있다면 하나의 실행파일을 가지고 여러가지 환경에서 사용 할 수 있다는 것입니다.
안드로이드도 기본언어를 JAVA를 사용하기 떄문에 VM은 필수적입니다.
이에 JVM을 사용할 수 있지만 오라클과의 라이센스 문제 해결과 JVM이 안드로이드의 구조에 맞추어서 구동할 수 있도록
만들어진 것이 달빅VM(Dalvik VM)과 ART입니다.
이둘의 차이는 JIT컴파일러(달빅 VM)을 사용하느냐 AOT컴파일러(ART)를 사용하는가로 나누어지며 이에 따라서 동작하는 형태도 다릅니다.
JIT같은 경우 안드로이드 2.2부터 달빅 VM에 추가되었으며, 이전까지는 애플리케이션이 구동되면 실시간으로
CPU에 맞추어 자바코드를 변환하였습니다.
하지만 JIT가 도입되고 난 뒤로는 최초 앱 실행시 자바코드가 일정부분 한꺼번에 변환, RAM상에 올려두고 작업하게 됩니다.
이를 통해서 성능적 향상은 엄청난 차이가 보일정도로 이루어졌지만 여러가지 문제점이 발생.
1)JIT컴파일러가 돌아가는 동안에 하드웨어의 부하가 크게 발생,
배터리 소모가 심각해졌으며 동작중인 화면이 많을수록 배터리 소모량은 더 커졌다.
2)애플리케이션 실행시, 실행부분 전체를 RAM에 상주시켜야하며,
각 앱이 다른 OS보다 더 많은 RAM을 사용합니다.
이러한 부분을 해결하기 위해서 AOT컴파일러를 기반으로 만들어진 것이 ART입니다.
AOT는 JIT과는 달리 애플리케이션 설치시 한 번에 컴파일하여 바이트코드로 변환해두고 있다가
프로그램 실행시 변환된 코드를 읽어들이는 형태입니다.
ART 단점
1)애플리케이션 설치 공간이 달빅 VM에 비해서 약 1.5 ~ 2배 정도 더 필요로 합니다.
2)애플리케이션 설치 시간이 더 느립니다.
안드로이드 7.0부터는 앱 설치시간을 단축하기 위해서 최초 설치시에는 JIT을 사용, 충전중이거나 기기를 사용하지 않을때,
즉 대기모드 상태일때 컴파일 작업을 실시하여 점진적으로 AOT방식으로 바꾸어 나가도록 되어있습니다.
4.안드로이드 프레임워크(Android Framework)
안드로이드 애플리케이션을 제작하는데 필요로 하는 빌딩 블록을 구성.
1)뷰 시스템
- 목록, 그리드, 텍스트상자, 버튼, 웹뷰 등
다양한 기능을 제공하며 확장이 가능.
-제공되는 기능을 이용하며 애플리케이션의 유저 인터페이스(UI)를 빌드하는데 사용합니다.
2) 리소스 매니저
-현지화된 문자열(국가별 문자열) / 그래픽 및 레이아웃 파일과 같은 코드가 아닌 리소스에 대한 접근을 제공.
3) 알림 매니저
-모든 애플리케이션이 상태표시줄(상단바, 상태바)에 사용자 지정 알림을 표시 할 수 있도록 지원합니다.
4) 액티비티 매니저
-애플리케이션의 수명 주기(동작 주기, 활성화 주기)를
관리하고 공통 탐색 백 스택을 제공합니다.
5)콘텐츠 제공자
-애플리케이션이 주소록 애플리케이션과 같은 다른 애플리케이션의 데이터에 접근하거나 자신의 데이터를 공유할 수 있도록 지원
5.애플리케이션의 구동
사용자가 카메라 애플리케이션을 실행시키면 안드로이드 런타임위에서 컴파일된 코드들이 동작 할 것입니다.
AVA API와 네이티브 라이브러리는 이에 포함되어 있습니다.
그리고 HAL과 커널 안의 드라이버를 이용하여 카메라 하드웨어 모듈이 동작할 것이고 사용자가 촬영을 하고 있는 내용을 이미지 센서를 통해서 받아올것입니다.
이를 다시 JAVA API와 네이티브 라이브러리를 이용ㅇ해서 사용자에게 결과 값을 보내줄 것입니다.
사용자가 촬영한 이미지를 저장한다면 다시 해당이미지의 데이터를 메모리에 저장하는 작업을 진행할 것이다.
참조 :
'안드로이드' 카테고리의 다른 글
디바이스를 구분하는 고유번호 ANDROID_ID 오레오 (0) | 2022.10.25 |
---|---|
sharedViewModel, Android Fragment간의 ViewModel공유하기 (0) | 2022.10.25 |
[Android] 블루투스(Bluetooth) 개발에 대해 알아보자 (0) | 2022.10.24 |
[Android] 블루투스(Bluetooth) Gatt 개발 순서 (0) | 2022.10.24 |
[Android] ViewPager2, tabLayout 사용 방법 (0) | 2022.10.24 |