본문 바로가기

무언가 만들기 위한 지식/Java/Android

Android Platform(안드로이드 플랫폼)에 대하여


2007년 안드로이드(Android)라는 모바일 플랫폼을 발표한후 여러 휴대폰 제조업체들이 안드로이드를 탑제한 폰을 출시하고 있으며, 더불어 임베디드 장비에도 안드로이드가 탑재되고 있다.

앞으로 필자의 블로그에서는 안드로이드에 대해 언급할 예정(?!)이기에,
안드로이드에 대해 들어가기전에 간단하면서도 복잡한 기본적인 개념에 대해 알고 넘어가자.
(사실 필자가 기억을 기록해놓기 위함이기도 하다. ^_^)

2007년 11월에 구글이 모바일 관련 여러 플레이어가 참여하는 OHA(Open Handset Alliance)라는 모임을 통해 [안드로이드-Android]라는 모바일 플랫폼을 발표하였고,
2008년 11월 대만의 제조업체인 HTC가 미국의 이동통신사인 T-Mobile을 통하여 최초의 안드로이드 단말기를 선보였다.

HTC 제품 홈페이지 : http://www.htc.com/us/product.aspx
(HTC의 홈페이지에서는 안드로이드나 윈도모바일이 깔린 단말기를 구분하기 쉽게 해놓았다.
각 단말기의 스펙등을 참고해 보자.)

최초의 폰은 HTC사의 G1이라는 단말기이다.


필자가 있는곳에도 실제로 보유하고 있고 말그대로 작년 11월 출시작이다.
이후 버젼들이 Dream/Magic/Hero/Tatoo등 이 출시된 상태이다. (지역마다 다르긴 하다.)

QWERT 키패드가 있어서 그런지, 옆면을 보게 되면 상단히 크고 투박하다.
또한 G1에는 독자적인 동영상 재생 코덱도 없고, 멀티터치도 가능하지 않다.
처음 여러 매니아들은 G1과 아이팟을 비교해가며 이런저런 불만이 많았지만, 새로운 폰이 등장하면서 그러한 부족감은 채워지고 있다.

※ 참고로 멀티터치가 불가능한것은 아니로 프로그램적으로 가능하게한 코드가 있다. 일측에서는 애플과 AT&T의 일종의 압박이 있었다고는 한다. (확인되지는 않았다.), 영상재생등은 자체 어플리케이션으로 가능하기는 하다.

결국 언급되는 단점들은, 하드웨어에 따라 지원되는 기능이 있고 없고의 차이다. 이로인하여 어플제작시 하드웨어에 맞추어 제작해한다는 이야기가 나온다. 결국 개발자는 기존과는 다른 모습의 안드로이드를 탑재한 폰이 나올때마다 코드를 수정해서 재배포해야한다는 이야기가 된다.

그런데 여기서 생각해봐야할 것은 안드로이드가 단지 폰에만 올라가는 플랫폼에 멈추지 않는다는 것이다.
폰뿐이 아니라 임베디드 장치, 랩탑에도 안드로이드가 활용 예정이다.

안드로이드에 대한 표현중 필자가 생각하는 표현은 다음과 같다.

운영체제부터 미들웨어, 그리고 자바언어로 개발되는 중요 애플리케이션까지를 모두 포관하고 있는
"소프트웨어 스택"

-Embedded World 2009 8월호

즉, 단지 WIPI같은 하나의 플랫폼이 아니라 커널까지 포함하고 있는 전체 계층을 말한다.
하드웨어를 제외한 모든 부분을 포괄하는 것이 안드로이드 이다.

위와 같은 정의로 인하여,
안드로이드를 탑재한 폰과 아이폰과와의 비교는 성립하기 어렵다.
아이폰은 하드웨어와 그위에 올라가는 macOS을 모두 하나의 회사에서 구성하고, 하드웨어를 확실하게 제어하고 설계하고 컨트롤 한다.
하지만, 안드로이드는 애초에 안드로이드 폰까지 모두 설계하여 제공하기 보다는 안드로이드라는 전체적인 플랫폼을 공개하여 다른 회사에다가 던져준 것이다. (비록 Google이 G1에 어느정도 개입했더라도.)

※ 그런데 여기서 좀 더 생각해보면,
    안드로이드가 하드웨어에 종속적인 것이 아니라
    하드웨어가 안드로이드에 종속적이라는 생각이 든다.
    안드로이드는 구글(Google)에서 밀어주기 때문에 새로운 버젼으로(예를 들면 1.5~2.0) 업그레이드가 되어 기능이 추가될때, 하드웨어가 이를 맞춰가는 현상이 생기기 때문이다.
    (Google이 워낙 강해서 말이다.)

    아무튼 개발자가 어플리케이션을 개발할때 하드웨어의 스펙에 대해 고려해야하는 점은 명백하다.
    이는 곳 배포에서도 신경쓸것이 늘었다는 것이며, 아이팟의 앱스토어에 비해 많은 불편함을 갖는다. (비교!에 의해)
    => 실제로 그래서 많은 불만이 존재한다. (Survey를 하다보니...)

    사실 위에서 아이팟과 안드로이드가 탑제된 폰이 비교대상으로 삼기 애매하다고 했으나, 삼지 않을 수 없다 -.,-;
    필자가 말하자고 하는 것은 과연 아이팟 자체와 안드로이드 탑재폰을 비교하느냐, 아이팟과 안드로이드 플랫폼과 비교하느냐의 차이다. 하지만 애플과 구글의 전략자체부터 비교하자면 이야기는 달라진다.
  

안드로이드에 대해 이야기하면 가장 많이 불수 있는게 바로 아래 안드로이드 아키텍쳐이다.


필자가 아무리 여기저기를 뒤져봐도 가장 안드로이드에 대해 명확하게 표시되어 있는 그림이다.
보시다시피 하단부에는 LinuxKernel부분이 있고 그 위에는 여러 LibrariesDalvik Virtual Machine이 보이고 그 위에는 Framework와 가장 상단의 Application들이 보인다.

색깔의 의미는,
빨간색 C언어만 사용되었고,
녹색CC++의 혼용
파란부분은 JAVA로 구성되었음을 의미한다.

리눅스의 커널과 상위 프래임 워크가 나누어져 있다는 것은 하드웨어와 소프트웨어가 분리된 구조로 어는 하드웨어든지 안드로이드를 쉽게 이식할 수 있다는 것을 의미한다. 커널이외의 것들은 리눅스와 관련이 없는 상태이다.

라이브러리 계층의 libc(C standard library)의 경우 리눅스의 일반적인 glibc가 아닌 BSD계열의 bionic C 표준 라이브러리를 사용하고 있는데, 이것은 라이선스의 문제인 듯 싶다. GPL(GNU General Public License)로 보호되는 리눅스의 컴포넌트를 이용하면, 이를 이용한 모든 소스코드도 GPL의 규정에 적용받게 되어 소스공개를 해야하기 때문에, 안드로이드를 이러한 제한에서 자유롭게 하기 위하여 GPL의 규정은 커널계층에만 적용되게 하고, 나머지 모든 소프트웨어 스택은 리눅스와 관련이 없고 소스공개의 의무가 존재하지 않는 아파치 라이센스(Apache License)등의 라이선스를 따르느느 구조이다.

- 출처 : Embedded World 2009.8_47p

위 자료에 따르면 결국 안드로이드도 말만 개방형 플랫폼이지 절대 전체 공개는 아닌 셈이다.

달빅(Dalvik)
안드로이드에는 VM(Virtual Machine)방식의 런타임 계층을 따로 두고 있다.
안드로이드는 자바를 중심으로 어플리케이션이 개발되는데, 모바일 환경에서의 성능의 최적화를 위하여 자체적으로 달빅(Dalvik)이라는 JVM(Java Virtual Machine)을 개발하였다.
(물론 현재 Java뿐만이 아니라 바로 C,C++을 통해 제어가 가능하다. NDK를 공식적으로 구글에서 제공해주어 사용할 수 있다. -사실 이전에는 개발자들이 알아서 C,C++을 돌려서 사용하였었다.)

※ Java와 C,C++을 연결해주는 JNI(Java Native Interface)가 존재한다. 이를 통해 시스템제어인 C코드와 Java를 연결해 준다.
후에 JNI에 대해 포스팅을 할 예정 ^_^;


안드로이드는 달빅이라는 런타임환경으로 HW와 SW를 계층화 하고 있다.

Google은 Dalvik을 개발하면서 기존의 SunJVM보다 작은 메모리 환경에서도 잘 돌 수 있도록 성능 개선의 효과도 얻으면서 자바를 탑재할 때의 라이선스 비용의 문제에서도 벗어날 수 있도록 배려를 하고 있다.
- 출처 : Embedded World 2009.8_47p