안드로이드에 대해 자세히 공부 하기 직전 어떤것을 공부 해야하는지에 대한 지도 입니다.
파란색 부분은 JAVA로 구성 되어 있고 초록 부분은 C/C++로 구성 되어 있다고 합니다.
맨위부터 차례대로 공부해 보겠습니다.
application Layer
우리가 흔히 사용하는 게임이나 카카오톡 같은 앱스토어에서 다운 받는 어플 들과 핸드폰을 사면 기본으로 깔려있는 기본 어플리케이션들은 어플리케이션 영역에 속한다.
여기서 우리가 깔지 않았는데 깔려있는(전화 ,메시지,카메라) 앱들은 시스템 우선권을 가지고 있다.
읭? 왜요?!?!?!
라고 물을 수도 있겠는데 만약 우리가 메모리가 부족하다고 생각 해보자 그럴때 우리 전화 앱은 꺼지면 안되기 때문에 우선 순위가 가장 높게 설정 되어 있는 것이다.
Application Framework Layer
어플리케이션 프레임 워크는 어플리케이션을 제작하는데 필요로 하는 빌딩 블록을 구성한다.
View System | 리스트,그리드,텍스트뷰,버튼,웹 뷰 등의 집합 |
Resource Manager | 문자열, 그래픽,레이아웃 파일 등 리소스를 찾아 주는 역할 |
Notification Manager | 모든 어플리케이션의 상태 표시줄에 사용자 지정 알림을 표시 할 수 있도록 지원 합니다. |
Activity Manager | 액티비티의 생명주기를 호출, 공통적인 네비게이션 백스택을 제공 onStart(), onResume(), onCreate(), onStop(), onPause(), onDestroy(), onRestart() 메서드가 호출되는 것을 관리) |
content Providers | 안드로이드 4대 컴포넌트 중 하나, 어플리케이션이 다른 어플리케이션으로부터 데이터를 엑세스하거나, 자신의 데이터를 공유하는 게 가능하게 함 |
Package Manager | 현재 디바이스에 설치된 어플리케이션과 관련된 정보를 가지고 있음 |
Window Manager | 화면에 대한 정보, 배치 등을 관리하는 시스템 서비스 |
Telephony Manager | 단말기의 상태에 대한 정보를 얻을 수 있는 서비스 |
Location Manager | 단말의 위치 값을 지속적으로 얻을 수 있는 서비스 |
Android Runtime
android Runtime은 자바 프로그래밍 언어의 코어 라이브러리의 집합이다.
주요기능
- AOT나 JIT 컴파일
- 최적화된 가비지 수집 CG
- 전용 샘플링 프로 파일러, 상세 진단 예외 및 크래시 보고 watchpoint를 생성하여 특정 필드를 모니터릴 할수 있는 기능을 포함한 디버깅 기능 지원
- dx를 이용하여 .dex 포맷으로 변경하여, 자바 컴파일러에 의해 컴파일된 클래스를 실행한다.
- core library : 리눅스 커널을 래핑하거나 추가 기능을 제공하는 역할
- Binoic 커스텀 C 라이브러리
- Webkit / SQLite / OpenGL 라이브러리
- 네이티브 시스템 서비스 Surface Manager, Media Framework
자바는 바이트 코드로 저장이 되고 자바 가상 머신 (JVM)을 이용해서 실행 시켜야 한다.
안드로이드도 기본 언어를 JAVA를 사용하기 때문에 JVM을 이용해야 하는데 안드로이드의 구조에 맞춰서 구동 해야 한다. 이것을 도와 주는 것이 달빅VM과 ART(Android Runtime) 다. 둘의 차이는 JIT 컴파일러를 이용하느냐 AOT컴파일러를 사용 하는 지다.
JIT에 설명은 나중에 따로 정리하고 AOT를 이용한 ART를 설명 하겠습니다.
AOT는 어플리케이션 설치시 한 번에 컴파일하여 바이트 코드로 변환해 두고 있다가 프로그램 실행시 변환된 코드를
읽어 들이는 형태다. 이를 이용하기 때문에 ART는 달빅VM보다 문제점이 많이 개선 되었다. 하지만 ART가 달빅VM보다 설치 용량이 1.5~2배정도 커서 설치 시간이 더 느리다는 단점이 있다
Hardware Abstraction Layer(HAL)
HAL은 상위 수준의 Java API 프레임워크에 기기 하드웨어 기능을 노출하는 표준 인터페이스를 제공한다. HAL은 여러 라이브러리 모듈로 구성 되어 있으며, 카메라 또는 블루투스 모듈과 같은 특정 유형의 하드웨어 구성 요소를 위한 인터페이스를 구현한다. 프레임워크 api가 기기 하드웨어에 엑세스 하기 위해 호출을 수행하면 Android 시스템이 해당 하드 웨어 구성 요소에 대한 라이브러리 모듈을 로드 한다.
ex) Location Manager 같은걸 이용해서 GPS를 이용할 때 휴대폰에서 gps기능이 있는 하드웨어를 실행한다고 생각 하면 될듯...?
Library(네이티브 라이브러리)
ART 및 HAL 등 많은 핵심 안드로이드 시스템 구성 요소와 서비스는 C/C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드 기반으로 이루어 져 있다. 안드로이드는 JAVA 프레임워크 API를 이용, 일부 네이티브 라이브러리 기능을 앱에 제공 하고 있다. 코드의 보안이나 성능을 필요로 하는 경우 C/C++ 코드가 필요로 하는 애플리케이션을 개발 할 때에는 안드로이드 NDK(Native Development Kit)을 이용하여 네이티브 코드에서 직접 여러가지 네이티브 플랫폼 라이브러리에 접근할 수 있다
System C library : 임베디드 리눅스 기반 장치에 맞춰진 표준 C 시스템 라이브러리, BSD에서 파생됨
Media Libraries : PacketVideo의 OpenCORE에 기반하여 대중적인 오디오와 비디오 포맷 뿐만 아니라 정적 이미지 파일(MPEG4, H.264, AAC, AMR, JPG, PNG)을 제공
Surface Manager : 디스플레이의 서브시스템을 관리하며, 여러 어플리케이션으로부터 나온 2D, 3D 그래픽 레이어를 렉 없이 합성
LibWebCore : 웹 브라우저를 구현하는 첨단의 웹 브라우저 엔진
3D libraries : OpenGL es 1.0 APIs를 기반으로 구현됨, 하드웨어 3D 가속 또는 3D 소프트웨어인 래스터라이저를 사용
FreeType : 비트맵과 벡터 폰트 렌더링을 담당
SQLite : 모바일용 관계형 데이터 베이스
리눅스 커널
안드로이드는 리눅스 커널을 기반으로 하고 있는 리눅스 계열 OS 입니다.
※커널이란 하트웨어와 우리가 사용 하고 있는 OS를 연결 시켜주는 존재이다.
커널이 하는 일
보안 | 하드웨어와 프로세서의 보안을 담당한다 |
자원관리 | 한정된 시스템 자원을 효율적 관리, 프로그램의 실행을 원만하게 한다. |
추상화 | 같은 종류의 부품으로 수 많은 종류의 하드웨어를 설계할 수 있기 떄문에 하드웨어에 직접 접근 하는 것은 다소 복잡하게 될 수 있다. 일반적으로 커널은 복잡한 내부를 숨기고 일관성 있는 인터페이스를 제공 하기 위해 같은 종류의 하드웨어에 대한 공통 명령어 집한인 추상화들로 이루어 진다 |
하트웨어 드라이버 | 카메라, 블루투스 등 각종 하드웨어를 제어하는데 필요로 하는 명령어 모음인 드라이버들을 포함하고 있다 |
전력 관리 | 전원을 끄거나 비활성화 하는 등 WIFI/BLUETOOTH/CPU/GPU등 하드웨어에 공급되는 전력에 대하여 관리한다. |
부팅 시 부트 로더를 통해 리눅스 커널이 먼저 시작되게 된다.
보안, 메모리 관리, 프로세스 관리, 네트워크 스택, 드라이버 모델과 같은 코어 시스템 서비스를 위해서 리눅스 2.6 버전에 의존하는 구조
휴 정말 힘들었다. 그래도 어플좀 만들다가 공부하니 이해가 되서 다행이다.
'안드로이드에 관하여 > 안드로이드 공부' 카테고리의 다른 글
what is Smali code? (0) | 2021.01.02 |
---|---|
Dex 파일 구조는 어떻게 되어 있는가 (2) | 2020.12.24 |
Android framework Study[2 - 핸드폰을 부팅 하자] (0) | 2020.12.03 |
안드로이드 리버스 엔지니어링 공부 체크 리스트 (0) | 2020.08.30 |
adb 가 외안댄데?(adb unauthorized , device offline) (0) | 2020.02.08 |