Android Architecture
안드로이드 구조는 위의 이미지와 같이 다섯계층의 구조로 이루어져 있습니다.
- 리눅스 커널 계층
- 네이티브 라이브러리 계층
- 안드로이드 런타임 계층
- 애플리케이션 프레임워크 계층
- 애플리케이션 계층
녹색으로 이루어진 계층은 C/C++로 작성되어있으며, 파란색 계층은 자바로 작성되어 가상머신상에서 동작하게 됩니다.
커널 계층(Kernel Layer)
안드로이드 계층 최하단에 위치 하며, 시스템전체의 중심역할을 합니다. 사용자나 개발자가 이쪽 계층에서 작업을 한다거나 상호작용할일은 없습니다. 커널에서 담당하는 일은 다음과 같습니다.
- 하드웨어 추상화
- 메모리 관리
- 보안 설정
- 전원관리
- 다른 하드웨어 장치 드라이버 관리
- 네트워크 시스템 관리
안드로이드의 버전과 함께 커널의 버전도 업데이트 되고있습니다. 안드로이드 초창기(1.0~3.0)에는 커널버전이 2.6.x이였습니다. 안드로이드 버전 4.0 이후로는 커널버전도 3.x까지 올라왔습니다.
네이티브 라이브러리 계층(Native Libraries Layer)
안드로이드는 상대적으로 작은 용량의 주기억장치와 저전력의 CPU가 탑재된 기기에서 동작하기 때문에 이러한 기기에 최적화된 원시코드로 컴파일 됩니다. libc 또는 libm과 같은 기본적인 라이브러리는 특히 메모리 소비가 적기때문에 안드로이드에 적합합니다. 이 계층의 Surface Manager는 프레임워크 계층의 Window Manager의 화면 접근에 대한 처리를 하기도 하고, Media Framework는 오디오 및 비디오 코덱을 포함하며 각종 음악, 동영상,사진을 포함한 각종 미디어처리를 담당합니다.
그 외에도 다음과 같은 오픈소스 라이브러리들을 포함합니다.
- SGL : 2D 그랙픽 담당
- Open GL ES : 2D/3D 그래픽 담당
- Free Type : 폰트 렌더링
- WebKit : 웹 브라우저 엔진
- libc : 시스템 C 라이브러리
- SQLite : 모바일을 위한 경량화된 데이터 베이스
- SSL : Secure Socket Layer 프로토콜
안드로이드 런타임 (ART, 구 Dalvik)
안드로이드 런타임을 이해하기위해서는 Java의 가상머신(VM;Virtual Machine)을 알아야합니다.
일반적인 컴파일 언어는 CPU의 아키텍쳐와 플랫폼의 환경에 맞추어 기계어로 컴파일됩니다. 간단히 말하자면, 사람이 작성한 프로그램을 CPU가 알아들을 수 있는 언어로 바로 번역하여 저장하는 것입니다. 이 CPU간의 서로 다른 “언어”가 “아키텍쳐”에 해당한다고 보면 됩니다. 그러나, 자바의 경우는 기본적으로 한 가지 CPU의 아키텍쳐나 환경에 맞추는 것이 아닌 바이트코드라는 것으로 컴파일 되며, 이를 실행하기 위해서는 자바 가상 머신이 필요합니다. 이렇게 하는 이유는 자바는 바이트코드 하나만으로 여러 가지 아키텍쳐나 플랫폼에서 작동할 수 있도록 하는 것이 목표이기 때문입니다. 아키텍쳐와 플랫폼에 맞는 가상머신만 있다면 하나의 실행 파일만 가지고도 각종 장치에서 쓸 수 있습니다.
안드로이드도 Java 언어를 사용하기 때문에 VM이 필수입니다. 이에 자바 가상머신(JVM)을 사용할 수 있지만, JVM은 라이선스 문제가 있어서 구글에서는 Dalvik VM을 따로 개발해서 안드로이드에 넣었습니다. 안드로이드 5.0 롤리팝부터는 Dalvik VM을 폐지하고 ART를 새로운 런타임으로 완전히 대체하며 x86, mips 아키텍처 및 64비트를 공식적으로 지원할 수 있게 되었습니다.
애플리케이션 프레임워크 계층(Application Framework Layer)
- Activity Manager : 애플리케이션내의 액티비티들을 관리 합니다.
- Content Providers : 애플리케이션간의 데이터 공유를 담당합니다.
- Telephony Manager : 음성통화를 관리합니다.
- Location Manager : GPS 또는 기지국신호를 통해 위치정보를 관리합니다.
- Resource Manager : 애플리케이션에서 우리가 사용하는 많은 종류의 리소스들을 관리합니다.
이 계층부터는 자바로 작성되며 기본 네이티브 라이브러리와 안드로이드 런타임을 추상화한 계층입니다. 안드로이드 애플리케이션은 자체 런타임에서 실행되며 Activity, Service, Broadcast Receiver, Content Provider와 같은 여러 구성 요소로 구성됩니다. 이러한 4대 컴포넌트는 다른 애플리케이션과 서로 상호작용할 수 있습니다.
애플리케이션 계층(Applications Layer)
Android 구조 스택의 최상위 계층에 있으며, 안드로이드기기를 사용하는 대부분의 사용자가 이 레이어와 상호작용하게 됩니다. 예를 들면, 전화걸기, 웹 브라우저, 카카오 톡, 게임 등. 개발자는 애플리케이션 프레임워크를 이용하여 애플리케이션을 개발한 다음 배포하여 설치되는 APK가 애플리케이션 계층에 속하게 됩니다.
Conclusion
안드로이드 구조에 대해서 간단하게 정리해보았습니다. 구조를 알고 앱 개발하는것과 모르고 그냥 개발하는것은 큰 차이가 있습니다. 적어도 왜 안드로이드 앱을 자바로 만들고 자바로 앱을 만들면서 생기는 특성정도만 알고 가셨으면 좋겠습니다.
구글은 애플과 비교해서 모바일 플랫폼 시장 후발주자로서 많은 개발자 유입을 위해 애플리케이션 개발언어로 자바를 택하게 됩니다. 그래서 앱 개발자 입장에서는 자바와 애플리케이션 프레임워크만 잘다루면 쉽게 앱을 만들 수 있게되었습니다. 하지만 안드로이드가 자바를 품으면서 가상머신을 반드시 사용하게 되는데 이로인해 범용성은 증가하고, 성능은 떨어지게 되었습니다. 초창기 안드로이드폰 버벅이는거 생각해보시면 이해가 쉽게 될것입니다.
12개의 댓글
vertte · 2020년 3월 16일 9:49 오후
안녕하세요 글 잘봤습니다! 확인좀 하고싶은게 있어서 묻습니당
“개발자 유입을 위해 애플리케이션 개발언어로 자바를 택하게 됩니다.”
안드로이드에 jvm이 기본 내장 되어 있지 않은 시기에
구글이 자바로 안드로이드 앱 을 만들고있었다는 뜻인가요?
답변해주신다면 감사하겠습니다
Charlezz · 2020년 3월 17일 9:00 오후
안드로이드에서 사용하는 가상머신(런타임)은 JVM이 아닌 DVM 을 거쳐 현재 ART를 사용하고 있습니다.
자바 언어로 컴파일된 바이트코드는 다시 D8컴파일러를 거쳐 DEX바이트코드로 변환됩니다. 안드로이드 초기(4.4 킷캣 이전)에는 DEX가 DVM에서 실행되었고, 현재는 ART에서 실행됩니다.
vertte · 2020년 3월 30일 4:43 오전
아 자바가 돌아가는 가상머신이라서 jvm 인줄알았는데 달빅이라는 친구군요
근데 달빅이전에는 어떻게 개발을 했죠 그때도 자바로 개발를 했나요?
android sdk 는 c/c++로 되어있으니 c/c++인가요 ?? 아니면 그전에도 자바로 개발을 했는지…
혹시 링크라도…👏
Charlezz · 2020년 3월 31일 3:28 오후
안드로이드 등장과 함께 Dalvik이 나왔기 때문에, 말씀하신 ‘달빅 이전에는…’ 질문의 의도를 잘 모르겠습니다.
일반적으로 안드로이드 앱 개발자는 Android SDK와 Java언어를 사용하여 앱을 개발하지만,
Android NDK와 C/C++언어를 이용하여 개발하는 방법도 있습니다.
Miso · 2020년 7월 14일 11:17 오전
좋은 글 감사합니다.
이해하기 쉽게 작성해주셔서 도움이 많이 되었네요 !
Charlezz · 2020년 7월 16일 10:39 오전
감사합니다 🙂
안드로이드궁그미 · 2021년 6월 8일 2:18 오전
안녕하세요. 안드로이드 구조가 궁금하여 검색 중 들어왔습니다.
최근, 안드로이드 포팅도 해보고 일부 코드도 삽입해보았습니다.
그런데 최적화를 위해 안드로이드 네이티브단이나 프레임워크를 건드려봤는데 안드로이드가 제대로 어떻게 굴러가는지를 알아야 더욱 잘 할 것 같습니다.
혹시 전체적인 코드의 흐름이나 구조를 알 수 있는 강의나 책이 있을까요?
감사합니다.
Charlezz · 2021년 6월 8일 10:33 오전
글쎄요.. 강의나 책이 있는지는 모르겠습니다.
아래의 링크를 통해 구글에서 호스팅하는 Git 저장소에서 AOSP를 받아서 전체 코드를 확인하실 수는 있습니다.
https://source.android.com/?hl=ko
김지훈 · 2021년 6월 9일 12:18 오후
무슨 내용으로 리서치를 하든 결국 이 블로그로 돌아오게 되는 마성의 블로그입니다. 항상 감사합니다 갓찰스님..
Charlezz · 2021년 6월 10일 12:44 오후
마성의 김지훈님 감사합니다.
아스트레아 · 2022년 4월 13일 12:23 오후
안녕하세요
글 아주 잘 봤습니다. 추가로 궁금한 사항이 있어서 문의드립니다.
흔히 루팅을 한다는것이 어디까지 접근권한을 얻는것인지 알고싶은데 아실까요?
글을 보아선 커널단 까지는 아닌것같아서 궁금해지네요~
Charlezz · 2022년 4월 13일 11:52 오후
안드로이드에서 커널은 리눅스커널을 말하고, 루팅은 이 리눅스 커널의 루트 권한을 얻는 것을 말합니다.
사실상 최상위 권한이기 때문에 안드로이드 기기의 모든 영역을 제어가능하다고 볼 수 있겠습니다.