이지랑드로랑 - 2장. 안드로이드란 무엇인가?

 

오늘은 안드로이드가 뭔지, 간단하게 알아봐요.
와~ 신나고 해피하죠? ... 해피해야 합니다. 왜냐면 그래야 제가 신나니까요.

 

안드로이드! 하면 떠오르는게 바로 구글이죠.
몇년전부터 구글이 꼼지락꼼지락 움직이며 지구를 정복하기 위해 계획한 프로젝트, 안드로이드.
안드로이드는 상대적으로 독점이 덜한 모바일 OS 시장을 선점하기 위한 구글의 전략이라고 볼수 있는 작품이죠.

 

그런 신문에서나 볼수 있는 글 말고 개발자답게 접근을 해볼까요?h
... 사실... 저도 잘 몰라요.
강좌를 쓰는 사람이 초반에 이런말을 하면 기운이 쫙쫙 빠지시겠지만 사실입니다. ^^;
그래서 여러분의 리액션이 매우 중요하고, 또 잘못된 것이 있으면 알려주셔야 합니다.
그래야 우리가 함께 살아가는 아름다운 세상이 되는것이죠.
'훗, 바보녀석! 틀렸군!' 이러고 혼자만 잘못된거 알고 계시만 미워할꺼에요~

자! 아키텍쳐 레이어부터 봅시다.

 

[그림2-1. 안드로이드 아키텍쳐 레이어]

 

최상위 레이어는 응용 프로그램 영역 입니다.
일반적으로 안드로이드 소프트웨어를 개발한다 싶으면 99%는 여기서 개발이 이루어지게 됩니다.
그리고 그 아래, Application Framework 영역이 바로 안드로이드의 프레임워크 부분이 되겠습니다.
여러가지 데몬서버 형태로 돌면서 안드로이드를 관리해주는 프로세서들이죠.

 

Libraries과 HAL 영역은 네이티브로 개발되어 안드로이드 프레임워크로 연결이 될 수 있도록 하는 부분이 되겠습니다.
Dalvik(안드로이드용 Java VM) 또한 여기에 들어갑니다.
이 영역은 C 혹은 C++로 개발되어 있습니다.
하드웨어를 컨트롤할 수 없는 Java 어플리케이션들은 JNI라는 통로를 통해서 안드로이드 내부 프로세서들과 통신을 하죠.
표준 GLIBC가 아닌 BIONIC 이라는 것을 사용한다는 점도 매우 특이하죠.
참 어려운 부분 입니다.

 

그리고 맨 아래는 색부터가 정렬적이네요.
커널입니다.
커널은 리눅스 커널이 쓰이게 됩니다만... 표준은 아닙니다.
표준이 아니라는 점에서 좀 당황스럽기는 하지만 모바일화 하기 위해 취한 조치라고 합니다. (전 다르게 봅니다만...)
어찌되었건 리눅스 커널을 쓰기 때문에 안드로이드가 임베디드 시장으로 침투하기 좋게 되었다고 봅니다.

[그림2-2 커널 레이어]

 

커널 이야기를 좀 하고 넘어갈까요?
오늘(09.11.04) 날짜로 가장 최근 커널은 2.6.29 이고 안드로이드 2.0도 여기에 최적화 되어 개발되었습니다.

 

안드로이드 커널은 리눅스지만... 가장 큰 특징인 GLIBC를 지원하지 않는다는 점!
Native Windwing System 이아니라는 점!
EABI를 지원하고 Binder를 사용한다는 점이 가장 큰 특징이 되겠습니다.
EABI 사용으로 인해 floating point 성능이 향상되었고 soft-float과 hard-float 코드의 혼용이 가능합니다.
또한 구조체 팩킹이 용이하고, 호환성이 증가되었다고 하네요.

 

안드로이드 커널은 반드시 아래와 같은 부분이 추가되어야 합니다.
Alarm, Low Memory Killer, Ashmem, Kernel Debugger, Binder, Power Management, Logger

 

[그림2-3. Power Management 흐름도]

 

그림2-3이 바로 Power management 관련 흐름도 입니다.
그리고 안드로이드는 돌면서 따로 프로그램을 종료시키고 다는게 없습니다.
Low memory killer란 녀석이 내부적으로 움직이면서 메모리가 부족하면 운영체제 내부의 우선순위 알고리즘에 의해 프로세스를 죽입니다.
요즘 대부분 모바일 운영체제가 이방식을 택하죠.

[그림2-4. Libraries]

 

라이브러리들에 대해서도 간단히 살펴 볼까요?
아래 표는 참고하세요.

 

Category

 Shared object listing

 Bionic Libc & utils

 libc.so, libstc++.so, libdl.so, libm.so, libcutils.so

 Function Libraries

 libwebcore.so, libsqlite.so, libpv.so, libpvdownload.so, libpvdownloadreg.so, libpvnet.so, libpvrtsp.so, libpvrtspreg.so, libril.so, libreference-ril.so, libexpat.so, libcudata.so, libcui18n.so, libcuuc.so, libutils.so, libctest.so, libz.so

 Native Servers

 libmedia.so, libmedia_jni.so, libsurfaceflinger.so, libsql.so, libcorecg.so, libFFTEm.so, libGLES_CM.so, libagl.so, libaudioflinger.so, libsonivox.so, libpixelflinger.so, libvorbisidec.so, libsystem_server.so, libevent.so, livui.so, libthread_db.so, libpim.so, libnativehelper.so, libdbus.so, librpc.so

 Hardware Abstraction Libraries

 libhardware.so, libadsp.so, livAUPL_jni.so, libaudio.s

 

- LIBC
임베디드 환경에 맞게 구현된 Libc 입니다.
BSD 라이선스! 즉, 사용자 영역에서는 GPL을 피할 수 있다는 이야기가 됩니다. (구글... 음...)
그리고 참 크기가 작습니다. libc.so 파일이 231Kbyte 밖에 안됩니다.
경량이면서 빠른 pthread를 지원하죠.
그러나 POSIX를 준수하지 않죠.
또한! C++ Exception, Wide Character를 지원하지 않습니다.
Glibc오하도 호환되지 않습니다. ㅡ_ㅡa
모든 Native 프로그램은 Bionic과 함께 빌드되어야 합니다만, 일단 그렇게만 되면 경량에 고성능이 됩니다.

 

- WebKit
오픈소스인 WebKit Browser 기반입니다. (애플 사파리와 심피안, 크롬이 엔진으로 사용)
요즘 유행하는 풀 브라우징을 지원합니다.
이게 사실 놀랄 노짜인데... 엄청나게 빠르고 고해상도의 풀 브라우징을 지원합니다.
CSS 100% 지원하고 Java Script, DOM, Ajax 지원합니다.

 

- SQLite
역시 오픈소스 프로젝트인 SQLite를 내장화 했습니다.
경량의 DB 솔루션이 제공되고 안드로이드 내부의 다양한 서비스들이 이 SQLite를 사용합니다.
현재는 SQLite3 를 지원하고 있습니다.

- Media Framework
PocketVideo OpenCore 플랫폼을 기반으로 되어있습니다.
표준 비디오, 오디오, 스틸프레임 포맷을 지원합니다.
MPEG4, H.264, AAC 등을 지원합니다만, 코덱 사용시 라이센스를 주의해 주셔야겠습니다.
H/W, S/W 코덱 플러그인을 지원합니다.

 

-Surface Manager
모든 응용프로그램의 Surface rendering을 프레임버퍼로 전달합니다.
여러 응용 프로그램에서 2D와 3D를 동시 표현하는 것이 가능하고 Binder IPC 콜을 통해서 버퍼를 전달합니다.
OpenGL ES와 2D H/W Accelerator를 플러그인 형태로 지원합니다.
Page-Flip을 이용해 더블버퍼링을 합니다. (Y-Pan)

 

[그림2-5. Surface Flinger]

 

- Audio Manager
Audio Flinger는 모든 오디오 출력을 담당합니다.
Muliple Audio Stream을 PCM 오디오로 처리합니다.
ALSA를 이용할 수 있습니다.

[그림2-6. HAL]

 

Hardware Abstraction Layer (HAL)
이것은 사용자 영역에서 C/C++ 라이브러리 형태로 존재합니다.
안드로이드와 하드웨어와 만나는 연결고리 역할을 해주는 존재죠.
Audio Interface, Graphic Interface, WiFi등이 대표적이 되겠습니다.
개발자가 쉽게 표준화된 API 들로 구성되어 있습니다.
원한다면 여기에 사용자 정의 컴포넌트들을 넣을 수 있겠죠?
여러가지 드라이버들을 Kernel에 넣으면 GPL에 의해 공개해야 하지만 HAL로 들어가면 GPL이 아니게 됩니다.
즉! 공개 하기 싫으면 여기에 디바이스 드라이버를 짜 넣으시면 됩니다.
라이센스는 민감한 문제이니까요.

오늘은 안드로이드의 간단한 개념에 대해서 설명해 보았습니다.
여러분들에게 도움이 되었는지 모르겠네요.
이렇게 개념적인 설명은 참 말이 쉽지만 또 직접 개발하려면 무한 삽질의 시작이죠?
그래도 안드로이드가 어떻게 구성되어 있는지 알면 생각할 때 도움이 될거라 사료되어 2장은 이렇게 준비해 보았습니다.

자! 그럼 모두모두 해피 개발~