정보공간_1

[Android System 분석] 01. 안드로이드란? 본문

IT 놀이터/IT Storehouse

[Android System 분석] 01. 안드로이드란?

알 수 없는 사용자 2011. 10. 8. 03:43

  안녕하세요. 저는 강남멤버십 20-1기 유성배, 그리고 18-2기 이세화라고 합니다.
  강남멤버십에서 Menux라는 SIG 활동을 진행하고 있으며, 현재 안드로이드 시스템 분석이라는 주제로 진행하고 있습니다.

  먼저, 안드로이드 시스템 분석에 들어가기에 앞서 안드로이드란 무엇인지에 대해서 간단히 짚고 넘어가야 할것 같습니다.


Android Logo

[그림1] Android 로고




  일단, Wikipedia에서는 다음과 같이 정의되어 있는데요.

 안드로이드(Android)는 휴대 전화를 비롯한 휴대용 장치를 위한 운영 체제와 미들웨어,사용자 인터페이스 그리고 표준 응용 프로그램(웹 브라우저, 이메일 클라이언트, 단문 메시지 서비스(SMS), 멀티미디어 메시지 서비스(MMS)등)을 포함하고 있는 소프트웨어 스택이다.


  안드로이드는 사실 우리가 늘상 부르듯이 OS라고 한정 짓기에는 조금 애매하긴 합니다. 사실 오픈소스인 리눅스(Linux)위에 올려져 있는 하나의 소프트웨어 스택이자 플랫폼이라고 말할 수 있겠네요.

  그리고, 개발사인 구글과 OHA(Open Handset Alliance)[각주:1]에서는 다음과 같이 소개하고 있습니다.


특정 Vendors에 종속되지 않고 Mobile 발전을 더디게 만든 독점적인 폐해가 없이, 모바일 기기를 실행하는 모든 Software와 Mobile Device를 위한 최초의 오픈 플랫폼.

[Google의 소개 中]


최초로 개방되고, 완벽하게 무료라는, 명백한 원칙을 가지고 합리적으로 만들어진 최초의 모바일 플랫폼

[OHA의 소개 中]


  안드로이드가 왜 휴대전화용 플랫폼으로 각광을 받고 있을까요? 바로 그 이유가 위에 나와 있는데요. 특정 Vender에 종속되지 않고, 개방되고, 무료라는 원칙을 가지고 만들어진 모바일 플랫폼이기 때문입니다.
  따라서, 대표적인 모바일 OS 중하나인 iOS와 달리, 많은 Vender들이 사용할 수 있고 개발에도 참여할 수 있는 시스템이기 때문입니다. 따라서 앞으로의 발전 가능성도 많다고 할 수 있습니다.


  그러면, 이제 안드로이드의 특징에 대해서 한번 알아보도록 하겠습니다.

  1. 리눅스 커널 2.6 사용
       리눅스 커널을 사용하므로, 안드로이드 플랫폼 또한 역시, 오픈소스인 것입니다.
      대신에, 기존의 리눅스 커널은 GPL 라이선스[각주:2]를 사용하기 때문에 실제 Vender들이 사용하기에는 많은 제약 사항이 있었습니다.  하지만, 안드로이드에서는 커널 등 일부를 제외한 나머지는 LGPL 라이선스[각주:3]보다도 낮은 BSD나 Apache 라이선스[각주:4]를 사용하기 때문에, Vender들이 상용화하기 쉽게하였다는 장점이 있습니다.

  2. Java 언어의 사용
      내부 커널은 리눅스이므로 역시 C언어를 사용하고 있고, 라이브러리의 경우는 C/C++을 사용하고 있습니다. 하지만 애플리케이션 프레임워크 부분부터는 Java를 사용하고 있습니다.
      안드로이드 만의 전용 JVM인 Dalvik 가상머신을 통해서 애플리케이션을 구동하고 있습니다.

    Android Architecture

    [그림2] Android Architecture


      위 그링에서 보시면 빨간색으로 되어 있는 부분이 C언어이고, 녹색으로 된 부분이 C/C++언어를 사용하고 있는 부분입니다. 그리고 노란색으로 되어 있는 부분은 가상머신을 나타냅니다. 그리고 파란색으로 된 부분이 JAVA언어로 된 부분입니다.
      JAVA언어와 C언어 사이는 JNI(Java Native Interface)를 이용하여 연결하고 있습니다. 안드로이드에서는 이를 NDK라는 형태로 자동화하여, 개발자가 사용할 수 있도록 지원하고 있습니다.

  3. 다양한 라이브러리의 제공
      2번 항목에 삽입되었던 그림에서도 보듯이 안드로이드는 다양한 라이브러리를 포함하고 있고, 이를 API로 제공하고 있습니다. OpenGL ES를 통해서 3D를 지원하고 있습니다. Webkit을 통해 웹브라우저를 지원하며, FreeType을 통해서 폰트를 지원하고 있습니다. SQLite의 경우는 폰 내부의 DB를 사용할 수 있도록 지원하고 있습니다.
      이 외에도 다양한 센서 및 통신에 관한 라이브러리와 디바이스 드라이버들을 지원하고 있습니다.
      여기서 안드로이드의 큰 특징중 하나는 애플리케이션이 직접 하드웨어와 통신하는 것이 아니라 Binder를 통해 하드웨어와 통신하는 것입니다. 이렇게 함으로써, 응용프로그램이 직접 Root 권한을 얻지 않아도 되고, blocking 방식에서 문제가 발생해도 복구하기가 용이하게 됩니다.

  4. Eclipse에 기반한 개발환경 지원
      Eclipse에 기반한 통합 개발환경을 지원합니다. 특히 x86에서도 QEMU기반의 ARM 에뮬레이터를 통하여, 실제 폰과 같이 환경을 제공하고 있습니다. 또한, 디버깅 및 메모리 및 성능 프로파일링을 지원하여, 애플리케이션 개발자가 손쉽게 개발할 수 있는 환경을 제공하고 있습니다.

  5. Bionic C 라이브러리 사용
      기존 리눅스와 같이 glibc를 사용하는 것이 아닌 Bionic C 라이브러리를 사용하고 있습니다. 따라서, 기존 리눅스의 glibc를 이용한 소스를 그대로 컴파일 하기에는 무리가 있습니다. 호환성을 유지하고 있기는 하나, 약간의 수정사항을 거쳐야 하는 경우가 있습니다.

  그렇다면 현재 안드로이드의 소스는 어떻게 확인할 수 있을 까요? 안드로이드 홈페이지에서 안드로이드 소스를 다운받을 수 있습니다. 다음과 같이 http://source.android.com/source/index.html에서 소스를 어떻게 다운 받을 수 있는지와 컴파일 방법 등이 나와 있습니다. (여기에 포스팅 된 컴파일방법이나 개발환경도 바뀔 수 있으니, 홈페이지에서 확인하시는 것이 좋습니다.)

일단, 안드로이드 소스를 받아서 개발하기 위해서는 다음과 같은 환경이 필요합니다. 리눅스 커널 컴파일이 되어야 하기 때문에, 일반적인 Windows 환경에서는 할 수 없습니다.

  • 리눅스나 MacOS가 설치된 x86호환 컴퓨터 필요
  • git 1.54 이후버전
  • python 2.4
  • JDK 5.0, update 12 이후 버전(Froyo 이전) JDK 6.0(Gingerbread 이후)

그 외에 여러가지 패키지들이 필요한 데, 이는 우분투 리눅스를 기준으로 상세하게 나와 있습니다. http://source.android.com/source/initializing.html를 참고 하시면 됩니다.

그다음에는 curl을 이용하여 repo 스크립트를 다운로드 받습니다.

# mkdir ~/bin
# curl http://android.git.kernel.org/repo >~/bin/repo
# chmod 755 ~/bin/repo
# cp ~/bin/repo /bin

그 다음에는 안드로이드를 받기 위해 폴더를 만들고 버전을 갱신합니다.

# mkdir ~/android_source
# cd ~/android_source
# repo init -u git://android.git.kernel.org/platform/manifest.git

그리고, 다음과 같이 싱크 작업을 합니다.

# cd ~/android_source
# repo sync

이렇게 해주면, 해당 폴더에 소스가 최신 버전으로 다운로드되게 욉니다. 소스의 용량은 1GB 이상으로 상당히 크며, 만약 빌드하시려면, 그 이상의 큰 용량을 가지고 계셔야 빌드를 성공적으로 수행할 수 있습니다.


다음은 안드로이드 플랫폼의 소스 구조로 다음과 같습니다.

• bionic           : 안드로이드 표준 라이브러리.

• bootable       : 안드로이드 부트로더 및 시스템 부팅 관련 정보들.

• build             : 안드로이드 빌드 시스템. Core tool 타켓 및 보드 관련 정보들.

• cts               : 안드로이드 호환성 테스트 프로그램.

• dalvik           : 달빅 가상 머신.

• development : NDK, PDK, emulator, simulator, adb, testrunner 등 개발 관련 지원 소스.

• external        : 공개용 라이브러리. App저장소, QEMU, SQLite 등 존재.

• frameworks   : 안드로이드 프레임워크.

• hardware      : 안드로이드 HAL(하드웨어 라이브러리. WiFi, GPS, etc..)

• out               : 빌드시 생성되는 이미지들. system.img, userdata.img 등.

• packages     : 안드로이드에서 사용되는 App 관련 정보들

• prebuilt         : 아키텍쳐별 QEMU용 커널 이미지 및 디버깅 이미지들 제공.

• system        : 안드이드 코어 프로그램, init 프로세스, 운영 및 디버깅 정보들.
 
 


다음에는 안드로이드의 시스템을  소스 중심으로 분석해 보도록 하겠습니다.


  1. OHA(Open Handset Alliance) : 2007년 11월 5일에 삼성전자, 텍사스 인스트루먼트, 브로드컴 코퍼레이션, 구글, HTC, 인텔, LG전자, 마벨 테크놀로지 그룹, 모토로라, 엔비디아, 퀄컴, 스프린트 넥스텔, T-모바일의 몇몇 회사로 구성되었다. 모바일 기기의 개방형 표준을 개발하는 것을 목표로 결성되었다. [본문으로]
  2. GPL 라이선스 : 소스코드 내 GPL 전문의 포함, 해당소스를 완전히 공개한다. 다운로드 및 설치 관련 정보를 명확하게 공개해야 한다. [본문으로]
  3. LGPL 라이선스 : 공유라이브러리로 사용하는 소스코드는 공개하지 않아도 된다. (단지, 사용 라이브러리만 표시하면 된다.)단, Static으로 포함한 라이브러리의 경우는 공개해야한다. [본문으로]
  4. BSD, MPL, Apache 라이선스 : 소스코드를 수정 및 판매, 재배포 가능하다. (단, 라이선스 관련 표시는 해야 한다.)Apache 라이선스의 경우, 보안상 중요한 부분의 소스 공개는 하지 않아도 무방하다. [본문으로]

'IT 놀이터 > IT Storehouse' 카테고리의 다른 글

[PhysX] 1부 PhysX 입문!  (1) 2011.10.15
Android ADK란?  (4) 2011.10.15
OpenGL로 만드는 2D 비행슈팅 게임.  (1) 2011.10.08
루비 프로그래밍 언어 시작하기  (3) 2011.10.08
[RTOS] RTOS와 uC/OS의 소개  (0) 2011.08.19