안드로이드 플랫폼

구글이 지난 2007년, 안드로이드(Android)라는 새로운 모바일 플랫폼을 발표한 이래 삼성전자나 모토로라 등 여러 휴대폰 제조업체들이 안드로이드의 물결에 동참하고 있다. 비단 휴대폰 뿐만 아닌 다른 여러 임베디드 장비에도 안드로이드를 탑재하여 상용 플랫폼으로 사용하겠다는 움직임이 활발하게 일어나고 있다. 이 글에서는 이렇듯 임베디드 업계에 많은 관심을 불러일으키고 있는 안드로이드의 플랫폼 구조를 분석해보고, 안드로이드의 애플리케이션 개발 방식에 대해서 다뤄보기로 한다.
글: 이승민 / 네무스텍 CTO
zaharang@gmail.com
2007년 11월에 구글이 모바일 관련 여러 플레이어가 참여하는 OHA(Open Handset Alliance)라는 모임을 통해 '안드로이드(Android)'라는 새로운 모바일 플랫폼을 발표하였다. 그 이후로 전 세계의 모든 휴대폰 제조사나 통신사업자들, 그리고 일반 사용자들의 뜨거운 관심을 끌었고, 2008년 11월 대만의 제조업체 HTC가 G1이라는 이름으로 미국의 T-Mobile 이동통신사를 통해 최초의 안드로이드 단말을 출시하였다.
올해에도 안드로이드에 대한 관심은 계속 이어져서 HTC는 G1폰의 후속 모델인 'Dream'의 출시나 'Hero' 등의 계획을 계속 잡고 있고, 삼성전자나 모토로라 등 여러 휴대폰 제조업체들이 안드로이드의 물결에 동참하고 있다. 비단 휴대폰 뿐만 아닌 다른 여러 임베디드 장비에도 안드로이드를 탑재하여 상용 플랫폼으로 사용하겠다는 움직임이 활발하게 일어나고 있다.
이 글에서는 이렇듯 임베디드 업계에 많은 관심을 불러일으키고 있는 안드로이드의 플랫폼 구조를 분석해보고, 안드로이드의 애플리케이션 개발 방식에 대해서 다뤄보기로 한다.
안드로이드 플랫폼 안드로이드를 간단하게 표현하자면 운영제체(OS, Operating System)부터 미들웨어, 그리고 자바(Java) 언어로 개발되는 중요 애플리케이션까지를 모두 포괄하고 있는 "모바일 단말을 위한 소프트웨어 스택"이다. 즉, 단말기에서 하드웨어를 제외한 나머지 모든 소프트웨어의 계층을 다 포함하고 있다.
개방형 플랫폼 (Open Platform) 안드로이드의 제일 큰 특징은 개방형 플랫폼이라는 사실이다. 구글은 대부분의 안드로이드 소스 코드를 완전 개방하였고, 이에 따라 누구든지 안드로이드를 이용하여 제한없이 안드로이드 기반의 모바일 기기를 만들 수 있게 되었다. 아래 [그림 1]은 안드로이드의 시스템 계층 구조를 표현하고 있다.
가장 아래 부분이 OS 부분을 담당하고 있는 리눅스 커널(Linux Kernel)이고, 이 위에 여러 라이브러리(Libraries)와 안드로이드 런타임(Android Runtime)이 존재하고, 그 위에 애플리케이션 프레임워크(Application Framework)와 중요 애플리케이션들로 이루어진다.
[그림 1]의 계층은 색깔별로 사용되는 개발 언어가 구분되어 지도록 하고있다. 리눅스 쪽의 빨간 부분은 C언어만 사용되고 있고, 라이브러리의 연두색 계층은 C와 C++이 혼용된 부분이다. 그리고 프레임워크와 애플리케이션 쪽의 파란 부분은 모두 자바로 구성된다.
앞서 이야기하였듯 안드로이드는 완전한 개방형 환경을 지향하고 있으므로 시스템의 커널 또한 개방형 OS인 리눅스(Kernel 2.6.x)를 채택하고 있다. 리눅스는 이미 수많은 하드웨어에 이식되어 검증이 된 OS로, 안드로이드는 하드웨어나 주변기기에 대응하기 위하여 리눅스 커널을 사용하여 보안, 메모리 관리, 프로세스 관리 등의 HW 종속적인 작업을 수행한다.
이렇게 추상화 되어 HW와 SW가 분리된 구조를 통해 어떠한 HW에도 쉽게 안드로이드를 이식할 수 있는 장점을 갖게 된다. 즉, 대부분의 리눅스가 잘 동작하는 임베디드 하드웨어에는 간단한 이식으로 안드로이드를 동작시키는 것이 가능하다. 반면 이러한 커널(Kernel) 외의 나머지 안드로이드 계층은 전혀 리눅스와 관련이 없는 상태이다.
예를 들어 라이브러리 계층의 제일 중요한 libc(C standard library)같은 경우도 리눅스의 일반적인 glibc가 아닌 BSD 계열의 bionic C 표준 라이브러리를 사용하고 있는데, 이것은 라이선스의 문제로 판단된다. GPL(GNU General Public License)로 보호되는 리눅스의 컴포넌트를 이용하게 되면, 이를 이용한 모든 소스 코드도 GPL의 규정에 적용받게 되어 소스 공개를 하여야 하기 때문에, 안드로이드를 이러한 제한에서 자유롭게 하기 위하여 GPL의 규정은 커널 계층에만 적용되게 하고, 나머지 모든 소프트웨어 스택은 리눅스와 관련이 없고 소스 공개의 의무가 존재하지 않는 아파치 라이선스(Apache License) 등의 라이선스를 따르는 구조로 설계되어 있다.
달빅 : VM (Virtual Machine) Run-time Layer 우리나라 모바일 시장에서 표준화된 애플리케이션 개발을 위해 위피(WIPI)를 이용하고 있는 것처럼 안드로이드도 이와 유사하게 VM(Virtual Machine) 방식의 런타임 계층을 따로 두고 있다. 안드로이드의 가장 큰 특징 중의 다른 하나가 바로 모든 애플리케이션이 자바로 개발이 된다는 점이다. 안드로이드는 모바일 환경에서의 성능의 최적화를 위하여 자체적으로 달빅(Dalvik)이라는 JVM(Java Virtual Machine)을 개발하였다. 안드로이드는 이러한 달빅이라는 런타임 환경을 통해 더 확실하게 HW와 SW를 계층화 하고 있다. 표준 WIPI가 탑재된 어떠한 단말에서도 동일한 어플을 실행할 수 있는 것과 마찬가지로 안드로이드도 달빅이 동작하는 모든 단말에서 안드로이드 어플이 동일하게 실행가능하다.
구글은 달빅을 개발하면서 기존의 Sun의 JVM보다 작은 메모리 환경에서도 잘 돌 수 있도록 성능 개선의 효과도 얻으면서 자바를 탑재할 때의 라이선스 비용의 문제에서도 벗어날 수 있도록 배려를 하고 있다.
웹킷 엔진 탑재
안드로이드의 핵심 라이브러리 중에 중요하게 눈에 뜨이는 것은 웹킷(WebKit)이 될 것이다. 즉, 안드로이드는 메인 브라우저의 웹엔진으로 웹킷을 이용하고 있다. 웹킷은 웹 브라우저를 만드는데 기반을 제공하는 오픈 소스 라이브러리로 애플의 Safari나 아이폰에 들어가 있는 브라우저, 노키아의 심비안 S60의 브라우저, 구글의 크롬(Chrome) 브라우저 등이 모두 이 웹킷을 근간으로 하고 있다.
구글의 중요한 사업 분야가 모두 Web을 기본으로 하는 서비스이기 때문에, 안드로이드의 웹브라우저도 모바일 환경에서 풀브라우징(full browsing)을 원활히 할 수 있도록 최적화되어있다. 당연히 웹 표준도 100% 준수하고 있고, 브라우저 뿐만 아니라 일반 애플리케이션에서도 쉽게 웹 화면을 구성할 수 있는 구조를 제공한다.
아직까지 플래시(Flash)는 제공되지 않고 있지만 HTC에서 곧 발표 예정인 Hero 단말에서는 Adobe사와의 작업을 통해서 Flash Player 9버전이 제공된다고 한다.
안드로이드의 계층 구조 중의 중요 부분을 설명하였는데, 안드로이드의 가장 큰 설계 목적은 개방성과 효율성이다. 애플리케이션을 자바로 개발하도록 하게 함으로써 쉽게 일반 개발자가 범용적인 애플리케이션 개발이 용이하도록 하였고, 여러 데이터를 쉽게 처리할 수 있는 라이브러리 컴포넌트를 제공하여 구글이 가지고 있는 여러 서비스에 연동하기 쉽도록 하는 등 확장성도 많은 고려를 하고 있다.
안드로이드의 애플리케이션 개발
안드로이드는 오픈 플랫폼답게 여러 오픈 소스 등을 결합하여 편리한 애플리케이션 개발 도구를 제공하고 있다. http://deve-loper.android.com에서 안드로이드 개발자 도구 SDK (Soft-ware Development Kit)을 다운로드 받으면 바로 애플리케이션 개발이 가능하다.
[그림 3]은 SDK에 포함되어 있는 안드로이드 에뮬레이터이다. 실제 단말기가 없이도 개발자들은 위의 에뮬레이터를 통하여 만들어진 애플리케이션 등을 탑재해서 소프트웨어를 테스트하거나 통화, SMS 등의 이벤트를 에뮬레이트하는 것이 가능하다.
안드로이드의 애플리케이션은 자바로 개발되기 때문에 자바 통합툴로 가장 유명한 이클립스(Eclipse) 개발 환경을 이용하게 된다. SDK를 설치하면 이클립스의 플러그인 형태로 안드로이드 전용 애플리케이션을 개발하여 안드로이드 에뮬레이터 등 여러 도구들과 자동으로 연결할 수 있게 된다.
에뮬레이터 외에도 DDMS(Dalvik Debug Monitor Service)와 같이, 여러 가지 안드로이드의 내부 상황을 모니터링, 디버깅할 수 있는 디버깅 툴과 안드로이드에 애플리케이션을 설치하거나 내부에 쉘(shell)을 이용하여 접근해서 여러 가지 작업을 수행할 수 있도록 해주는 ADB(Android Debug Bridge), 그리고 디버깅 로그를 관리할 수 있는 logcat, 안드로이드의 화면 View를 분석하고 계층화된 다이어그램 등으로 그려주는 Hierarchy Viewer 등 다양한 T도구들이 있어서, 일반적인 임베디드 개발 환경보다 훨씬 풍부하고 효율적인 통합 개발 환경이 제공된다.
실제 단말 디바이스에도 ADB를 연결해서 직접 제어가 되기 때문에 에뮬레이터와 연결한 것과 동일하게 이클립스(Eclipse) 환경에서 바로 실행하면 단말에서 실행이 되고, 라인 단위의 디버깅도 바로 지원이 가능하다.
안드로이드 전체 소스를 받아서 시스템을 빌드하기 위해서는 몇 가지 시스템의 제약(Linux나 Mac OS상에서 개발 도구가 갖추어져야 함)이 있지만 일반 애플리케이션 개발을 위해서는 이클립스와 Java Compiler(JDK)만 설치가 되면 되기 때문에 Windows XP/Vista, Linux, MacOS 등 대부분의 운영체제에서 쉽게 사용할 수가 있다.
안드로이드 애플리케이션 종류
안드로이드의 애플리케이션은 자바로 이루어진다고 앞서 이야기하였지만, 정확하게 이야기하자면, 일반적인 Dalvik VM 위의 일반 매니지드 애플리케이션 (Managed Application), Native Code가 포함된 애플리케이션과 Ajax로 구성된 웹 브라우저용 애플리케이션, 3가지의 종류가 존재한다.
구글 개발자 행사(Google I/O)에서 구글 플랫폼을 총괄하는 Dan Morrill이 각각의 애플리케이션 종류에 대해서 자세한 설명을 하면서 데모 샘플을 만들어서 공개하였으니 이를 보면 좋은 참조가 될 것이다(http://code.google.com/p/hdict).
a) Managed Application 가장 기본적이고 주요한 안드로이드 애플리케이션 개발 방식으로 달빅 VM에서 동작하는 순수 자바로만 프로그램을 개발하는 것을 말한다. 달빅은 앞의 플랫폼 소개에서 이야기 하였듯이 임베디드 단말에 최적화된 VM으로 메모리 보호(Memory Protection), 가비지 컬렉션(Garbage-collection), 라이프 사이클 관리 등의 특징을 갖는다. 안드로이드는 달빅 위에 여러 프레임워크 API를 제공하고 있고, OpenGL이나 Multimedia 등의 라이브러리에서 지원하는 기능 또한 API 형태로 달빅 위에서 이용할 수 있도록 제공한다.
개발자는 SDK에서 제공하는 이클립스 플러그인을 통해서 쉽게 UI를 구성하면서 개발이 가능하다. 순수 자바로만 개발을 해도 대부분의 Rich UI가 구성 가능하고 백그라운드 서비스까지 개발이 가능하기 때문에 사실상 대부분의 안드로이드 애플리케이션은 이러한 방식으로 개발된다. 다만 자바라는 언어의 특성상, 약간의 속도 저하와 예측 불가능한 Garbage collection의 수행이라는 약점을 가지고 있다. 또, 하드웨어나 라이브러리와 밀접하게 결합이 되어야 하는 경우는 기존의 프레임워크 API로는 충분하지 않기 때문에 아래에서 소개할 Native 방식을 혼용하여 사용하여야 한다.
b) Native Application
Native 방식은 달빅 애플리케이션으로 실행은 하고 달빅 내에서 C/C++으로 구성된 동적 라이브러리를 로드(Load)하여 JNI(Java Native Interface) 형태로 함수를 호출하는 방식을 이야기한다. 구글이 최근 NDK(Native Development Kit)을 따로 배포하여 C/C++의 코드를 손쉽게 .so 형태의 라이브러리로 cross-compile하여 생성할 수 있게 되었다.
이러한 방식의 가장 큰 장점은 역시 성능(속도) 개선이다. CPU의 의존도가 높은 계산 프로그램이나 물리 연산 등의 프로그램 등은 아무래도 VM 방식으로 동작하는 자바언어보다 C언어가 유리할 수 밖에 없다. 그리고 반응 속도가 중요한 입력창의 검색부분이나 대용량의 데이터를 다루는 경우, 또한 하드웨어를 직접 다루거나 기존 달빅 API로 구현하기 어려운 경우에도 Native 언어로 구현하는 것이 효율적이다.
이 방법은 효율적으로 성능향상을 할 수 있는 반면, 달빅 위에서 돌아가는 것이 아니기때문에 달빅 내의 Sandbox로 보호받는 효과를 누릴 수 없으므로 메모리 제어를 신경 써야하는 등 프로그램 개발에 보다 세심한 관리가 필요하다.
안드로이드의 기본 애플리케이션 중에서도 이러한 방식으로 개발된 것이 많은데, 카메라 애플리케이션이 대표적인 예일 것이다. 실제 카메라 모듈을 제어하거나 오버레이를 통해 화면에 프리뷰를 뿌리는 등의 동작은 당연히 C언어로 구현되어 있고 JNI를 통해서 이를 사용할 수 있는 자바의 클래스들이 따로 존재하게 된다.
필자의 경우, 안드로이드의 프레임워크를 변경하여 다양한 3D 효과를 표현할 수 있도록 하는 티파니(Tiffany)라는 자체 프레임워크 솔루션을 개발하고 있다. 다양한 3D 모델링이나 렌더링 작업는 당연히 안드로이드의 OpenGL/ES를 이용하고 있으나, 순수 자바로 구현하게 되면 텍스처의 매핑 작업에 많은 시간이 걸리고, 또한 메모리의 제약사항 때문에 여러 가지 문제가 발생하여 대부분의 작업은 Native로 OpenGL/ES를 직접 제어하여 만들고, 만들어진 클래스를 자바에서 호출하는 방식으로 구현을 하니 HTC G1 폰과 같이 하드웨어 기반의 3D 가속이 되는 단말에서는 상당히 부드러운 움직임과 빠른 프레임 속도를 갖는 구현이 가능하였다.
c) Ajax Application Ajax 방식은 사실상 안드로이드 애플리케이션이라기보다는 웹 서버에 자바스크립트(JavaScript)와 Ajax 등으로 웹페이지를 작성하고 안드로이드의 브라우저를 통해서 수행하는 방식이다. 앞서 브라우저에 기술하였듯이 웹킷(Webkit) 코어와 SquirrelFish 자바스크립트 엔진을 사용하고 있으므로 PC 기반에서의 동작과 거의 유사할 정도의 기능을 제공한다.
Gmail이나 Google Docs같은 구글의 대표 웹서비스가 순수하게 Ajax로만 구현된 것을 보면 알 수 있듯이 Ajax로도 상당히 복잡한 어플리케이션 개발이 가능하다. 안드로이드에서는 브라우저 내에서 이러한 Ajax나 HTML5의 일부 규격을 제공하여 이질감 없이 웹 애플리케이션을 일반 애플리케이션처럼 개발할 수 있도록 제공한다. 다만, 웹애플리케이션의 특성 상 항상 브라우저를 통해서 수행이 되어야 하므로 백그라운드 서비스 등이 불가능하고, 시스템이나 프레임워크 내의 접근이 불가능하다는 단점은 있다.
그리고 UI(User Interface)를 구성하는 렌더링 속도가 아무래도 브라우저를 한 단계 더 거치기 때문에 일반적인 달빅 애플리케이션에 비해 굉장히 느린 편이다. 그렇기 때문에 UI의 속도가 중요하지 않고, 보다 범용적이고 간단하게 만들 수 있는 애플리케이션 개발에 적합한 방식이다.
안드로이드 로드맵과 미래
오픈 소스 환경 특성 상, 여러 개발회사와 개발자들이 참여하고 있는 안드로이드의 발전 속도는 매우 빠른 편이다. 안드로이드의 전체 구조는 구글 및 OHA의 주도로 이루어지지만, 플랫폼에 포함되어 있는 수많은 여러 라이브러리들은 각각의 향상된 버전들을 계속 차용해서 적용되고 있다.
예를 들어 리눅스 커널의 경우, 버전 2.6.18 부터 시작을 했지만 최신 안드로이드 커널은 2.6.29 버전의 가장 최근 커널을 이용하고 있고, 웹킷(WebKit) 같은 경우도 오픈 소스 쪽의 변경 사항에 맞춰서 끊임없이 버전업을 하고 있다.
대만의 HTC 사에서 G1 단말을 발표하면서 처음 안드로이드 1.0 버전이 공개된 이후에, 다국어 지원이나 입력기 등의 업데이트가 이루어진 안드로이드 1.5 컵케익(Cupcake) 버전이 지금 현재 쓰이고 있는 버전이다. 이후 제스처(Gesture)나 iPhone에서 추가된 것과 같은 전체 검색(Universal Search) 기능, TTS(Text to Speech) 등의 기능이 안드로이드 2.0 도넛(Donut) 버전에서 추가될 예정이다.
(참고: 구글은 특이하게 빵 이름으로 알파벳 순서에 맞춰 코드 네임을 부여하고 있다. 발표되지 않은 다음 버전은 아마도 Eclair-슈크림이 될 예정이라고 한다)
처음에 구글이 안드로이드를 발표하였을 때 사람들은 애플의 아이폰과 마찬가지로 구글폰 같은 단말을 직접 제조하여 시장에 선보이는 것이 아닌가 하는 예측을 한 적이 있었으나, 구글 측에서는 앞으로도 자신들이 직접 단말 제조에 나서는 일은 없다고 단언하고 있다.
그렇다면 구글이 엄청난 비용과 인력을 투입하여 안드로이드 플랫폼을 단말 제조사들에게 배포하는 이유는 무엇일까. 사실상 구글의 전략은 매우 명확하다. 구글은 현재 인터넷 시장의 최강자이다. 검색과 광고를 통해 막대한 이익을 얻고 있는 사업을 모바일로도 확대하고 싶을 것이다. 즉, 모바일 단말 뿐만 아니라 여러 임베디드 단말 등을 PC화하여 수많은 구글의 인터넷 서비스와 콘텐츠에 쉽게 접근하도록 하여 오픈 환경에서도 승자가 되겠다는 전략인 것이다.
안드로이드는 구글이라는 강력한 뒷받침 아래 오픈 플랫폼, 무료 솔루션이라는 장점 외에도 개발의 용이성이나 안정적인 Linux OS의 탑재 등 여러 매력적인 점이 있다. 반면, 빠른 개발과 편의성을 위해 자바를 주 언어로 선택하고 있기 때문에 갖는 성능상의 약점과 너무 많은 구글에의 의존성으로 인하여 실제로 단말 제조사 입장에서는 꺼려지는 점도 존재한다.
구글의 구상대로 안드로이드가 범용적인 임베디드 플랫폼이 되기 위해서는 먼저 시장의 반응을 얻어서 좋은 개발자와 단말 제조사들의 지원을 확보하는 것이 가장 중요하다. ADC(안드로이드 경진 대회, Android Developer Challenge)와 같은 행사를 통해서 개발자들의 관심도 많이 높아진 상태이고, 2009년 하반기부터 HTC 뿐만 아니라 다른 여러 단말 제조사들도 다투어 안드로이드 단말을 출시할 기세이므로 처음 출발은 상당히 밝은 편이다.
스마트폰 시장을 장악하고 있는 노키아도 자사의 심비안(Symbian) 플랫폼을 오픈화 하겠다고 공언을 하고 있고, 완성도 있는 디자인과 앱스토어의 성공으로 아이폰도 꾸준히 점유율을 높여가고 있다. 그리고 잊혀진 줄 알았으나 WebOS 라는 독특한 컨셉으로 등장한 Palm Pre도 현재 시장의 좋은 반응을 얻고 있어서 모바일 플랫폼의 경쟁은 더욱 가속화 될 듯 하다.
안드로이드는 모바일 뿐만 아니라 임베디드 환경에도 다양하게 적용될 수 있는 플랫폼이니만큼 MID단말, 내비게이션 단말, IPTV 등 기존의 다른 여러 플랫폼에 어떻게 빨리 적용될 수 있는지가 성공의 관건일 듯 하다. 아울러 안드로이드를 사용하여 소비자용 제품으로 판매하는 입장에서는 안드로이드의 확장성을 이용하여 얼마만큼 다른 제품과 차별화할 수 있는지, 사용자 인터페이스나 디자인, 가격 등의 특징이 제일 중요할 것이다.
그림 1. 안드로이드 시스템 구조 그림 2. 안드로이드의 웹킷(WebKit) 기반 브라우저 그림 3. 안드로이드 에뮬레이터 그림 4. 티파니 UX 프레임워크 3D 샘플: Coverflow Style(왼쪽)과 Cube Style 그림 5. HTC Hero에 탑재예정인 Sense UI, 전체 UI framework 구조에 많은 변경을 가하여 기존의 안드로이드 UI에 비해 확연하게 차별화되어 있음.
이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지