|
안드로이드 그 시작과 끝
안드로이드 운영체제는 이제 스마트폰 운영체제로써의 자리를 확고히 잡고 있다. 운영체제뿐만 아니라 임베디드 시스템에 사용되는 임베디드 운영체제로써 마이크로소프트사나 실시간 운영체제(Real Time Operating System)가 차지하고 있던 영역까지 그 영역을 넓히고 있다. 안드로이드 운영체제는 두 가지 점에서 장점을 가지고 있다.
1 무료 운영체제라는 점 - 물론 무료는 아니다. 구글의 모바일 광고 플랫폼이라는 점은 변하지 않는다. 구글의 정책상 오픈 소스로 공개가 되고, 구글 자체에 라이선스 비용을 지불하지는 않는 표면적인 장점 때문에 안드로이드를 선택하게 한다. 공개된 소스는 많은 장점을 제시한다. 지금까지 스마트폰 플랫폼이 폐쇄적인 플랫폼을 지향한 반면에 구글처럼 스마트폰의 운영체제를 소스까지 공개하는 점은 절대로 무시할 수 없는 장점이다.
2 JAVA를 이용해 응용 프로그램을 개발할 수 있도록 제공해주는 점 - 웹 기술 중에 가장 성공한 언어는 JAVA라는 언어다. 따라서 이러한 JAVA 언어를 다룰 수 있는 개발자들을 스마트폰 앱 개발자로 끌어들이는 것은 폭 넓게 분포되어 있는 엔지니어층을 쉽게 안드로이드 개발자로 끌어들이기 위한 방법이기도 하다.
하지만, 복잡하게 얽힌 특허 분쟁으로 인해 안드로이드 운영체제도 이제는 사용료를 지불해야 하는 시스템으로 변하고 있다. 물론 소스에 대한 라이선스 비용이 아니라 특허에 대한 사용료를 지불해야 하는 형태로 지불하고 있다.
안드로이드의 역사ㅣ짤막한 역사
안드로이드 운영체제는 본 기고에서 소개할 4.0 버전, 아이스크림 샌드위치 버전이 나오기까지 많은 버전이 빠르게 출시가 되었다. 3년이라는 시간 동안 많은 변화가 있었으며, 이 변화의 역사는 스마트폰 운영체제의 판도를 바꾸는 역사이기도 하다. 안드로이드 운영체제는 통산 6개월마다 새로운 버전과 기능을 가진 운영체제가 출시가 된다. 일설에 의하면 구글이 6개월마다 안드로이드 운영체제를 출시하는 이유는 해커들이 해킹을 위해 안드로이드 운영체제를 분석하고 적용하는 시점이 6개월이라 그 때마다 릴리스 한다는 말도 있다. 이유가 어떠하든 간에 6개월만에 새로운 운영체제가 나온다는 점은 사용자들에게는 무척 반가운 점이다. 하지만 안드로이드 운영체제를 탑재하여 스마트폰을 개발하는 제작 업체에는 무척 부담스러운 일이 아닐까 한다. 일반폰에 비해 과거에 출시된 스마트폰에 대한 운영체제 업데이트 부분에 대해서도 고민을 해야 하고, 앞으로 출시할 스마트폰에 어떠한 운영체제를 지원하고, 언제까지 새로운 운영체제를 지원하는지에 대해서도 고민해야 하기 때문이다.
안드로이드 운영체제가 현재 4.0까지 그 소스가 공개되었다. 안드로이드 운영체제의 역사를 간략히 살펴보면 다음과 같다.
● Android 1.0 - 2008년 10월 처음 릴리스 됨, 리눅스 2.6.25기반
● Android 1.1 - 2009년 1월 릴리스 됨
● Android 1.5(Cupcake) - 2009년 4월 릴리스 됨, 리눅스 2.6.27기반 소프트 키보드, 카메라, 사진 갤러리, 블루투스 기능 탑재
● Android 1.6(Donut) - 2009년 9월 릴리스 됨, 퀵 서치(Quick Search Box), 문장을 음성으로 읽어 주는 기능, CDMA 통신망 지원, 멀티미디어 기능 지원을 위한 오픈 코어(OpenCore) 기능 탑재
● Android 2.0(eclair) - 2009년 10월 릴리스 됨, 하드웨어 가속 기능을 이용한 멀티미디어 프레임 워크 기능 강화, 블루투스 2.1 지원, 멀티 터치 지원
● Android 2.1(eclair) - 2010년 1월 릴리스 됨
● Android 2.2(Froyo) - 2010년 5월 릴리스 됨, 리눅스 커널 2.6.32 버전으로 업데이트 됨 자바 가상 머신인 달빅(Dalvik)에 자바 동작속도 향상을 위해 JIT(Just-In-Time) 컴파일 기능 제공, 멀티미디어 재생 기능을 제공하는 미디어 프레임워크를 교체, 오픈 코어 스테이지 플라이트(Stage Fright)로 교체, 안드로이드 응용 프로그램을 외장 저장장치인 SD/MMC와 같은 저장장치에 설치할 수 있도록 기능 제공
● Android 2.3(Gingerbread) - 2011년 1월 릴리스 됨, WXGA나 그 이상의 해상도를 지원, 인터넷을 이용하여 음성통화를 할 수 있도록 VoIP 기능 지원, 인터넷 음성 통화를 위한 SIP(Session Initiation Protocol)을 탑재, 구글이 인수한 업체인 On2 테크놀로지에서 만든 VP8 멀티미디어 코덱을 사용할 수 있도록 기능 탑재, VP8 코덱은 WebM이라는 이름으로 변경되었다. 근거리 통신(Near Field Communication) 기능 지원, 내부 동작 속도 향상을 위해 가비지 컬렉션 기능 개선, 자이로 스코프 및 기압계와 같은 센서 지원, 내부에서 사용하는 낸드 플래시 메모리 파일 시스템을 YAFFS에서 ext4로 변경하여 플래시 메모리 파일 시스템의 안정성 향상
● Android 3.0 - 2011년 1월에 미국에서 열린 CES에서 처음 소개됨, 태블릿 PC를 위해 만들어진 운영체제 버전, 1280x720 이상의 해상도를 지원함, 듀얼 코어 코어텍스 A9 프로세서 이상에서 돌아가도록 구성됨, 본 운영체제를 이용하여 모토로라의 드로이드 Xoom 태블릿이 최초로 만들어짐
안드로이드 운영체제의 특징
● 서비스 기반 시스템 - 안드로이드 운영체제는 바인더(Binder)라는 통신 기법을 사용하여 자바나 C/C+++로 구성된 서비스를 바탕으로 운영되는 시스템이다. 응용 프로그램에서는 프로세서간 통신 기법인 바인더 기능을 이용하여 서비스로 구성된 시스템의 기능을 이용할 수 있도록 구성되었다.
● 응용 프로그램 프레임 워크 - 응용 프로그램의 재사용과 교체가 가능하도록 응용 프로그램이 구성되었다. API 기반의 인터페이스를 제공하고 응용 프로그램에서 사용할 수 있는 소프트웨어 라이브러리 형태로 구성되었다.
▶ 액티비티 매니저(Activity Manager) - 안드로이드 응용 프로그램의 생명 주기를 관리한다.
▶ 뷰 시스템(View System) - 표준 위젯을 담당한다.
▶ 윈도우 매니저(Window Manager) - 모든 응용 프로그램과 관련된 화면 담당, HAL의 모든 EventHub를 통해 주로 이벤트를 처리하며 건네 받는다. 발생한 이벤트가 적절하다면 다른 매니저에게 전달하거나 상위로 올린다.
▶ 패키지 매니저(Package Manager) - 시스템에서 동작 중인 응용 프로그램의 정보 담당
● 달빅(Dalvik) 가상 머신 - 모바일 장치에 최적화된 자바 가상 머신(JAVA Virtual Machine), 달빅은 안드로이드 응용 프로그램인 .APK 형태의 앱을 실행하는 환경을 제공해 주고 있다. PC에서 사용되는 자바 가상 머신은 스택 기반으로 운영되지만, 달빅의 경우 레지스터 기반으로 동작을 하고 있다. 리눅스 커널을 이용하여 스레딩과 저수준의 메모리 관리를 지원할 수 있도록 구성되었다.
● 통합된 브라우저 - 브라우저 관련 소스인 Webkit 엔진 기반으로 만들어진 웹 브라우저를 탑재하고 있다.
● 그래픽 기능 - 2D 그래픽 라이브러리 및 OpenGL ES 기반의 3D 그래픽 엔진 라이브러리를 제공하고 있다.
● SQLite - 임베디드 시스템에 최적화된 관계형 데이터 베이스 엔진을 제공하고 있다.
● 미디어 지원 - 다양한 오디오 비디오 및 이미지 포멧 지원하고 있다. MPEG4, H. 264, MP3, AAC, AMR, JPG, PNG, GIF 등의 다양한 포맷을 지원
● 통신기능 - GSM, CDMA와 같은 통신 기능 및 블루투스, EDGE, 3G 및 WIFI, GPS 등을 지원
● 개발 환경 지원 - 디버깅을 위한 이클립스(eclipse) 통합 환경 기반의 디바이스 에뮬레이터를 지원, 메모리 및 성능 프로파일링 기능 지원, 윈도우, 리눅스, 맥 운영체제에서 응용 프로그램 개발 환경 제공
아이스크림 샌드위치
안드로이드 4.0 버전인 아이스크림 샌드위치 버전은 멀티 테스트킹을 쉽게 할 수 있도록 새롭게 사용자 인터페이스를 구성하였다. 또한 사용자에 대한 통보, 재 구성 가능한 홈 스크린, 크기 조절이 가능한 위젯등의 기능을 추가하여 사용자 인터페이스를 대대적으로 수정하였다.
● 멀티테스킹 사용자 인터페이스 강화 - 시스템 바에 있는 가상 버튼은 사용자들로 하여금 이전, 홈, 최근 앱 등으로 빠르게 전환 할 수 있도록 도와준다. 최근 앱 버튼은 이전에 사용하던 앱 목록을 보여주고 빠르게 사용하던 앱으로 전환 할 수 있는 방법을 제공해준다. 멀티 테스트을 하고 있는 안드로이드상에서 앱 사이의 전환을 쉽게 할 수 있도록 도와주는 기능인 것이다.
● 카메라나 노티피케이션 전환 - 카메라나 전화, 메시지 수신, 음악 재생, 실시간 업데이트 정보를 제공하는 앱에서 노티피케이션에 의해 정보가 전달되었을 때 스크린 언락(Unlock)이 필요 없이 바로 앱의 화면으로 전환할 수 있는 새로운 사용자 인터페이스 환경을 제공한다.
크기 조절이 가능한 위젯
안드로이드 4.0의 홈 스크린은 사용자 설정이 가능하고 풍부한 콘텐츠로 구성되었다. 사용자는 단순히 사용하는 응용 프로그램에 대해 링크를 추가하는 것 이외에 많은 작업을 할 수 있도록 구성되었다. 이메일을 주기적으로 검사해 새로운 이메일이 없는지 확인해주고, 달력을 보여주고, 음악을 재생해주며 소셜 네트웍의 업데이트 된 사항을 표시해 주는 것과 같은 응용 프로그램을 바탕화면에 구성해 줄 수 있다. 응용 프로그램을 실행할 필요 없이 위젯에서 인터넷을 통하여 정보를 업데이트 한 후에 크기조절이 가능한 위젯으로 바탕 화면에 보여 줄 수 있는 것이다.
빠른 전화 응답 기능
전화가 왔을 때 전화기를 집어들거나 장치를 언락할 필요없이 텍스트 메시지로 빠르게 응답 메시지를 보내는 기능을 제공한다. 전화 수신 화면에서 메시지 응답 리스트에서 선택하여 빠르게 응답 메시지를 보내는 기능을 제공한다.
이 밖에도 개선된 단어 검사기, 개선된 음성 인식을 사용한 음성 입력기, 텍스트를 빨리 입력할 수 있도록 개선된 소프트 키보드 등의 기능들이 개선되어 사용자의 입력 및 사용을 편리하게 해주고 있다.
이밖에 NFC 기능의 향상, 얼굴을 인식하여 스마트폰의 잠금을 해제하는 기능, 블루투스 헬스 장비 프로파일(HDP)을 이용하여 의료 장비나 헬스 클럽의 장치와 통신할 수 있는 기능을 제공한다.
폰과 테블릿 PC를 위한 통합된 사용자 인터페이스
비로소 4.0이 돼서야 안드로이드 폰과 테블릿 PC에서 일관적이고 통합적인 사용자 인터페이스를 제공해 주고 있다. 콘텐츠 로더, 액션 바, 강화된 노티피케이션 기능, 조절 가능한 홈 스크린 위젯등과 같은 새로운 API들이 개발자들에 다양한 기능 및 사용자 인터페이스를 제공해주고 있다.
소설 API
새로운 소설 API는 연락처, 프로파일 정보, 상태 업데이트, 사진 등을 소설 API를 통해 다양한 소설 네트워크 사이트에 공유할 수 있도록 해준다.
안드로이드의 미래
안드로이드 플랫폼은 스마트폰 및 테블릿 PC의 운영체제로써 점차 그 영역을 넓히고 있다. 불과 3년이라는 시간 동안 안드로이드는 4.0 버전이 출시되었고, 하루에 40만대 이상씩 등록이 되는 스마트폰의 운영체제로 자리잡고 있다. 스마트폰의 중요한 점은 많은 기술을 하나의 스마트폰에 집중하여 여러 기능을 집어 넣는 게 아니라 사용자가 편리하게 사용하고, 쉽게 사용할 수 있도록 기능을 제공하는 것이 가장 중요한 점이라고 하겠다. 많은 기능을 장점으로 스마트폰의 장점을 내세우기 보다는 사용자의 사용 방법과 패턴에 맞게 손 쉽게 사용할 수 있는 기능을 제공하는 것이 진정한 스마트 폰이 아닐까 생각한다. 안드로이드의 미래는 현재 진행 중이다. 오픈 소스로 무장한 구글의 안드로이드 운영체제의 미래는 오픈 소스의 미래이기도 하다. 앞으로 발전할 안드로이드의 미래를 기대해본다.
장점
다른 운영체제와 호환성이 뛰어나고 에뮬레이터를 통한 윈도우 애플리케이션 수행, POSIX 준수에 따른 유닉스 애플리케이션의 포팅이 용이하다는 장점이 있다. 또 오픈 소스 시스템이기 때문에 디버깅 및 문제 해결에 있어 시스템의 소스를 이용하여 직접 해결할 수 있다는 장점이 있다.
단점
표준화 되어 있지 않다는 단점이 있다. 하지만 근래는 각 회사에서 참여하고 있어서, 단일화 되는 경향이 있다. 현재도 개발되고 있는 운영 체제이며, 따라서 운영 교육이나 업그레이드 등의 사후 관리가 어렵고 복잡해지고 있다. 리눅스 운영체제는 컴퓨터 및 시스템에 대한 많은 지식을 요구하고 있다. 따라서 실제 개발에 있어 이러한 기본적인 지식을 가지고 있다면 개발에 어려움을 겪을 수 있다.
임베디드 리눅스 시스템의 구성
일반적인 임베디드 리눅스 시스템 구축 방법의 이해를 통해 안드로이드 시스템과 임베디드 리눅스 시스템의 관계를 확인해 보도록 한다.
선택한 프로세서 및 만든 개발 보드용 임베디드 리눅스 시스템 만들기 위해서는 다음과 같은 부분에 대해서 결정을 하고 진행하여야 한다.
● 툴 체인(Toolchain) 결정 - 어떠한 컴파일러 및 툴을 이용하여 시스템을 구성할 것인지 결정한다.
● 부트로더(Bootloader) - 통상 리눅스에서는 uboot가 사용되고 경우에 따라서는 고유의 부트로더를 구성하는 경우도 있다.
● 시스템 주변 장치(System Peripheral)에 따른 소프트웨어 지원문제 - 카메라, 멀티미디어, 사운드 장치에 따른 여러 기술들을 어떻게 지원할지 결정
● 커널 버전(Kernel version)결정 - 현재 리눅스 커널의 버전은 3.3이지만, 대부분의 안드로이드 시스템에서는 3.0이나 그 이하의 버전이 사용된다. 커널 이미지를 만들어 임베디드 시스템에 탑재할 수 있도록 구성한다.
● 루트 파일시스템(Root File System)을 빌드 - 임베디드 리눅스에서 필요한 정보들을 가지고 있는 루트 파일 시스템 이미지를 만들어 임베디드 리눅스가 정상적으로 동작할 수 있도록 구성한다.
안드로이드 개발환경 구축
기존의 임베디드 시스템과는 차별화된 개발방법을 사용한다. 통상 이더넷(Ethernet)을 이용한 개발방법을 권장 혹은 필수로 사용한다. 실제 개발에 있어 하드웨어 플랫폼에 이더넷을 장착할 수 없기 때문에 개발 초기에 사용을 하게 되고, 개발이 어느 정도 진행이 되면, 이더넷보다는 JTAG을 이용하는 하드웨어 디버거나 시리얼 포트를 사용하여 커널의 로그를 통해 시스템 문제를 분석하게 된다.
리눅스와 안드로이드 개발환경의 특징
모든 디버깅은 로그를 기반으로 하게 되어 있다. 일반 리눅스의 경우는 GDB를 이용한 개발이 가능하지만, 안드로이드의 경우에는 적용이 조금 번거롭다(.so 형태가 많아서, 즉 동적 로딩 형태가 많기 때문이다.) 이더넷을 사용하지 않고도 개발이 가능하지만, 이더넷을 사용해서 개발할 경우 2배 이상의 효율을 보여준다.
[그림3]은 일반적인 안드로이드 개발 환경 구축의 예제이다. 통상 서버를 사용하여 안드로이드 운영체제를 빌드할 수 있는 개발 환경을 구축하는 것이 추세다. JTAG는 디버깅이나 이미지를 램이나 플래시 메모리에 다운로드 하기 위해서 사용되며, 이더넷의 경우 네트워크 기능을 이용하여 리눅스 커널의 이미지나 안드로이드 시스템을 다운로드하기 위해 사용한다. 통상 안드로이드 시스템에서 사용하는 커널 이미지는 TFTP를 사용하여 다운로드 하고, 안드로이드의 루트 파일 시스템은 NFS 파일 시스템을 이용하여 마운트 하게 된다. 시리얼은 일반적인 커널의 로그를 확인 하기 위해 사용된다.
일반적인 리눅스 부팅 과정
일반적인 리눅스의 부팅 과정은 다음과 같이 정리할 수 있다.
다음 코드는 리눅스의 초기화 코드를 init 프로세스에 관련된 내용이 있는 소스다. 초기화 과정에는 커널을 위한 각종 내부 변수와 구조체를 초기화 하고 init 프로세스들을 실행하여 초기화 작업을 진행 하는 것을 확인 할 수 있다.
다음 소스는 리눅스 커널에서 초기화를 담당하는 init 프로세스의 주요 코드다. 리눅스 커널이 동작하기 위해 프로세서 관련 초기화 작업, 디버그 로그를 위한 콘솔창 열기, init 과정을 진행하게 된다.
루트 파일 시스템(Root File System)
루트 파티션에 사용될 파일 시스템으로, 리눅스/UNIX 부팅 시 필요한 파일들을 모아놓은 저장장치 혹은 디렉토리의 구성 말한다. 커널과 루트 파일 시스템은 반드시 필요한 구성 요소이다. 루트 파일 시스템은 부팅 시에 항상 마운트 되도록 되어 있다.
루트 파일 시스템이 없거나 구성이 올바르지 않으면 리눅스가 구동되지 않고 커널 패닉이 일어나게 된다.
루트 파일 시스템의 구성
/ - Root Directory라고 불리며, 모든 디렉토리는 / 를 기준으로 생성된다. /는 모든 디렉토리의 출발점이자 다른 파티션의 연결점이다.
/bin, /sbin - 시스템을 사용하기 위한 기본적인 명령어들이 시스템 관리 명령어와 시스템을 복구할 때 사용하는 필수 명령어 등이 존재.
/boot - PC 전용으로 일반적으로 사용되는 디렉토리며, 부팅에 필요한 커널등이 존재.
/dev - Device driver관련된 모든 장치 파일이 위치한다. (2.6버전 부터는 udev, sysfs와 연동)
/etc - 시스템 설정파일들이 위치(가장 중요한 디렉토리다)
/home - 사용자의 홈 디렉토리가 생성되는 곳이다. (ftp, mysql, tomcat 등 별도의 공간을 요구하는 서비스를 위한 디렉토리로 사용할 수도 있다.)
/lib - 시스템 운영 및 프로그램 구동할 때 필요한 공유 라이브러리와 부팅할 때 사용되는 커널 모듈이 위치한다.(가장 필수적인 것만 위치한다)
/mnt - 저장 장치를 일시적으로 마운트하기 위한 마운트 포인트를 제공한다. 일반적으로 해당 디렉토리는 비어 있음
/opt -애드온 패키지가 설치되는 디렉토리, 임베디드 시스템에서는 주로 툴 체인 등이 위치하는 경우가 많다.
/root -루트 사용자의 홈 디렉토리
/proc - 프로세스와 시스템 정보를 제공하기 위한 목적으로 설계된 가상 파일 시스템을 사용하는 디렉토리이다. /proc 디렉토리의 파일은 cat 혹은 more 명령어로 읽을 수 있으며 특정 파일의 경우 echo 같은 명령어로 내용을 변경할 수도 있다. 주로 디버깅 용도로 많이 사용된다.
/tmp - 임시 파일을 저장하는 디렉토리. 수시로 파일이 생성되고 삭제된다. NAND나 NOR를 이용한 root filesystem구성일 경우는 조심해야하는 디렉토리
/usr - 전통적으로 시스템 부팅에 반드시 필요하지 않은 유틸리티 성격의 파일들이 존재함. 하지만, 근래는 반드시 필요한 패키지들도 존재하게 됨으로써 반드시 구성해 주어야 하는 디렉토리
/sys - 2.6 버전 커널에서 새로 생겨난 kernel device model지원을 위해 사용되는 디렉토리
/var - 내용이 자주 변경되는 가변 자료가 저장됨
시스템 운영할 때 발생되는 로그(log), 메일 송/수신할 때 임시로 저장되는 스풀(spool), 프린터로 전송하기 위해 임시로 저장하는 프린트 스풀 데이터 등
/lost+found - fsck가 파일시스템을 점검할 때 손상된 데이터를 복구하지 못했다면 lost+found 디렉토리에 복구하지 못한 데이터 파일을 위치시킨다. 일반적으로 특정 파일시스템으로 포맷되고, 마운트되면서 생기는 경우가 많다.
안드로이드 init 프로세스
리눅스의 init 과정에 의해 리눅스 커널이 초기화되면 안드로이드의 init 과정이 진행하게 된다. 이 과정에서 안드로이드 운영에 필요한 파일 시스템 및 디렉토리를 구성하는 초기 작업이 이루어지게 된다.
위 소스에서 생성되는 디렉토리들은 앞에서 설명한 것처럼 안드로이드 운영에 필요한 시스템 정보들을 관리할 가상 파일 시스템을 생성하는데 목적이 있다.
지난 호에도 설명했던 것처럼 안드로이드 초기화 과정 중에 필요한 두 가지 init 파일이 다음 소스에서와 같이 처리되게 된다. Init.rc 파일에 정의된 순서에 의해 필요한 데몬 프로세서들이 로드가 되면서 안드로이드 시스템이 동작하기에 필요한 환경을 구성하게 된다.
다음 소스는 init.rc의 일부분이다. init.rc는 안드로이드 시스템의 초기화 과정에서 필요한 디렉토리의 생성 및 심볼릭 링크 구성, 안드로이드 내부에서 사용하는 각종 설정 값을 관리하는 프로퍼티 영역 설정, 필요한 데몬 프로세서를 로드 하도록 설정하는데 사용된다. 다음 소스는 프로퍼티 값과 서비스 매니저 데몬을 로드 하기 위한 설정의 일부분이다.
다음은 안드로이드 init 프로세서의 마지막 동작에 관련된 소스이다. init 프로세서의 동작은 init.rc 파일을 처리한 후 아래와 같이 for문과 무한 루프를 통해 대기하게 된다. 안드로이드 시스템 동작에 필수적인 프로세서의 동작을 감시하다 문제가 발생하면 재 시작하는 것으로 init 프로세서의 역할은 마무리 된다.
지금까지 리눅스 및 안드로이드의 초기화 과정 분석을 통해 어떻게 리눅스와 안드로이드 운영체제가 시작되는지 확인했다. 초기화 과정을 이해하는 것은 안드로이드 시스템을 이해하기 위한 가장 기초적인 내용이다.
안드로이드 개발 환경 구축
안드로이드 개발 환경에는 우분투(Ubuntu Linux)나 여러 리눅스 버전을 사용할 수 있다. 안드로이드 소스코드 전체 빌드에는 대략 3~4시간이 소요되기 때문에 멀티 코어를 이용한 시스템이 필수적이다. 4코어 이상의 PC의 경우 SMP를 이용하여 컴파일 시간을 단축 시킬 수 있다.
안드로이드 소스는 repo라는 툴을 사용하여 다운로드 하면 된다. repo는 GIT로 구성된 여러 가지의 프로젝트를 한꺼번에 관리해 주는 툴이다.
필요한 패키지 설치
Git(GNI Privacy Guard), JDK, flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev,build-essential, zip, curl와 같은 툴을 설치한다.
패키지 설치 방법
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
안드로이드 소스 디렉토리
안드로이드의 전체 소스를 완료 후 디렉터리의 구조는 다음과 같다.
bionic/ - Android Bionic C 라이브러리
bootable/ - 부트로더 및 Disk Installer 등
build/ - Makefile 관련 세팅파일들, script, map file
development/ - 개발 시 필요한 utility & application들.....
external/ - 안드로이드 프레임워크가 아닌 외부에서 가져온 라이브러리와 바이너리 위치
frameworks/ - android framework, C/C++(JNI포함)/JAVA source들, 일부 HAL source도 포함
/base -Android Framework source
/libs : Android base library(C++서부터)
/audioflinger : Android audio service & HAL source
/surfaceflinger : Android video service & HAL
/ui :Application Framework에서 JNI를 통해서 호출되는 Android framework의 client part, HAL (Input device의 경우) - EventHub.cpp
/utils : wrapping class, 압축관련 유틸리티 등...
/binder : Android Binder & Anonymous shared memory
/cmds : binder관련인 service manager소스와 여러가지 command들
/media : media관련 client & service library
hardware/ - HAL source & include, 일반적으로 android에서 사용하는 hardware관련 소스들을 포함, 반드시 이 디렉토리에만 위치하는 것은 아니다(vendor 디렉토리에 존재하는 경우도 많음)
out/ - 컴파일 된 결과물이 생성되는 디렉토리
packages/ - android 기본 application source(JAVA)
prebuilt/ - compiler & binaries
system/ - android의 기본 binary 소스
/core/init : android init source
/core/vold : external storage 제어 모듈