안드로이드 구조는 위와 같다. 크게 커널, HAL, Native Library, Android Runtime, Framework, Application으로 이루어 진다.
1. Kernel
리눅스 커널을 사용 한다. 기본적인 IPC, 등을 사용하며 커널의 경량화를 위해 리눅스 커널에 존재하는 많은 API를 제거했으며 일부는 Kernel단이 아닌 User단에서 실행하도록 안드로이드는 수정했다. 이로 인해 둘의 호환은 어려우며 리눅스 프로그램이 안드로이드에서, 안드로이드 프로그램이 리눅스 PC에서 사용하는데는 어려움이 있다.
결과적으로 리눅스 베이스로 안드로이드가 배포된 것이며 기본적인 H/W의 접근과 작업은 리눅스와 유사함을 알 수 있다.
2. HAL
HAL은 안드로이드에서 user들이 applicatoin 개발을 진행할 때, framework api를 통해서 개발을 진행하는데 이 때 framework는 각 H/W device를 제어하는 api로 연결될 수 있기를 원했다.(결과적으로 개발자 및 사용자가 user단에서 API호출을 통해 쉽게 H/W deivce를 통제하고 싶어 함)
이러한 작업이 실제적으로 이루어지기 위해서는 수 많은 H/W에 대한 제어가 필요하기때문에 많은 어려움이 있다.(모든 H/W 종류에 맞도록 API를 구현하는 것은 현실적으로 불가능함) 그래서 안드로이드는 모든 H/W에 공통적으로 사용하는 open, close, write, read등의 기본적인 함수들을 API로 만들었고 각 device vendor사에 해당 API에 맞도록 구현을 요청하였다.
결과적으로 해당 API를 호출함으로써 H/W Device 종류와 상관없이 윗단에서는 H/W open, read, write등의 기본적인 동작을 진행할 수 있게 되었고 이렇게 vendor사 측에 요청하여 H/W device를 접근 제어하는 API들이 바로 HAL이다.
3. Native Library
Native Library는 안드로이드에서 보안, 경량화 등의 이슈로 인해 java가 아닌 C,C++ 즉 네이티브 소스 코드로 작성할 필요가 있을 때를 위해 만든 라이브러리이다. 즉 해당 라이브러리들은 C, C++ 코드로 작성되었으며 java보다 더 효율적인 동작을 수행할 수 있다.
여기서 안드로이드는 Native Library를 정말 필요한 소수만 구현하여 제공하는데 그 이유는 OS의 경량화에 목적이있다.
추가적으로 개발에 있어 필요한 부분의 Native Library는 개발자가 자신의 필요에 맞게 JNI를 통해 네이티브 C,C++ 소스 코드로 구현할 수 있도록 지원한다.
4. Framework
Framework는 JAVA API를 의미하며 해당 API로는 View, Activity 등 기본적으로 App개발에 있어 사용되는 라이브러리를 말한다.
보통의 App개발자들이 사용하는 기본적인 라이브러리가 모두 Framework 단에 구현된 API를 의미한다.
5. App
사용자의 관점에서 서비스를 이용하기위한 다리 역할을 해주는 부분이다. 결국 안드로이드의 모든 서비스는 App형태로 지원되며 사용자는 App을 통해 원하고자하는 서비스를 사용할 수 있음.
결과적으로는 사용자의 버튼 클릭 한번으로 인해 Framework API를 호출 여기서 Framework는 필요에 따라 Native Library를 호출하며 결과적으로 H/W Device 제어를 하기 위해 HAL 코드를 호출하고 HAL을 통한 리눅스 커널 함수는 device로부터 연산 명령 및 연산 결과를 얻어오고 쭉 다시 App단으로 올라와서 화면에 출력한다.
6. Andriod RunTIme
안드로이드는 안드로이드 구조의 경량화 그리고 효율을 위해 다양한 런타임 빌드 환경을 시도했고 안드로이드 환경에 맞도록 변화를 시도 했다.
'Android > 안드로이드 운영체제' 카테고리의 다른 글
[Android] 안드로이드(6) - Biometric (0) | 2020.11.01 |
---|---|
[Android] 안드로이드(5) - HAL (2) | 2020.10.25 |
[Android] 안드로이드(4) - 부팅2, Zygote (0) | 2020.10.19 |
[Android] 안드로이드(3) - 부팅 (0) | 2020.10.10 |
[Android] 안드로이드(2) - 런타임 (0) | 2020.10.04 |