일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드 레트로핏 crud
- 안드로이드 유닛 테스트
- 안드로이드 유닛 테스트 예시
- rxjava hot observable
- ANR이란
- 스택 큐 차이
- 서비스 vs 쓰레드
- 안드로이드 라이선스
- 큐 자바 코드
- ar vr 차이
- 클래스
- 안드로이드 유닛테스트란
- 자바 다형성
- 안드로이드 레트로핏 사용법
- Rxjava Observable
- android retrofit login
- 플러터 설치 2022
- 멤버변수
- rxjava disposable
- jvm 작동 원리
- android ar 개발
- 안드로이드 라이선스 종류
- 스택 자바 코드
- 서비스 쓰레드 차이
- 2022 플러터 설치
- rxjava cold observable
- 2022 플러터 안드로이드 스튜디오
- jvm이란
- 안드로이드 os 구조
- 객체
- Today
- Total
나만을 위한 블로그
[Android] 안드로이드 OS의 구조 본문
안드로이드의 구조를 그림으로 보면 아래와 같다.
다른 이미지도 있는데 각 이미지에서 보이는 영역의 이름만 조금 다르고 하는 일은 똑같다.
맨 위부터 응용 프로그램, 응용 프로그램 프레임워크, 라이브러리, 안드로이드 런타임, 리눅스 커널의 총 5개 계층으로 분류돼 있다.
또한 안드로이드의 OS는 리눅스 기반이고 쓰이는 언어는 자바, 코틀린이다.
리눅스 커널 계층
OS가 리눅스 기반으로 설계됐기 때문에 커널도 리눅스로 만들어져 있다. 여기서 커널은 하드웨어, OS를 연결하는 다리 역할을 하는 것이다.
이 계층은 안드로이드 계층의 맨 밑에 위치해 있으며 안드로이드 시스템의 핵심적인 부분을 관리한다. 이 곳에서 하는 일은 아래와 같다.
- 하드웨어 추상화
- 메모리 관리
- 보안 설정
- 전원 관리
- 다른 하드웨어 장치의 드라이버 관리(카메라, 블루투스, 오디오 등)
- 네트워크 시스템 관리
사용자, 개발자가 이 계층을 다룰 일은 없다.
하드웨어 추상화 계층
이 계층에 대해 안드로이드 소스가 말하는 내용은 아래와 같다.
https://source.android.com/devices/architecture?hl=ko
하드웨어 추상화 계층(HAL)은 하드웨어 공급업체에서 구현해야 하는 표준 인터페이스를 정의하며 안드로이드에서 하위 드라이버 구현을 고려하지 않아도 되게 해주는 시스템이다. 이걸 쓰면 상위 수준 시스템을 수정하거나 시스템에 영향을 주지 않고도 기능을 구현할 수 있다. HAL 구현은 모듈로 패키징되며 적절한 시점에 안드로이드 시스템에 의해 로드된다.
하드웨어들은 기계어나 어셈블리어 같은 저수준 언어를 사용한다. 이 언어들이 복잡하기 때문에 이 부분을 감추고 표준 인터페이스를 제공해 자바 API 프레임워크가 기기 하드웨어 기능을 사용할 수 있게 한다. 여러 모듈 형태로 이뤄져 있고 카메라 모듈 또는 블루투스 모듈 같은 유형으로 하드웨어 구성 요소의 인터페이스를 구현한다. 프레임워크 API가 하드웨어에 접근하기 위해 호출 명령을 내리면 안드로이드 시스텡메서 해당 하드웨어 구성요소에 대한 라이브러리 모듈을 불러온다.
안드로이드 8.0 이상인 경우 기존 HAL과 조금 다른 HAL을 사용한다. 이 내용이 더 궁금하다면 아래 링크 참고.
https://source.android.com/devices/architecture/hal-types?hl=ko
네이티브 라이브러리 계층
일반적으로 사용하는 라이브러리 기능들이 모인 곳인데 좀 더 저수준에서 동작하는 라이브러리다.
왜냐면 안드로이드는 메인 메모리가 거의 없고 CPU 전원이 낮은 기기에서 실행돼야 하므로 CPU, GPU 집약적 작업을 위한 라이브러리들은 기기에 최적화된 네이티브 코드로 컴파일되야 한다.
오디오와 비디오 코덱을 포함하고 음악, 영상, 사진 등의 미디어 처리를 담당하는 Media Framework, 화면의 창 구성을 처리하는 Surface Manager를 비롯한 여러 매니저와 프레임워크가 있고 아래의 오픈소스 라이브러리들이 담겨져 있다.
- SGL : 2D 그래픽 담당
- OpenGL ES : 2D/3D 그래픽 담당. AR 앱을 만들 때 이 이름의 클래스를 다룬 적이 있다.
- Free Type : 폰트 렌더링
- WebKit : 웹 브라우저 엔진
- libc : 시스템 C 라이브러리
- SQLite : 모바일을 위한 경량화된 로컬 DB
- Open SSL(Secure Socket Layer 프로토콜)
런타임 계층
실행 중인 어플리케이션 코드들을 OS가 이해하도록 컴파일하는 계층이다.
안드로이드는 자바 언어의 저작권, 성능 문제 등 여러 요인으로 JVM을 쓰지 않고 DVM(달빅 VM)을 사용해오다가 ART(Android RunTime)을 사용하게 됐다.
달빅에선 실행 중에 컴파일하는 JIT(Just In Time) 컴파일 방식을 썼었는데 이 방식은 메모리를 많이 차지한다는 단점이 있다. 그래서인지 안드로이드 롤리팝(2014)부터는 달빅 VM을 폐지하고 ART를 새 런타임으로 완전히 대체했다.
ART 방식은 앱 설치 시 미리 기계어로 해석해놓고(Ahead-Of-Time, AOT), 앱 실행 시에는 바로 실행하는 방식으로 성능을 향상시켰다. 그러나 성능은 향상시켰지만 앱 설치 시 요구되는 용량이 늘었다.
이 ART 방식을 사용해오다가 안드로이드 누가(2016)부터는 JIT, ART 방식 모두 사용하는 하이브리드 형태로 바뀌었다. 이 내용의 근거는 아래 링크에 있다.
https://source.android.google.cn/devices/tech/dalvik/configure?hl=ko
자바 API 프레임워크 계층
개발자가 코드를 작성하는 어플리케이션 계층과 자바 API 프레임워크 계층 밑의 계층들과 소통할 수 있도록 하는 다리 역할을 하며, 액티비티 생명주기와 언어 설정 등 프레임워크 수준의 기능을 담당한다. 즉, 안드로이드 개발자가 자주 이용하는 부분이 여기다.
추가로 안드로이드의 프레임워크 종류는 아래와 같은 것들이 있다.
- Activity Manager : 애플리케이션 안의 액티비티들을 관리
- Content Providers : 애플리케이션 간의 데이터 공유 관리
- Telephony Manager : 음성통화 관리
- Location Manager : GPS 또는 기지국 신호를 통해 위치 정보 관리
- Resource Manager : 앱에서 사용하는 리소스들 관리
- View System : UI에 쓰이는 안드로이드 뷰들을 관리
- Notification Manager : 알림 관리
앞서 말한대로 이 계층부터는 자바로 작성되며, 기본 네이티브 라이브러리(SQLite 등)와 안드로이드 런타임을 추상화한 계층이다.
어플리케이션 계층
이 최상위 계층이 일반 사용자들이 접하는 계층으로, 안드로이드 기본 제공 앱(전화, 문자, 캘린더, 계산기 등)과 스토어에서 다운받은 앱들이 속해서 각자의 기능들이 실행되는 영역이다. 개발자라면 자신이 구현한 기능들을 테스트하는 계층이기도 하다.
참고한 사이트)
https://www.charlezz.com/?p=792
https://bearhunter49.tistory.com/4
https://m.blog.naver.com/searphiel9/221000280654
https://softwaree.tistory.com/52
https://www.javatpoint.com/android-software-stack
https://source.android.google.cn/devices/tech/dalvik/configure?hl=ko
https://www.linkedin.com/pulse/android-application-framework-mayur-sojitra/
'Android' 카테고리의 다른 글
[Android] ANR이란? (0) | 2021.10.14 |
---|---|
[Android] 유닛 테스트란? 유닛 테스트 예시(JAVA) (0) | 2021.10.10 |
[Android] 인텐트란? (0) | 2021.10.07 |
[Android] 액티비티 vs 프래그먼트 차이 (0) | 2021.10.07 |
[Android] 뷰모델이란? + 뷰모델 코틀린 예제 (0) | 2021.10.04 |