회사에서 C 코드를 안드로이드에서 사용해야할 일이 있어서 NDK와 JNI에 대해 알아보고 있었다. 그러다보니 자연스레 아키텍쳐까지 보게 되었다. 좋은 현상인 것 같다.




Linux Kernel


Android 플랫폼은 리눅스 커널을 기반으로 한다. 


오디오, 키패드, 카메라 등 각종 장치의 사용을 위한 드라이버와 프로세스 관리, 메모리 관리 등의 기능을 포함하고 있다.


리눅스 커널은 오픈 소스이면서 드라이버 모델의 검증된 안정성, 최신 장비의 지원, 하드웨어 입출력에 대한 보안모델 제공 등이 안드로이드가 리눅스 커널을 사용하는 이유일 것이다.


안드로이드서 사용하는 리눅스 커널은 알람, 공유메모리, Low memory-killer, kernel debugger, binder, power management, logger 등 기존에 없었거나 향상된 기능들이 있다.



Hardware Abstraction Layer(하드웨어 추상화 계층)


커널의 윗단에는 C와 C++로 짜여진 시스템 라이브러리가 존재한다. 기존에 많이 사용되어 신뢰성을 보장한다.


Java API 프레임워크에 하드웨어 기능을 노출하는 표준 인터페이스르 제공한다. 카메라 또는 블루투스 모듈과 같은 특정 유형의 하드웨어 구성 요소를 위한 인터페이스를 구현한다.


프레임워크 API가 기기 하드웨어에 액세스하기 위해 호출을 수행하면 안드로이드 시스템이 해당 하드웨어 구성 요소에 대한 라이브러리 모듈을 로드한다.


이러한 라이브러리에는 System C Library, Media Libraries, Surface Manager, 3D Libraries 등이 있다.



Android Runtime


안드로이드 버전 5.0(API 레벨 21) 이상부터는 각 앱이 자체 프로세스 내에서 자체 ART(Android 런타임) 인스턴스로 실행된다. 


ART의 주요 기능 중 몇 가지를 살펴보면 다음과 같다.


- AOT(Ahead of Time) 및 JIT(Just In Time) 컴파일

- 최적화된 가비지 컬렉터(GC)


이전에는 Dalvik VM이라는 것이 사용되었는데, 이 VM의 한계를 해결하기 위해 개발된 런타임이 ART이다. 


SUN의 자바는 명령들이 전부 8비트 길이를 가지지만 안드로이드는 4바이트이다. 기존의 SUN은 명령어가 스택에 들어가기 때문에 PUSH, POP명령어를 쓰고 Dalvik은 뱅크드레지스터를 이용한 복사명령을 이용하고 레지스터에서 바로 실행시키기 때문에 속도가 더 빠르다. 4바이트가 레지스터에 전부 들어가기 때문에 낮은사양에서도 느려지지 않는 효과도 있다. 



JNI


프로그램동작은 자바코드이고 드라이버들은 대부분 C/C++이지만 그 사이에 JNI가 있기때문에 동작이 가능하다. JNI는 자바코드에서 C나 C++  라이브러리를 호출할 수 있도록 만들어진 규약이다. 안드로이드에서 응용프로그램은 C/C++로도 만들 수 있다. 대신 UI를 가지기는 힘들다. 백그라운드 서비스를 제작할 경우 굳이 자바로 할 필요는 없다.



Native C/C++ Libraries


ART 및 HAL 등의 많은 핵심 Android 시스템 구성 요소와 서비스가 C 및 C++로 작성된 네이티브 라이브러리를 필요로 하는 네이티브 코드를 기반으로 빌드되었다. Android 플랫폼은 Java 프레임워크 API를 제공하여 이러한 일부 네이티브 라이브러리의 기능을 앱에 노출한다. 예를 들어, Android 프레임워크의 Java OpenGL API를 통해 OpenGL ES에 액세스하여 앱에서 2D 및 3D 그래픽을 그리고 조작할 수 있는 지원 기능을 추가할 수 있다.


C 또는 C++ 코드가 필요한 앱을 개발하는 경우에는 Android NDK를 사용하여 네이티브 코드에서 직접 이러한 몇몇 네이티브 플랫폼 라이브러리에 액세스할 수 있다.



Java API Framework


안드로이드 앱 개발을 하면서 가장 많이 접했던 계층이다. 뷰 시스템, resource manager, notification manager, activity manager, content provider 등을 호출하여 사용할 수 있다.


개발자는 안드로이드 시스템 앱이 사용하는 것과 동일한 프레임워크 API에 대한 전체 액세스 권한을 가진다.



System Apps


우리가 실행하고 사용하는 앱이다. 


시스템 앱은 사용자를 위한 앱으로도 작동하고 개발자가 자신의 앱에서 액세스할 수 있는 주요 기능을 제공하기 위한 용도로도 작동한다. 예를 들어, 앱이 SMS 메시지를 제공하고자 할 경우 해당 기능을 직접 빌드할 필요가 없다. 그 대신, 이미 설치된 SMS 앱을 호출하여 지정한 받는 사람에게 메시지를 제공할 수 있다.



JIT와 컴파일러, NDK 등에 대해서는 다른 글에서 다루도록 하겠다.



참고


플랫폼 아키텍쳐


안드로이드의 구조


안드로이드 가상머신 동작 구조


안드로이드 구조와 원리 정리

블로그 이미지

NCookie

,