SlideShare uma empresa Scribd logo
1 de 62
Baixar para ler offline
www.hanbit.co.kr
이것이
프로그래밍이다!
이것이 안드로이드다
진정한 안드로이드 개발자로
이끌어줍니다.
SDK 5.0 롤리팝 호환!
책만 보고,
동영상 강좌로도 만족하지 못했다면 Daum
카페 '슈퍼드로이드'에서 만나요
cafe.daum.net/superdroid
박성근 저 | 1,164쪽 | 45,000원
이것이 C언어다
세상에 없던 새로운
C언어 입문서 탄생!
삼성, LG에서 펼쳐졌던
전설의 명강의를 풀타임 동영상 강좌로!
이보다 더 확실한 방법은 없다, 칠판강의
전체 동영상 강좌 유투브 전격 공개!
http://goo.gl/tJK3Tu
서현우 저 | 708쪽 | 25,000원
이것이 자바다
가장 중요한 프로그래밍 언어를 하나
배워야 한다면, 결론은 자바다!
중급 개발자로 나아가기 위한 람다식,
JavaFX, NIO 수록
자바의 모든 것을 알려주는 인터넷 강의
궁금한 것은 카페에서!
cafe.naver.com/thisisjava
신용권 저 | 1,224쪽 | 30,000원
저자직강동영상 제공!
모던 웹을 위한
JavaScript +
jQuery 입문
www.hanbit.co.kr
지금은
모던 웹 시대!
HTML5 분야 부동의 1위 도서
HTML5 표준안 확정에 맞춘 완전 개정판의 귀환!
HTML5 권고안과 최신 웹 브라우저 환경 대응
윤인성 저 | 624쪽 | 30,000원
모던 웹 디자인을 위한
HTML5 +
CSS3 입문
자바스크립트에서 제이쿼리, 제이쿼리 모바일까지
한 권으로 끝낸다!
시대의 흐름에 맞춰 다시 쓴 자바스크립트 교과서
윤인성 저 | 980쪽 | 32,000원
페이스북, 월마트, 링크드인은 왜
Node.js를 선택했는가?
이 물음에 대한 답은 Node.js가 보여주는 빠른 처리 능력 때문이다.
윤인성 저 | 484쪽 | 25,000원
모던 웹을 위한
Node.js
프로그래밍
필요한 것만 배워
바로 현장에서 쓰는 HTML5
순서대로 읽으며 실습할 수 있는 HTML5 자습서
김상형 저 | 700쪽 | 32,000원
HTML5 +
CSS3 정복
임베디드 안드로이드 :안드로이드 포팅, 확장, 커스터마이징하기
초판발행 2015년 4월 1일
지은이 카림 야크무르 / 옮긴이 이성주 / 펴낸이 김태헌
펴낸곳 한빛미디어 (주) / 주소 서울시 마포구 양화로 7길 83 한빛미디어(주) IT출판부
전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124
등록 1999년 6월 24일 제10 – 1779호 / ISBN 978-89-6848-177-2 93000
총괄 배용석 / 책임편집 최현우 / 기획 이복연, 김상민 / 편집 백지선
디자인 표지 손경선, 내지 강은영, 조판 이경숙
영업 김형진, 김진불, 조유미 / 마케팅 박상용, 서은옥 / 제작 박성우
이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로
알려주십시오. 잘못된 책은 구입하신 서점에서 교환해드립니다. 책값은 뒤표지에 표시되어 있습니다.
한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr
Published by HANBIT Media, Inc. Printed in Korea
Copyright © 2015 Hanbit Media Inc. Authorized Korean translation of the English edition of
Embedded Android, ISBN 9781449308292 ⓒ 2013 Karim Yaghmour. This translation is
published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to
publish and sell the same.
이 책의 저작권은 오라일리와 한빛미디어 (주)에 있습니다.
저작권법에 의해 보호를 받는 저작물이므로 무단 복제 및 무단 전재를 금합니다.
지금 하지 않으면 할 수 없는 일이 있습니다.
책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요.
한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.
| 표지 설명 |
표지의 그림은 지중해 서쪽과 북아프리카, 북미, 아시아 지역에 서식하
는 무어 벽 도마뱀Moorish wall gecko, Tarentola mauritanica이다. 주로 발견되는
곳은 따뜻한 해안가 도심의 벽이며, 스페인의 경우 내륙에까지 퍼져 있
다. 플로리다 지역에서는 애완용으로도 많이 키우고 있다.
무어 벽 도마뱀은 야행성이지만 겨울 끝자락에는 낮에도 활동한다. 1년
에 두 번, 4월과 6월에 거의 완벽한 구 형태의 알을 두 개씩 낳는다. 알은 4개
월 후에 부화하며 새끼의 몸길이는 5cm가 채 되지 않는다. 성체가 되기까지는 대
략 4~5년 정도 걸린다.
성체는 꼬리를 포함하여 15cm까지 자라며 딴딴한 몸통과 납작한 머리, 부풀릴 수 있는 등 덕분에 가시 달린 갑옷과 같은
느낌을 준다. 색깔은 회갈색 혹은 회색 얼룩무늬의 갈색이다.
4
지은이·옮긴이 소개
지은이 카림 야크무르Karim Yaghmour
임베디드 안드로이드와 임베디드 리눅스 개발과 훈련 서비스를 제공하는 Opersys 사의 CEO
로, 그의 저서인 『임베디드 리눅스 시스템 구축하기』(김태석 옮김, 한빛미디어, 2004)는 여러
나라 언어로 번역되어 전 세계적으로 수만 부가 판매되었다.
리눅스계의 선구자인 카림은 1990년대 후반 리눅스 추적 툴킷LTT, Linux Trace Toolkit을 개발하고
2005년까지 관리하였다. LTT 개발에는 IBM, HP, 인텔 등의 개발자가 참여하였으며 구글,
IBM, HP, 오라클, 알카텔, 노텔, 에릭슨, 퀄컴, 나사, 보잉, 에어버스, 소니, 삼성, NEC, 후지
쯔, SGI, 레드햇, 탈레스, 오리콘, 불Bull, 모토로라, ARM, ST마이크로 등 굴지의 기업에서 활
용하였다. 또한 relayfs와 Adeos 개발에도 이바지하였다.
카림은 다양한 콘퍼런스, 잡지, 온라인 저널에 단골로 등장한다. 유즈닉스Usenix, 리눅스 커널
서밋, 임베디드 리눅스 콘퍼런스, 안드로이드 빌더스 서밋, 안데브콘AnDevCon, 임베디드 시스템
콘퍼런스, 오타와Ottawa 리눅스 심포지엄, 리눅스 저널, 오라일리 네트워크, 리얼타임 리눅스 워
크숍 등에 발자취를 남겼다.
옮긴이 이성주
(주)벡터바이트 대표. 연세대학교에서 전기전자공학을 전공하고 같은 대학원에서 컴퓨터과
학 박사과정을 수학했다. 안드로이드 스마트폰이 처음 출시된 대학원 시절, 마침 임베디드 시
스템을 연구하던 중 안드로이드를 접하게 되었다. 『개발 프로세스 향상과 코드의 질을 높이는
Android Developer Tools 필수 가이드(기본편/심화편)』(한빛미디어, 2014)를 번역했다.
5
2010년 이후 3년 동안 안드로이드는 1990년대 마이크로소프트 윈도우가 해냈던 일을 다시 해
냈다. 단지 해낸 수준이 아니라 여러 측면에서 발전된 혹은 진화된 방식으로 세계의 지배적인
플랫폼이 되었다. 스마트폰은 단지 시작에 불과하다. 스마트 시계를 비롯하여 다양한 웨어러블
기기와 네트워크로 연결된 각종 기기, 즉 사물인터넷(IoT)은 이미 도래했거나 곧 공공연해질
것이다.
이러한 추세는 한 사람이 평균 한두 개의 스마트 기기를 소지하는 오늘날의 수준을 훌쩍 뛰어
넘을 것이며 기기의 유형과 개수는 기하급수적으로 증가할 것이다. 이러한 기기들의 양적 팽창
을 지탱해줄 플랫폼에는 많은 것이 요구되지만 그중 표준화, 확장성, 사용 가능성은 빼놓을 수
없는 중요한 특성이다. 안드로이드는 적어도 이 세 가지 사항을 모두 충족한다고 평가되며 스
마트 기기의 양적 팽창이 딛고 일어서는 발판이 될 것이다.
안드로이드는 그동안 (너무 많이) 분파되었던 리눅스 배포판들이 집약되는 구심점이 될 가능
성이 높아 보인다. 그러한 ‘단일화’는 임베디드부터 시작할 것으로 기대되는데 그럴 만한 여러
이유가 있다. 플랫폼의 가치는 앱, 좀 더 정확하게 말하면 앱 개발자의 질과 양이 결정한다. 그
런 측면에서 임베디드 시스템 개발사는 하드웨어별 맞춤형 앱을 개발하는 비용을 낮출 가능성
을 적극적으로 모색할 것이다. 하드웨어별 장치 드라이버를 상대하는 것만으로도 힘든데 그 장
치를 활용하는 API 설계 방식까지 표준화되어 있지 않다면 유지보수를 포함한 개발 비용을 낮
추기는 사실상 어렵다. 이런 이유로 임베디드 안드로이드는 반복적으로 선택되었고, 앞으로도
지속적으로 선택될 플랫폼이며, 이러한 선택이 반복될수록 플랫폼으로서의 가치는 더욱 높아
질 것이다.
20세기에 출발한 키보드와 마우스를 입력장치로 하는 윈도우 같은 운영체제보다는 처음부터
터치 기반의 입력장치를 염두에 두고 설계된 21세기형 운영체제인 안드로이드가 임베디드에
더 적합하다고 평가된다. 이에 임베디드 리눅스 시스템 분야의 권위자인 이 책의 저자 카림 야
크무르가 2년의 세월을 헌신하여 그 결과를 우리에게 제시하였다.
옮긴이의 말
6
이로써 임베디드 시스템 플랫폼 전략을 확립하기 위해 극복해야 할 기술적 난관을 상당 부분
줄일 수 있게 되었다. 임베디드 시스템 개발사라면 이 책의 기술적 내용을 근거로 프로젝트를
진행하는 것이 현재까지 제시된 방법 중 가장 합리적인 선택 중 하나라고 확신한다.
- 이성주
7
“안드로이드 기반의 시스템을 만들어보려는 모든 이에게 반드시 필요한 안내서이다. 안드로이
드의 깊은 곳을 다루지만 구글 내부 개발자가 아니라면 이 책이 필요할 것이다.”
그렉 크로아-하트만, 리눅스 커널 핵심 개발자
“맞춤형 안드로이드 이미지, 기기, ROM 모드를 만들어야 하는 개발자라면 이 책이 필요하다!
안드로이드 동작 원리와 빌드 시스템을 비롯하여 안드로이드 전체가 어떻게 조합되어 있는지
를 전반적으로 이해하려면 소스코드를 제외하고 이 책이 유일한 참고서다. 특히 빌드 시스템
과 프레임워크를 설명한 4, 6, 7장에서 굉장한 도움을 받았다. 해당 장에서는 역엔지니어링하
기 어려운 AOSP 소스코드를 바탕으로 한 다양한 정보를 제공한다. 이 책 덕분에 개발자는 많
은 시간을 절약할 수 있을 것이다. 몇 년 전 우리 팀이 프로요 버전 안드로이드를 다룰 때 이 책
이 있었다면 좋았을 것이라고 생각했다. 다음 프로젝트인 인텔 레퍼런스 기기용 안드로이드 스
택 작업에 투입되는 새 인력에게는 필독서가 되리라 생각한다.”
마크 그로스, 인텔 안드로이드/리눅스 커널 아키텍트
“카림은 임베디드 시스템 개발자가 상대해야 하는 안드로이드의 여러 의문점을 체계적으로 공
략하였다. 이 책은 일반 소비자용 스마트폰과 태블릿뿐만 아니라 모든 유형의 기기에서 AOSP
를 구동할 때 필요한 실용적인 방법론을 제공한다. 개인적으로는 에뮬레이터뿐만 아니라
BeagleBone과 같이 합리적인 가격의 하드웨어를 사용하는 다양한 예가 많이 제시되어 기쁘다.”
제이슨 크리드너, 텍사스 인스트루먼트 Sitara 소프트웨어 아키텍처 매니저,
BeagleBoard.org 공동창업자
“우리 개발자들이 수백 시간을 투자해서 알아내던 정보가 이 책 한 권에 담겨 있다. 안드로이드
작업에 새로 참여하는 우리 팀 인력이 반드시 숙지해야 할 필독서이다.”
마크 미씨리 박사, 카네기 멜런 대학교 우주ㆍ모바일 필드 로보틱스 연구자
추천의 글
8
”안드로이드는 견고하고 뛰어난 성능의 리눅스 기반 제품을 만드는 데 필요한 모든 기능을 담
고 있는 수직적으로 통합된 공개 플랫폼이다. 이 책은 임베디드 시스템 개발자들이 안드로이드
에 처음으로 제대로 접근할 수 있도록 해주었다. 안드로이드의 혁신적인 실행 모델은 스마트폰
이나 태블릿에 국한되지 않으며 앱 개발자 플랫폼은 기능과 개발 속도 면에서 타의 추종을 불
허한다. 개발자들은 이 책에서 앱과 커널 사이의 모든 것, 그리고 확장과 수정을 통해 끝없이
다양한 안드로이드를 만드는 데 필요한 귀중한 정보를 얻을 수 있다.”
자크 페퍼, 리나로 안드로이드팀 기술 리더
“드디어 안드로이드 플랫폼을 시스템 관점에서 다룬 책이 나왔다! 앱 개발 관련 서적은 많지만,
안드로이드 내부에 관한 정보를 집약한 자료는 오랫동안 없었다. 카림은 안드로이드 시스템 프
로그래머와 시스템 통합 개발자에게 필수적이면서 유용하고 방대한 자료를 『임베디드 안드로
이드』에 수록했다(물론 앱 개발자에게도 도움이 되리라 생각한다). 카림은 안드로이드에 관한
전문성과 분석을 통해 축적된 다양한 예시, 참조, 설명을 제공하였다. 소니에서 안드로이드를
눈물겹게 배우던 시절, 만약 이 책이 있었으면 몇 개월은 절약할 수 있었을 것이다. 이 책은 앞
으로도 계속 안드로이드 시스템 개발자에게 주요 참고서가 되리라 믿어 의심치 않는다.”
팀 버드, 소니 네트워크 엔터테인먼트 시니어 스태프 엔지니어,
리눅스 재단 CE 워크그룹의 아키텍처 그룹 의장
“카림 야크무르의 책은 성장 중인 안드로이드 기반 임베디드 시스템 시장에 뛰어들고자 하는
사람들에게 탁월한 지침서다. 이 책은 커널 지원부터 라이선스와 상표권 관련 사항, 화면이 없
는 시스템에서 구동하는 방법 등 광범위한 정보를 제공한다. 임베디드 안드로이드 개발자라면
이 책은 반드시 소장해야 한다.”
폴 맥켄니, IBM 수석 엔지니어, 리눅스 커널 RCU 관리자
9
“안드로이드가 초기에는 스마트폰을 염두에 두고 설계되었지만 차츰 태블릿, 자동차, HMI와
같은 UI 패널, 웨어러블 기기를 비롯한 다양한 제품군까지 시장을 넓히고 있다. 이 책은 모바
일과 비모바일 제품에 안드로이드 기반 솔루션을 포팅하고 수정하는 데 필요한 핵심 원리와 개
념을 모두 다루고 있어 적극 추천한다.”
카심 사이드 모하메드, 텍사스 인스트루먼트 리드 엔지니어
“임베디드 안드로이드 개발자뿐만 아니라 안드로이드 앱 개발자에게도 표면 아래의 자바에 대
해 심도 있게 배울 수 있는 매우 훌륭한 자료다.”
라스 보겔, vogella GmbH CEO
“다시 한 번, 카림이 제대로 짚었다. 안드로이드를 새 하드웨어에 포팅하거나 안드로이드가 어
떻게 동작하는지 궁금하다면 이 책을 읽어라. 이 책은 AOSP 소스 구하기부터, 빌드 환경을 설
정하고, 여러분의 하드웨어 지원을 소스에 추가하고, 그 하드웨어를 포함하는 새로운 안드로이
드를 빌드하여 배포하기까지의 모든 내용을 다룬다. HAL을 비롯한 안드로이드 프레임워크에
새로운 하드웨어 지원을 제공하기 위한 방법을 설명한다. 이 책은 안드로이드 관련 모든 서적
을 통틀어 안드로이드 기기 개발자에게 가장 좋은 지침서다. 이 책과 함께라면 몇 개월 치의 시
행착오를 피해갈 수 있을 것이다.”
마이크 앤더슨, PTR 그룹 최고 과학자
“어느새 『임베디드 안드로이드』는 우리 회사의 귀중한 자산이 되었다. 안드로이드를 새 하드웨
어에 포팅하거나 낮은 수준에서 새 기능을 통합할 때 반드시 필요하다. 카림은 훌륭한 교사이
며 이 책에 그의 스타일을 잘 반영하였다.”
짐 스틸, 센서 플랫폼즈 엔지니어링 부분 부사장
10
“『임베디드 안드로이드』는 안드로이드의 깊숙한 곳을 다루거나 새로운 하드웨어 플랫폼에 안드
로이드를 올리는 작업을 하는 사람이라면 반드시 읽어야 하는 책이다. 이 책은 방대한 AOSP
의 코드 베이스를 살펴보고 시스템의 전체 아키텍처를 이해하는 데 큰 도움을 준다.”
볼윈더 카울, 압티나 이미징 기술 부분 선임 멤버
“안드로이드 내부를 잘 안다고 생각하는가? 다시 한 번 생각해 보기 바란다! 장을 넘길 때마다
지금껏 몰랐던 사실들을 깨닫고, 왜 안드로이드가 또 하나의 임베디드 리눅스 배포판이 아닌지
알게 된다. 소용돌이 속으로 뛰어들 준비가 되었는가? 구글의 운영체제를 해킹하고자 하는 사
람들에게 『임베디드 안드로이드』는 한 마디로 ‘대박’이다.”
벤자민 조르, 알카텔 루슨트 안드로이드 플랫폼 아키텍트
“안드로이드 시스템 스택을 다루는 가장 가치 있고 완전한 자료다. 모든 안드로이드 시스템 엔
지니어의 필독서!”
맥심 리파드, 프리 일렉트론즈 안드로이드 리드
“얼마 전 리눅스가 올라간 개발 보드에 ‘안드로이드를 올려봐’라는 요청을 받았지만, 새로운 기
기에 안드로이드를 올리는 방법과 관련한 정보를 찾기 어려웠다. 다행히도 개발에 막 돌입한
시점에 마치 구세주처럼 『임베디드 안드로이드』가 출간되었다. 『임베디드 안드로이드』가 알려
준 부팅 절차부터 빌드 시스템에 이르기까지의 세부사항과 배경지식이 무척 마음에 든다. 덕분
에 안드로이드 전반과 안드로이드와 리눅스 커널의 상호작용을 훨씬 더 잘 알게 되었다.”
케이시 앤더슨, 트랜드릴 임베디드 시스템 아키텍트
11
들어가면서
안드로이드의 성장은 경이롭다. 매우 짧은 시간에 시장을 주도하는 데 성공했다. 오픈 소스 라
이선스, 공격적인 시장 진출, 첨단 인터페이스로 이뤄진 독특한 조합이 구글 안드로이드팀의
성과임이 분명하다. 말할 필요도 없이 휴대기기 제조사, 통신사, 칩셋 제조사, 앱 개발자들은
엄청난 사용자를 거느린 안드로이드를 중요하게 여긴다. 안드로이드용, 안드로이드 호환, 안드
로이드 기반 제품들이 전례 없이 빠르게 출시되고 있다.
그런데 스마트폰 시장에서 안드로이드의 성공은 의도하지 않은 또 다른 집단의 관심을 끌고
있는데 그 집단은 바로 임베디드 시스템 개발자들이다. 대다수의 임베디드 기기는 사용자 인
터페이스가 없었는데 이전에는 임베디드로 간주할 만한 기기의 상당수가 이제는 사용자 인터
페이스를 제공한다. 사용자용 기기를 제작하는 개발자는 순수하게 기술적인 기능뿐만 아니라
HCIHuman Computer Interaction 요소를 고려해야 한다. 따라서 디자이너는 사용자에게 이미 친숙한
경험을 제공하거나 또는 잘 알려지지 않았거나 아예 새로운 인터페이스를 학습하게 해야 하는
데, 후자는 거부감을 줄 위험이 있다. 안드로이드 이전에는 이러한 기기의 개발자들이 선택할
수 있는 사용자 인터페이스가 매우 제한적이었다.
물론 임베디드 개발자는 이미 친숙한 사용자 인터페이스를 제공하길 원한다. 과거에는 그러한
인터페이스가 윈도우 기반이었다. 그래서 많은 임베디드 기기가 전통적인 윈도우 중심으로 데
스크톱과 유사하거나 데스크톱 기반의 인터페이스를 제공했다. 애플의 iOS와 구글의 안드로이
드 이후에는 터치 기반의 아이폰 같은 그래픽 인터페이스가 지배적이며 앞으로도 계속 그럴 전
망이다. 이러한 사용자 패러다임의 변화와 기대는 안드로이드의 오픈 소스 라이선스와 결합하
여 임베디드 산업계가 지속해서 안드로이드에 관심을 두게 만드는 근거가 되었다.
안드로이드 앱 개발자와는 달리 안드로이드로 임베디드 기기에서 포팅 등과 같은 플랫폼 작
업을 하는 개발자는 곧 상당한 문제에 맞닥뜨린다. 안드로이드 플랫폼 작업 관련한 문서가 거
의 전무하기 때문이다. 구글은 앱 개발자를 위해 매우 방대한 온라인 문서를 제공하고 해당
주제의 책도 많은 데 반해, 임베디드 개발자용으로 구글이 제공하는 문서는 http://source.
android.com에서 제공하는 최소한의 문서뿐이다.
12
이 책의 목적은 이러한 상황을 개선하고 어떤 장치에서든 임베디드 안드로이드를 사용할 수 있
도록 하는 것이다. 따라서 독자는 안드로이드의 아키텍처를 학습하고, 소스코드를 탐색하는
법, 다양한 컴포넌트들을 수정하는 법, 특정 기기를 위한 독자적인 버전을 생성하는 법을 배운
다. 더불어 안드로이드가 리눅스 커널에 어떻게 병합되었는지와 리눅스와의 공통점과 차이점
에 대해 배운다. 예를 들어 안드로이드가 리눅스 장치 모델Linux Device Model을 어떤 방식으로 사용
하여 독자적인 하드웨어 계층을 생성하고 glibc와 BusyBox와 같은 ‘레거시Legacy ’ 리눅스 컴포
넌트들을 채택해서 안드로이드로 패키징했는지를 논의한다. 그러한 과정 속에 개발에 도움이
되는 일상적인 다양한 기법을 학습하게 된다. 여기에는 안드로이드의 repo 도구 사용법과 안
드로이드 빌드 시스템과 병합하거나 수정하는 방법도 포함된다.
안드로이드 임베드하는 법 배우기
필자는 1990년대 중반부터 오픈 소스 소프트웨어에 관여해왔다. 지금처럼 강력한 영향력을 발
휘하기 전에 동참하게 된 것은 행운이며, 덕분에 2000년대 초반 오픈 소스의 급성장을 직접 목
격할 수 있었다. 또한 오픈 소스에 기여도 하고 여기저기서 벌어지는 격렬한 논쟁에도 흔쾌히
참여했다. 그 과정에서 오라일리를 통해 『임베디드 리눅스 시스템 구축하기』(김태석 옮김, 한
빛미디어, 2004)를 집필했다.
그래서 리눅스 기반인 안드로이드가 점차 유명해지기 시작할 때, 리눅스의 역사와 임베디드 리
눅스를 잘 알고 있는 나로서는 충분히 조사해볼만 하다고 생각했다. 처음에는 안일하게도 “내
가 이미 잘 알고 있는 리눅스에 기반한 플랫폼이니 안드로이드가 어려우면 얼마나 어렵겠어?”
라고 생각했다. 안드로이드 내부를 진지하게 살펴보기 전에는 이렇게 생각할 수 있었다. 그런
데 막상 겪어보니 안드로이드는 전혀 딴판이었다. 리눅스와 관련하여 내가 알고 있던 지식과
임베디드 시스템에서 공공연하게 사용되는 패키지 중 안드로이드에 그대로 적용되는 경우가
적었다. 뿐만 아니라 안드로이드가 사용하는 추상화는 더욱 낯설었다.
13
그리하여 이것을 알아내기 위한 매우 긴 여정을 시작하였다. 그리고 아직도 진행 중이다. 안드
로이드는 어떻게 동작하는가? 일반 리눅스와 어떻게 다른가? 어떻게 수정하는가? 임베디드 시
스템에서 어떻게 사용하는가? 어떻게 빌드하는가? 리눅스 사용자 공간에 대한 지식이 안드로
이드 앱 개발 API에 어떻게 적용되는가? 등의 물음에 대답하기 위해 노력해 왔다. 안드로이드
를 파면 팔수록 더 낯설고 질문이 늘어갔다.
첫 번째로 한 일은 http://developer.android.com과 http://source.android.com에서
가능한 모든 정보를 인쇄하고, 실제 개발자 API 참조 문서를 저장해 두었다. 문서는 20에서
25cm 두께 분량이 되었다. 그 대부분을 읽고, 중요한 부분에 밑줄을 긋고, 여백에는 많은 메
모를 달고, 답을 알 수 없는 수많은 질문을 목록으로 만들었다. 이와 동시에, 구글이 제공하는
안드로이드 오픈 소스 프로젝트AOSP, Android Open Source Project를 살펴보기 시작했다. 솔직히, AOSP
구조에 어느 정도 자신이 생기기까지 6개월에서 12개월이 걸렸다.
여러분이 지금 손에 쥔 책은 필자가 안드로이드를 살펴본 이후 해 온 작업을 집대성한 것이다.
여기에는 필자가 여러 개발팀이 그들의 임베디드 설계에 맞게 안드로이드를 수정하도록 도와
준 다양한 프로젝트들도 포함된다. 안드로이드와 관련해서 내가 하고 싶은 말은 이 책이 절대
안드로이드의 모든 것을 담을 수는 없다는 것이다. 안드로이드와 그 내부와 관련한 무수히 많
은 기술이 있고 이 책은 그 모든 것을 다루지도 않으며, 다룰 수도 없다. 그럼에도 이 책은 안드
로이드를 원하는 용도에 맞게 주조하는 노력을 시작할 수 있게 해줄 것이다.
대상 독자
이 책은 주로 안드로이드 기반 임베디드 시스템을 만드는 개발자나 안드로이드를 특정한 용도
에 맞게 변형하고자 하는 사람을 위해 쓰였다. 먼저 독자가 임베디드 시스템 개발을 어느 정도
는 알고, 최소한 리눅스가 어떻게 동작하며 명령행을 어떻게 사용하는지 잘 알고 있다는 가정
하에서 시작한다.
14
자바 관련 지식은 필요하지 않다. 자바를 몰라도 안드로이드를 수정하는 데 필요한 많은 작업
을 수행할 수 있다. 하지만 안드로이드 관련 작업이 진행될수록 자바의 필요성이 어느 정도까
지는 증가한다. 실제로 안드로이드 핵심 중 많은 부분이 자바로 작성되었고, 그렇기 때문에 여
러분의 작품을 안드로이드 스택에 제대로 병합하려면 자바를 알아야 한다.
하지만 이 책은 앱 개발이나 자바 프로그래밍과는 전혀 관련이 없다. 그 주제가 관심사라면 다
른 자료를 살펴보기 바란다. 이미 훌륭한 책들이 많아 나와 있다. 또한 이 책은 임베디드 시스
템과 관련한 책도 아니다. 마지막으로 이 책은 임베디드 리눅스 책이 아니며, 해당 주제 역시
다른 책에서 다루므로 찾아보기 바란다. 그래도 여전히 임베디드 시스템과 리눅스에 친숙하다
면 안드로이드를 이해하는 데 도움이 된다. 실제로 안드로이드는 기존의 ‘임베디드 리눅스’라
불리는 모든 것과 다르지만, 임베디드 리눅스 시스템을 생성할 때 주로 사용되는 많은 기법은
임베디드 안드로이드 시스템을 생성할 때도 훌륭한 지침과 도움이 될 수 있다.
이 책은 또한 안드로이드의 내부를 이해하는 데 도움이 될 것이다. 실제로 안드로이드를 임베
디드 시스템에서 사용하도록 수정하는 작업에는 내부 구조에 대한 기본적인 이해가 반드시 필
요하다. 안드로이드 소스코드를 샅샅이 살펴보지는 않지만, 안드로이드 스택의 다양한 부분들
이 상호작용하는 방식을 자세하게 드러낼 것이다.
책의 구성
다른 많은 책과 마찬가지로 이 책은 후반부로 갈수록 논의가 심오해진다. 앞쪽의 장은 이후 장
을 위한 배경 지식을 제공한다. 관리자라서 핵심 부분만 살펴보고 싶다거나 일부만 선택해서
읽고 싶더라도 최소한 앞의 세 장은 읽어보기 바란다. 그렇다고 나머지 부분이 서로 관련이 없
다는 것은 아니지만, 4장 이후로는 훨씬 독립적으로 구성되어 있다.
1장 ‘소개’는 안드로이드를 임베디드 시스템에서 사용할 때 알아야 하는 일반적인 지식을 다룬
다. 안드로이드는 어떻게 시작되었으며 개발 모델과 라이선스가 기존의 오픈 소스 프로젝트와
15
어떻게 다른지, 안드로이드 구동에 필요한 하드웨어 사양과 같은 내용이다.
2장 ‘안드로이드 내부 들여다보기’는 안드로이드 내부를 파헤치고 안드로이드를 구성하는 주요
추상화 개념을 보여준다. 앱 개발자에게 친숙한 앱 개발 모델을 소개하며 시작한다. 그런 다음
안드로이드만을 위해 가해진 커널 수정, 하드웨어 지원이 안드로이드에 추가된 방식, 안드로이
드 네이티브 사용자 공간, 달빅, 시스템 서버, 시스템 시작 전반을 살펴본다.
3장 ‘AOSP 시작하기’는 구글의 안드로이드 소스코드를 가져오는 방법을 설명하고, 에뮬레이터
이미지로 컴파일하고, 이 이미지를 구동해 셸로 접근하는 법을 설명한다. 에뮬레이터는 실제
하드웨어 없이도 안드로이드의 내부 원리를 살펴보는 손쉬운 수단이다.
4장 ‘빌드 시스템’은 안드로이드 빌드 시스템을 상세하게 설명한다. 실제로 다른 대부분의 오픈
소스 프로젝트와 달리 안드로이드 빌드 시스템은 비재귀적non-recursive이다. 4장은 안드로이드
빌드 시스템의 구조와 AOSP를 빌드하는 전형적인 방법, AOSP에 수정사항을 추가하는 방법
을 설명한다.
5장 ‘하드웨어 기초’는 안드로이드를 구동하도록 설계된 하드웨어들을 소개한다. 안드로이드가
주로 사용하는 시스템-온-칩SoC, System-on-Chip, 안드로이드 시스템의 전형적인 메모리 구조, 개
발 설정, 시제품용 임베디드 안드로이드 시스템을 위해 손쉽게 사용할 수 있는 평가용 보드들
에 대한 내용을 다룬다.
6장 ‘네이티브 사용자 공간’은 루트 파일시스템의 구조, adb 도구, 안드로이드 명령행, init 설
정을 다룬다.
7장 ‘안드로이드 프레임워크’에서는 안드로이드 프레임워크가 어떻게 시작되는지, 프레임워크
와 상호작용할 수 있는 유틸리티와 명령, 정상 동작에 필요한 지원 데몬을 논의한다.
부록 A ‘레거시 사용자 공간’은 레거시 임베디드 리눅스 스택을 안드로이드 사용자 공간과 공존
하도록 하는 방법을 논의한다.
16
부록 B ‘새 하드웨어 지원하기’에서는 안드로이드 스택에 새로운 하드웨어 지원을 추가하는 방
법을 설명한다. 새로운 시스템 서비스를 추가하는 방법과 안드로이드의 하드웨어 추상화 계층
HAL, Hardware Abstraction Layer을 확장하는 방법을 다루게 된다.
부록 C ‘기본 패키지 목록 변경하기’에서는 AOSP로 생성하는 이미지에 기본적으로 포함되는
컴포넌트들을 변경하는 데 도움이 되는 자료를 소개한다.
부록 D ‘기본 init.rc 파일들’은 2.3/진저브레드와 4.2/젤리빈에서 사용되는 기본 init.rc 파일에
대한 보충 설명을 담고 있다.
부록 E ‘참고자료’에서는 웹사이트, 메일링 리스트, 도서, 행사 등과 같은 유용할 참고자료를 정
리하였다.
안드로이드 버전
이 책을 골랐을 때 이미 눈치챘을 수도 있겠지만, 이 책에서 다루는 안드로이드 버전은 현재 최
신 버전보다 한참 뒤떨어져 있을 것이다. 개정판을 내더라도 이러한 상태는 계속될 것이다. 그
이유는 간단하다. 안드로이드는 6개월마다 한 번씩 릴리스된다. 이 책을 쓰는 데 거의 2년이
걸렸고, 과거의 경험으로 유추해보면 기존 서적을 최신 버전에 맞게 갱신하는 데에는 최소한
6개월에서 1년이 걸린다.
그러니 당장 읽기를 멈추고 책을 환불하거나, 옛날 버전을 다룰지라도 이 책을 최대한 활용하
는 법을 알고 싶다면 계속 읽어나가길 바란다.
릴리스 주기가 매우 빠르지만, 안드로이드 내부 구조와 빌드 공정은 5년 전 처음 등장했을 때
와 거의 비슷하다. 이 책도 처음에는 2.3/진저브레드를 기준으로 쓰기 시작했지만 4.2/젤리빈
에 맞게 내용을 갱신하는 작업은 상대적으로 손쉬운 편이었다. 이 과정에서 필요한 경우 4.0/
아이스크림 샌드위치와 4.1/젤리빈 등 중간 버전에 대한 내용을 제공할 수도 있었다. 새로운
버전에는 새로운 요소가 추가되고, 같은 소프트웨어라도 기능이 더 풍성해지지만, 그 근간이
17
되는 내부 구조와 메커니즘은 상당한 시간이 흘러도 그대로 유지될 가능성이 높다.
따라서 필자가 안드로이드 개발 상황을 지켜보면서 이 책도 그에 맞춰 갱신하는데 인간적으로
최대한 노력하겠지만, 이 책에서 설명한 내용은 앞으로 나올 여러 버전에도 한동안은 계속해서
유용할 것이다.
실제로 어떤 사람들은 2.3/진저브레드가 최신 버전보다 훨씬 낮은 사양의 하드웨어에서 동작
하기 때문에 앞으로 상당한 기간 계속 사용될 것으로 생각한다. 일례로 2012년 12월에 열린
안데브콘AnDevCon IV 콘퍼런스에서 페이스북 소속의 키노트 연사는 자사의 앱은 2.3/진저브레드
기기를 아주 장기적으로 지원할 것이라고 했다. 최신 안드로이드보다 저렴한 기기에서도 동작
하기 때문이다.
예제 코드 활용하기
이 책은 독자의 개발 작업을 돕는 것을 목적으로 한다. 일반적으로 이 책의 코드를 여러분의 프
로그램과 문서에 사용할 수 있다. 코드 전체의 상당 부분을 복제하지 않는 이상은 필자에게 허
가를 구할 필요는 없다. 예를 들어 이 책에 나온 코드 일부를 사용하여 프로그램을 작성하는 경
우에는 허가를 받을 필요가 없다. 예제 코드를 CD에 담아서 판매하거나 배포하려면 허가가 필
요하다. 질문에 답하기 위해 이 책과 예제 코드를 인용할 때는 허가가 필요하지 않다. 여러분
제품의 문서에서 이 책의 예제 코드 상당 부분을 활용하려면 허가가 필요하다.
18
이 책은 10년 만에 낸 필자의 두 번째 책이다. 자기 자신을 분석하는 걸 좋아하진 않지만 필자
는 미지의 영역에 끌리는 경향이 있는 듯하다. 첫 책인 『임베디드 리눅스 시스템 구축하기』를
쓰리라 마음 먹은 2001년에는 임베디드 리눅스가 무엇인지를 전체적으로 설명하는 책이 없
었다. 1년 계획으로 시작했지만 2년이나 걸려서 원래 목표의 절반 정도를 써냈다. 마찬가지로
2011년에 임베디드 안드로이드를 쓰기로 했을 때에는 정보가 거의 없었다. 신기하게도 여러분
이 들고 있는 이 책 역시 끝내는 데까지 2년이나 걸렸다.
전반적으로 책을 집필한다는 것은 지리한 소모전처럼 느껴진다. 선택한 주제 때문이기도 할 것
이고, 혹은 필자가 부족하기 때문일 것이다. 야심 찬 주제에 관한 책을 혼자 감당하기에는 벅차
다. 실제로 이 책을 쓰기로 했을 당시에는 필요한 주제의 일부만 알고 있었다. 집필 과정에서
직접 조사한 것도 많지만 유능한 개발자들과 숱한 논의에서 더 많은 것을 배웠고, 그 결과 이
책이 탄생할 수 있었음을 강조하고 싶다. 따라서 콘퍼런스나 강의에서 필자에게 질문을 던진
적이 있거나 여러분이 안드로이드로 무슨 일을 하고 있는지 그리고 그 과정에서 맞닥뜨린 문제
를 필자에게 설명한 적이 있다면, 혹은 필자가 안드로이드에서 길을 잃고 헤매고 있을 때 올바
른 방향을 제시해준 적이 있다면 이 책에 여러분의 지혜가 녹아 있을 것이다.
이 책을 내준 출판사 역시 특별할 수밖에 없다. 첫 책 때 그랬던 것처럼 오라일리 출판사의
모든 분은 그냥 다 대단하다. 이 프로젝트와 내 집필 능력을 신뢰해준 마이크 헨드릭슨Mike
Hendrickson에게 먼저 감사를 드린다. 편집자인 앤디 오람Andy Oram과 다시 한 번 일할 기회를 얻
은 것은 굉장한 특권이었다. 문장 하나하나를 철저하게 검증했고 종종 기술적인 사항들도 지
적해주었다. 앤디와 더불어 이 책을 계속해서 진행하도록 격려해준 레이첼 루멜리오티스Rachel
Roumeliotis와 마리아 스탤론Maria Stallone에게도 감사드린다.
이런 종류의 책을 쓸 때는 기술적 정확성을 보장하는 데 가장 많은 신경을 써야 한다. 그렇기
때문에 유능한 기술 리뷰팀이 반드시 필요했다. 그런 점에서 이 프로젝트의 초기부터 검토를
수락해주고 긴 집필 과정 중 많은 의견을 준 매그너스 백Magnus Bäck, 마크 그로스Mark Gross, 아밋
펀디르Amit Pundir에게 먼저 감사드린다. 이 팀에는 계속해서 다른 유능한 사람들이 합류해줬다.
감사의 글
19
하드웨어 최고 전문가인 데이비드 앤더스David Anders는 하드웨어 관련 장에서 핵심적인 의견을
주었다. 로버트 PJ 데이Robert PJ Day는 안드로이드를 전혀 접해 보지 못한 독자들도 쉽게 이해할
수 있도록 집필하는 데 많은 도움을 주었다. 벤자민 조스Benjamin Zores는 스택 내부 구조의 여러
부분을 말끔하게 정리해주었다. 마지막으로 앤드류 밴 유터트Andrew Van Uitert와 맥심 리퍼드Maxime
Ripard를 비롯한 이 책의 초기 버전의 독자들은 책을 읽으며 접한 여러 문제를 공유해주었다.
리나로Linaro의 안드로이드팀에도 특별한 감사를 드리며, 2.3/진저브레드 중심으로 쓰인 이 책
의 초기 버전에서 4.2/젤리빈과의 수많은 차이를 거의 혼자서 찾아준 버나드 로젠크랜저Bernhard
Rosenkränzer에게 특별히 감사드린다. 원서 출간 시점에서 최신 버전인 4.2/젤리빈에 관한 책의 설
명이 만족스럽다면 그것은 버나드의 공이다. 필자가 이 책을 최신 버전에 맞게 갱신하도록 도
와주었을 뿐만 아니라 제공해준 의견도 매우 방대했고, 그중 상당수는 필자가 받은 의견 중 가
장 상세했다. 그러한 점에서 리나로의 팀이 책 집필을 도와주도록 허락해준 자크 페퍼Zach Pfeffer
에게도 감사드린다. 버나드를 비롯해 비셸 브호Vishal Bhoj, 파하드 쿠나다디Fahad Kunnathadi, 용퀸 리
우YongQin Liu가 기여해주었다.
앞서 언급했듯이 콘퍼런스에서 만난 분들도 집필에 많은 도움을 주었다. 그런 점에서 필자가
콘퍼런스에 참여하도록 해준 두 기관을 소개하고 싶다. 먼저, 2011년부터 안데브콘AnDevCon 콘
퍼런스를 주최해온 BZ 미디어팀에게 감사드린다. 초창기부터 필자에게 안드로이드의 내부 구
조를 주제로 한 강연을 할 수 있도록 신뢰해주었고 계속해서 초청해주었다. 그중 앨런 자이칙
Alan Zeichick, 테드 바르Ted Bahr, 스테이시 버리Stacy Burris, 케이티 세리니스Katie Serignese에게 특별히 감
사드린다. 또한, 키노트 연사로 불러주고, 안드로이드 빌더 서밋Android Builders Summit, 임베디드 리
눅스 콘퍼런스Embedded Linux Conference, 임베디드 리눅스 콘퍼런스 유럽Embedded Linux Conference Europe과
같은 여러 행사에 참여할 수 있도록 해준 리눅스 제단Linux Foundation에도 감사드린다. 그중에서도
마이크 보스터Mike Woster, 아만다 맥퍼슨Amanda McPherson, 안젤라 브라운Angela Brown, 크레이그 로스
Craig Ross, 마레사 파울러Maresa Fowler, 루돌프 스트레이프Rudolf Streif, 도미니크 듀발Dominic Duval, 이브
라힘 하다드Ibrahim Haddad, 제리 쿠퍼스테인Jerry Cooperstein에게 특별히 감사드린다.
20
레볼루션리눅스RevolutionLinux팀도 빼놓을 수 없다. 특히 초창기부터 ‘실험용 쥐’가 되는 것을 흔쾌
히 동의해준 베노이트 리그너리스Benoit des Ligneris, 브루노 램버트Bruno Lambert, 패트릭 터코트Patrick
Turcotte에게 특별히 감사드린다. 이분들의 노력이 이렇게 결실을 보았다.
마지막으로, 필자가 그동안 상대해온 것 중 가장 골치 아팠던 작품을 만들어준 구글의 안드로
이드팀에게 진심으로 특별한 감사 인사를 전한다. 이 운영체제를 살펴보는 작업은 한동안 내
가 해왔던 것 중 가장 재미있는 일이었다. 엄청난 소프트웨어를 만들고 매우 관대한 라이선스
로 제공한 구글 개발팀 전체에 찬사를 보낸다. 안드로이드는 기존의 오픈 소스 프로젝트와 달
리 (타당한 이유로) 개발 과정의 투명성에 중점을 두지 않았음을 이해하기에 다양한 방법으로
필자를 도와주었거나 도와주려 노력했던 안드로이드 개발자들에게도 감사드린다. LWN과 관
련한 의문점을 채워준 브라이언 스웨트랜드Brian Swetland와 쳇 하스Chet Haase에게도 감사드린다.
필자에게는 가장 가까운 사람들, 긴 과정 동안 사랑과 인내로 지켜봐준 소니아Sonia, 아나
이스Anaïs, 토마스Thomas, 빈센트Vincent 모두 너무 감사하다. Les mains invisibles qui ont
écrit les espaces entre les lignes sont les leurs et je leur en suis profondémment
reconnaissant(행간을 채운 보이지 않는 손인 그대들에게 진심으로 감사인사를 전한다).
21
CONTENTS
지은이· 옮긴이 소개 ...........................................................................................................
4
옮긴이의 말 ........................................................................................................................
5
추천의 글 ...........................................................................................................................
7
들어가면서 .......................................................................................................................
11
감사의 글 .........................................................................................................................
18
CHAPTER 1 소개
1.1 역사 .........................................................................................................................
29
1.2 기능과 특징 ...............................................................................................................
31
1.3 개발 모델 ..................................................................................................................
34
1.3.1 기존 오픈 소스 프로젝트와의 차이점 .....................................................................
34
1.3.2 추가 기능, 로드맵, 새 버전 ...................................................................................
36
1.4 생태계 ......................................................................................................................
37
1.4.1 오픈 핸드셋 얼라이언스 ......................................................................................
38
1.5 안드로이드 소스코드 구하기 .........................................................................................
38
1.6 법률 고려사항 ............................................................................................................
40
1.6.1 코드 라이선스 ...................................................................................................
40
1.6.2 브랜드 사용 ......................................................................................................
43
1.6.3 구글이 제공하는 안드로이드 앱 ............................................................................
45
1.6.4 다른 앱 마켓들 ..................................................................................................
45
1.6.5 오라클 대 구글 ..................................................................................................
45
1.6.6 모바일 특허 전쟁 ...............................................................................................
46
1.7 하드웨어와 호환성 요구사항 .........................................................................................
47
1.7.1 호환성 정의 문서 ...............................................................................................
48
1.7.2 호환성 테스트 스위트 .........................................................................................
52
1.8 개발 설정과 도구 ........................................................................................................
53
22
CHAPTER 2 안드로이드 내부 들여다보기
2.1 앱 개발자 관점 ...........................................................................................................
55
2.1.1 안드로이드 개요 ................................................................................................
56
2.1.2 프레임워크 소개 ................................................................................................
61
2.1.3 앱 개발 도구 .....................................................................................................
62
2.1.4 네이티브 개발 ...................................................................................................
63
2.2 전체적인 구조 ............................................................................................................
64
2.3 리눅스 커널 ...............................................................................................................
66
2.3.1 웨이크락 ..........................................................................................................
67
2.3.2 로우-메모리 킬러 ..............................................................................................
69
2.3.3 바인더 .............................................................................................................
71
2.3.4 안드로이드 공유 메모리 ......................................................................................
72
2.3.5 알람 ................................................................................................................
73
2.3.6 로거 ................................................................................................................
74
2.3.7 안드로이드에서 주목할 만한 다른 특징들 ...............................................................
77
2.4 하드웨어 지원 ............................................................................................................
78
2.4.1 리눅스의 방식 ...................................................................................................
79
2.4.2 일반적인 안드로이드 방식 ...................................................................................
79
2.4.3 로딩 및 연동 방법 ..............................................................................................
81
2.4.4 기기 지원 ........................................................................................................
84
2.5 네이티브 사용자 공간 ..................................................................................................
85
2.5.1 파일시스템 구조 ................................................................................................
86
2.5.2 라이브러리 .......................................................................................................
87
2.5.3 Init .................................................................................................................
91
2.5.4 Toolbox ..........................................................................................................
93
2.5.5 데몬 ................................................................................................................
94
2.5.6 명령행 유틸리티 ................................................................................................
95
CONTENTS
23
2.6 달빅과 안드로이드 자바 ...............................................................................................
95
2.6.1 자바 네이티브 인터페이스 ...................................................................................
98
2.7 시스템 서비스 ............................................................................................................
98
2.7.1 서비스 매니저와 바인더 연동 .............................................................................
104
2.7.2 서비스 호출하기 ..............................................................................................
105
2.7.3 서비스 사례: 액티비티 매니저 ............................................................................
106
2.8 AOSP 기본 패키지 ...................................................................................................
106
2.9 시스템 시동 .............................................................................................................
109
CHAPTER 3 AOSP 시작하기
3.1 개발 호스트 설정 ......................................................................................................
115
3.2 AOSP 받기 .............................................................................................................
116
3.3 AOSP 내부 .............................................................................................................
123
3.4 빌드 기본 ................................................................................................................
128
3.4.1 빌드 시스템 설정 .............................................................................................
129
3.4.2 안드로이드 빌드하기 ........................................................................................
132
3.5 안드로이드 구동하기 .................................................................................................
138
3.6 ADB 사용하기 .........................................................................................................
140
3.7 에뮬레이터 통달하기 .................................................................................................
145
CHAPTER 4 빌드 시스템
4.1 다른 빌드 시스템과의 차이점 ......................................................................................
152
4.2 아키텍처 .................................................................................................................
154
4.2.1 설정 ..............................................................................................................
155
4.2.2 envsetup.sh .................................................................................................
159
24
4.2.3 함수 정의 .......................................................................................................
166
4.2.4 주요 Make ...................................................................................................
167
4.2.5 빌드 청소 .......................................................................................................
170
4.2.6 모듈 빌드 템플릿 .............................................................................................
171
4.2.7 결과물 ...........................................................................................................
176
4.3 빌드 방법 ................................................................................................................
177
4.3.1 기본 droid 빌드 ..............................................................................................
178
4.3.2 빌드 명령 살펴보기 ..........................................................................................
178
4.3.3 리눅스와 맥 OS에서 SDK 빌드하기 ...................................................................
179
4.3.4 윈도우에서 SDK 빌드하기 ................................................................................
180
4.3.5 CTS 빌드하기 ................................................................................................
181
4.3.6 NDK 빌드하기 ...............................................................................................
182
4.3.7 API 갱신하기 .................................................................................................
184
4.3.8 개별 모듈 빌드하기 ..........................................................................................
185
4.3.9 트리 바깥에서 빌드하기 ....................................................................................
186
4.3.10 트리 안에서 재귀적으로 빌드하기 .....................................................................
188
4.4 AOSP 해킹 기본 ......................................................................................................
190
4.4.1 기기 추가하기 .................................................................................................
190
4.4.2 앱 추가하기 ....................................................................................................
196
4.4.3 앱 오버레이 추가하기 .......................................................................................
197
4.4.4 네이티브 도구와 데몬 추가하기 ..........................................................................
198
4.4.5 네이티브 라이브러리 추가하기 ...........................................................................
199
CHAPTER 5 하드웨어 기초
5.1 일반적인 시스템 아키텍처 ..........................................................................................
203
5.1.1 베이스밴드 프로세서 ........................................................................................
205
5.1.2 핵심 구성요소 .................................................................................................
206
CONTENTS
25
5.1.3 실제 세상과 상호작용하기 .................................................................................
207
5.1.4 연결성 ...........................................................................................................
208
5.1.5 확장, 개발, 디버깅 ............................................................................................
208
5.2 시스템-온-칩은 무엇인가? .........................................................................................
210
5.3 메모리 레이아웃과 매핑 .............................................................................................
214
5.4 개발 설정 ................................................................................................................
218
5.5 평가용 보드 .............................................................................................................
220
CHAPTER 6 네이티브 사용자 공간
6.1 파일시스템 ..............................................................................................................
225
6.1.1 루트 디렉터리 .................................................................................................
229
6.1.2 /system .......................................................................................................
230
6.1.3 /data ............................................................................................................
232
6.1.4 SD카드 .........................................................................................................
235
6.1.5 빌드 시스템과 파일시스템 .................................................................................
236
6.2 adb .......................................................................................................................
243
6.2.1 동작 원리 .......................................................................................................
243
6.2.2 주요 플래그, 인자, 환경 변수 ..............................................................................
245
6.2.3 기본 로컬 명령 ................................................................................................
246
6.2.4 기기 연결과 상태 .............................................................................................
248
6.2.5 기본 원격 명령 ................................................................................................
250
6.2.6 파일시스템 명령 ..............................................................................................
257
6.2.7 상태 변경 명령 ................................................................................................
260
6.2.8 PPP 터널링 ...................................................................................................
264
6.3 안드로이드 명령행 ....................................................................................................
265
6.3.1 2.3/진저브레드까지의 셸 ..................................................................................
266
26
6.3.2 4.0/아이스크림 샌드위치 이후의 셸 ....................................................................
268
6.3.3 Toolbox ........................................................................................................
268
6.3.4 핵심 네이티브 유틸리티와 데몬 ..........................................................................
280
6.3.5 추가적인 네이티브 유틸리티와 데몬 ....................................................................
288
6.3.6 프레임워크 유틸리티와 데몬 ..............................................................................
290
6.4 Init .........................................................................................................................
290
6.4.1 동작 원리 .......................................................................................................
290
6.4.2 설정 파일 .......................................................................................................
292
6.4.3 전역 속성 .......................................................................................................
301
6.4.4 ueventd .......................................................................................................
307
6.4.5 부트 로고 .......................................................................................................
310
CHAPTER 7 안드로이드 프레임워크
7.1 프레임워크 시작하기 .................................................................................................
314
7.1.1 핵심 모듈 .......................................................................................................
315
7.1.2 시스템 서비스 .................................................................................................
319
7.1.3 부트 애니메이션 ..............................................................................................
323
7.1.4 Dex 최적화 ....................................................................................................
326
7.1.5 앱 스타트업 ....................................................................................................
328
7.2 유틸리티와 명령어 ....................................................................................................
333
7.2.1 범용 유틸리티 .................................................................................................
333
7.2.2 서비스 유틸리티 ..............................................................................................
346
7.2.3 달빅 유틸리티 .................................................................................................
365
7.3 지원 데몬 ................................................................................................................
370
7.3.1 installd ........................................................................................................
372
7.3.2 vold .............................................................................................................
373
CONTENTS
27
7.3.3 netd ............................................................................................................
375
7.3.4 rild ..............................................................................................................
377
7.3.5 keystore ......................................................................................................
378
7.3.6 기타 지원 데몬 ................................................................................................
379
7.4 하드웨어 추상화 계층 ................................................................................................
380
appendix A 레거시 사용자 공간 ...................................................................................
383
appendix B 새 하드웨어 지원하기 ................................................................................
401
appendix C 기본 패키지 목록 변경하기..........................................................................
417
appendix D 기본 init.rc 파일들 ...................................................................................
421
appendix E 참고자료 .................................................................................................
449
찾아보기 ........................................................................................................................
456
291장 - 소개
소개
임베디드 기기에 안드로이드를 올리는 작업은 안드로이드 내부를 상세히 이해하고 AOSPAndroid
Open Source Project에 기반하여 리눅스 커널을 적절히 수정해야 하는 복잡한 작업이다. 안드로이드
임베디드 작업을 시작하기 전에 먼저 안드로이드의 하드웨어 요구사항과 임베디드 시 고려해
야 하는 안드로이드 관련 법적 사항과 같은 필수 배경 지식을 살펴볼 필요가 있다. 그 첫 번째
로 안드로이드가 어떻게 시작되고 개발되었는지 살펴보자.
1.1 역사
안드로이드의 시작은 2002년 초까지 거슬러 올라간다.* 구글의 래리 페이지Larry Page와 세르게
이 브린Sergre Brin은 스탠퍼드 대학교에서 개최한 당시 신예였던 데인저Danger 사의 사이드킥Sidekick
전화기 개발 관련 세미나에 참석했다. 발표를 진행한 데인저 사의 CEO 앤디 루빈Andy Rubin은
사이드킥이 최초의 인터넷 기반 다기능 기기 중 하나라고 했다. 발표가 끝난 후 래리는 기기를
살펴보았는데 구글이 기본 검색엔진으로 설정된 것을 보고 기뻐했다. 그리고 얼마 지나지 않아
래리와 세르게이는 사이드킥을 사용하기 시작했다.
*  저자주_ 2007년 11월 안드로이드 초기 버전이 발표되자 뉴욕타임즈는 “I, Robot: The Man Behind the Google Phone(아이로봇,
구글 폰을 이끈 사람)”이라는 기사를 실었다(http://nyti.ms/148x7bH). 이 기사에는 앤디 루빈이라는 인물과 그의 경력, 그리고 안드로이
드에 대한 통찰력 있는 이야기가 담겨 있다. 이번 절의 일부 역시 이 기사에 기반하였다.
CHAPTER 1
30 임베디드 안드로이드
사이드킥은 참신하고 사용자들도 열광했지만 상업적인 면에서는 성공하지 못했다. 2003년
이 되면서 루빈은 데인저 사의 이사회와 본인의 동의로 CEO 자리에서 물러난다. 그리고 다
른 몇 가지 사업을 시도해본 후 다시 전화기 OS 사업에 돌아오기로 결심한다. 자신이 보유한
android.com 도메인을 사용하여 전화기 제조사를 대상으로 한 공개 OS를 만드는 프로젝트
에 개인 자산 대부분을 투자하고 종잣돈을 투자받은 후 본격적인 투자를 유치하기로 한다. 그
리고 얼마 지나지 않은 2005년 8월 구글은 안드로이드 사를 인수하게 된다.
안드로이드를 인수한 후 2007년 11월 OS를 최초 공개하기 전까지 구글은 안드로이드 관련 정
보를 거의 공개하지 않았다. 대신 개발팀은 OS의 시제품 제작에 열중했다. 최초 공개는 오픈
핸드셋 얼라이언스OHA, Open Handset Alliance를 통해 이루어졌다. OHA는 모바일 기기를 위한 표준
개발을 목표로 여러 회사가 참여한 그룹으로 안드로이드가 그 첫 번째 제품이었다. 1년이 지난
2008년 9월 최초의 오픈 소스 버전 안드로이드 1.0이 공개되었다.
그 이후로 여러 안드로이드 버전이 공개되었고 개발은 더 공개적으로 이루어졌다. 뒤에서 자세
히 살펴보겠지만 안드로이드의 작업 대부분은 계속해서 비공개로 진행되고 있다. [표 1-1]은
안드로이드 버전과 각 AOSP에 해당하는 버전별 특징을 보여준다.
표 1-1 안드로이드 버전*
버전 출시일 코드명 주요 기능 소스 공개
1.0 2008년 9월 비공개 공개
1.1 2009년 2월 비공개* 공개
1.5 2009년 4월 컵케익 온-스크린 소프트 키보드 공개
1.6 2009년 9월 도넛 배터리 사용량과 VPN 지원 공개
2.0, 2.0.1, 2.1 2009년 10월 이클레어 익스체인지 지원 공개
2.2 2010년 5월 프로요 JIT 컴파일 공개
2.3 2010년 12월 진저브레드 SIP와 NFC 지원 공개
3.0 2011년 1월 허니콤 태블릿 폼팩터 지원 비공개
3.1 2011년 5월 허니콤 USB 호스트 지원과 API 비공개
4.0 2011년 11월 아이스크림 샌드위치 폰과 태블릿 폼팩터 통합 지원 공개
4.1 2012년 6월 젤리빈 성능 개선 공개
*  저자주_ 프티 푸르(Petit Four)였다는 설이 있다. 관련 이야기는 구글 플러스에 올라온 글인 http://bit.ly/1BjUIQy에서 찾을 수 있다.
311장 - 소개
4.2 2012년 11월 젤리빈 다중 사용자 지원 공개
4.3 2013년 7월 젤리빈 블루투스 LE, SELinux,
OpenGL ES 3.0 지원
공개
4.4 2013년 10월 킷캣 메모리 관리 개선, 구글 나우
개선, 클라우드 프린팅 지원
공개
5.0 2014년 10월 롤리팝 ART 가상 머신 지원,
64비트 CPU 지원
공개
5.1 2015년 3월 롤리팝 안정화, 멀티 심카드 지원 공개
1.2 기능과 특징
2.3/진저브레드 출시 즈음에 구글은 개발자 웹사이트에서 다음 기능을 홍보했다.
앱 프레임워크
안드로이드 앱을 개발할 때 개발자들은 앱 프레임워크를 사용한다. 프레임워크 사용법은
온라인 문서(http://developer.android.com)와 오라일리O’Reilly 출판사의 『Learning
Android』 등에 소개되었다.
달빅 가상 머신
오라클의 자바 가상 머신JVM, Java virtual machine을 대신하는 안드로이드의 독자적인 바이트 코드
해석기byte-code interpreter이다. 자바 가상 머신의 .class 파일에 해당하는 것이 달빅Dalvik에서는
.dex 파일이다. .dex 파일은 자바 컴파일러가 생성한 .class 파일을 다시 dx 유틸리티를
사용하여 변환한 것이다.
내장 웹브라우저
안드로이드는 웹킷WebKit 기반 웹브라우저를 기본으로 제공한다. 앱 개발자는 WebView 클
래스를 사용하여 앱 안에서 웹킷 엔진을 사용할 수 있다.
32 임베디드 안드로이드
그래픽 최적화
안드로이드는 독자적인 2D 그래픽 라이브러리를 제공하지만 3D 기능은 OpenGL ES에
의존한다.*
SQLite
표준 SQLite 데이터베이스로(http://www.sqlite.org) 개발자가 앱 프레임워크에서 사용
할 수 있다.
미디어 지원
안드로이드는 독자적인 미디어 프레임워크인 스테이지 프라이트StageFright로 다양한 미디어
형식을 지원한다. 2.2 버전 이전에는 패킷비디오PacketVideo의 오픈코어OpenCore 프레임워크를
사용했다.
GSM 전화 지원**
전화 기능은 기기마다 다르다. 제조사는 HALHadrware Abstraction Layer 모듈을 제공해야 안드로이
드가 하드웨어와 연동될 수 있다. HAL 모듈은 뒤에서 다루도록 하겠다.
블루투스, 엣지, 3G, WiFi
안드로이드는 대부분의 무선 기술을 지원한다. 엣지Edge와 3G는 안드로이드에 특화된 형태
로 구현되었지만, 블루투스와 WiFi의 경우는 일반 리눅스와 동일하게 제공된다.
카메라, GPS, 나침반, 가속센서
사용자의 실제 환경과 연동하는 것은 안드로이드에서 매우 중요하다. 앱 프레임워크는 이들
기기에 접근할 수 있는 API를 제공하며, 그 일부는 HAL 모듈이 있어야 활성화된다.
풍부한 개발 환경
안드로이드의 가장 큰 장점이다. 개발 환경은 안드로이드 개발을 손쉽게 시작할 수 있게 해
*  저자주_ OpenGL ES는 OpenGL 표준의 임베디드 시스템용 버전이다.
**  저자주_ 안드로이드는 물론 GSM 기술 외에도 많은 것을 지원하지만 공식적으로 이 이름으로 통칭하여 부른다.
331장 - 소개
준다. 전체 SDKSoftware Development Kit에는 에뮬레이터, 이클립스 플러그인, 디버깅 및 프로파
일링 도구들이 포함되며 무료로 내려받을 수 있다.
USB 지원, 멀티태스킹, 멀티 터치, SIP, 테더링, 음성 명령 등 안드로이드의 기능은 상당히 많
지만, 이 목록만으로도 안드로이드에 어떤 기능이 있는지 감을 잡기에는 충분하다. 안드로이드
버전이 갱신될 때마다 새로운 기능이 추가되므로 각 버전에 추가된 기능과 향상된 점은 공식
웹사이트에서 확인하기 바란다.
이상의 기본 기능 외에도 안드로이드 플랫폼은 다음 몇 가지 특성들로 임베디드 개발에 무엇보
다 적합할 수 있다. 간단히 살펴보도록 하자.
풍부한 앱 생태계
구글 플레이Google Play에는 약 130만 개의 앱이 등록되어 있다. 등록된 앱의 개수는 애플 앱스
토어Apple App Store에 등록된 120만 개를 넘어서며 임베디드 기기에 앱을 탑재하는 경우 다양
한 앱 중에서 선택할 수 있다. 임베디드 기기에 탑재하려면 앱 배포사와 사전 협의가 있어야
한다는 점을 명심하자. 구글 플레이에 등록되었다고 해서 앱 배포사가 아닌 제3자가 임베디
드 기기에 임의로 탑재할 수 있다는 의미가 아니라는 것이다.
앱 API 일관성
안드로이드 앱 프레임워크의 모든 API는 상위 호환성forward compatible을 염두에 두고 있다. 따
라서 임베디드 기기에 탑재하는 앱은 안드로이드 향후 버전에서도 계속해서 동작한다. 반
면, 안드로이드 소스코드를 수정한 경우는 바로 다음 버전에서도 동작한다고 보장할 수는
없다.
교체 가능 모듈
안드로이드는 오픈 소스이고 구조 특성상 많은 모듈을 교체할 수 있다. 예를 들어 기본 런
처Launcher 앱(홈 화면)이 마음에 들지 않으면 새로 만들 수 있고 구조적인 변경도 가능하다.
GStreamer* 개발자들은 안드로이드의 기본 미디어 프레임워크인 스테이지 프라이트를 앱
API를 수정하지 않고도 GStreamer로 교체할 수 있었다고 한다.
*  저자주_ GStreamer는 Gnome, KDE, XFCE 등 대부분의 데스크톱 리눅스의 기본 미디어 프레임워크다.
34 임베디드 안드로이드
확장성
소스코드 공개와 안드로이드의 구조적인 특성이 안겨주는 또 하나의 장점은 새로운 기능과
하드웨어 지원이 상대적으로 수월하다는 것이다. 같은 종류의 하드웨어나 기능이라면 플랫
폼의 동작을 그대로 따라하기만 하면 된다. 예를 들어 HAL에 새로운 하드웨어 지원을 추가
하려면 파일 몇 개만 추가하면 된다(부록 B).
사용자화
기본 런처 앱과 같은 모듈을 그대로 사용할 때도 원하는 대로 변경할 수 있다. 동작을 수정
하거나 모양과 느낌을 변경하기 위해 자유롭게 AOSP를 수정할 수 있다.
1.3 개발 모델
임베디드 플랫폼으로 안드로이드를 고려한다면 소스코드를 수정하거나 내부 구조에 종속된 코
드를 작성할 시에 안드로이드 개발 프로세스가 여기에 영향을 줄 수 있음을 인지해야 한다.
1.3.1 기존 오픈 소스 프로젝트와의 차이점
안드로이드의 가장 큰 특징 중 하나는 오픈 소스라는 점이다. 실제로 오픈 소스로 개발 시 누릴
수 있는 소프트웨어 엔지니어링의 많은 이점이 안드로이드에 적용된다.
단, 라이선스는 오픈 소스지만 안드로이드는 대부분의 다른 오픈 소스와 달리 개발은 비공개로
진행된다. 오픈 소스는 주로 공개 메일링 리스트와 포럼에서 프로젝트 개발자들의 논의를 볼
수 있고 공개된 소스 저장소에서 개발 코드를 받아볼 수 있다. 안드로이드는 이런 것이 없다.
앤디 루빈은 “오픈 소스는 커뮤니티 기반 프로젝트와 다르다. 안드로이드는 커뮤니티 기반에는
큰 비중을 두지 않지만 오픈 소스라는 점은 매우 비중 있게 다룬다”라며 안드로이드가 따르는
오픈 소스 방식의 특징을 설명한 바 있다.
좋든 싫든 안드로이드는 구글의 개발팀이 주로 개발하고, 일반 개발자는 내부 논의에 참여하
351장 - 소개
거나 개발 중인 코드를 볼 수 없다. 대신 구글은 새 버전의 안드로이드가 새 기기에 탑재되어
출시될 때마다 완성된 코드를 공개한다. 이 코드 공개는 대략 6개월 주기로 이루어진다. 일
례로 2010년 12월 삼성 넥서스 S 출시 며칠 후, 새로운 2.3/진저브레드 소스코드가 http://
android.googlesource.com에 공개되었다.
일부 오픈 소스 커뮤니티는 표준화된 개발 방법론과 모순되는 개발 방식의 안드로이드가 계속
‘오픈 소스’라고 불리는 것에 불편해한다. 안드로이드의 인지도를 고려하면 더욱 그렇다. 이제
껏 안드로이드와 유사한 방식으로 개발된 프로젝트들이 오픈 소스 커뮤니티를 존중하는 경우
는 드물었다. 이런 개발 모델에서는 구글의 사업 목표가 바뀌면 큰 타격을 받을 수밖에 없다는
점을 우려하는 사람들도 있다.
정치적인 사안들을 제쳐두고 논하자면 안드로이드 개발 모델에서는 개발자로서 안드로이드에
이바지하기는 어렵다. 구글 안드로이드 개발팀이 아닌 이상 코드 개발에 참여할 수는 없다. 일
부 극히 예외적인 경우를 제외하면 핵심 개발팀과 일대일로 개선사항을 논의할 수도 없다. 하
지만 여전히 AOSP 코드에 대한 개선이나 오류 수정을 http://android.googlesource.com
에 제출할 수는 있다.
구글 방식에서는 안드로이드 개발팀이 플랫폼에 대해 어떤 결정을 내리고 있는지 알 수 없다는
점이 가장 큰 단점이다. AOSP에 새 기능이 추가되는 경우나 핵심 모듈이 수정되면 다음에 공
개된 버전 소스코드를 분석하지 않는 이상 무엇이 바뀌었는지, 그로 인해 영향을 받을 만한 변
경은 무엇인지 알 수 없다. 게다가 수정되거나 추가된 기능이 어떤 요구사항과 제약사항으로
인해 만들어진 것인지도 알 수 없다. 안드로이드가 진정한 의미의 오픈 소스였다면 이런 사항
들을 공개된 메일링 리스트에서 살펴볼 수 있었을 것이다.
그럼에도 구글은 안드로이드를 오픈 소스 라이선스로 제공함으로써 이미 많은 기여를 하고 있
다. 오픈 소스 커뮤니티 관점에서는 개발 모델이 좀 어색하지만, 많은 개발자들에게는 구글이
개발하는 안드로이드는 그야말로 하늘에서 떨어진 것이나 다름없다. 게다가 엄청나게 성공적
인 리눅스 배포판을 만들어냈다는 점에서 안드로이드는 이제껏 어떤 오픈 소스 프로젝트도 성
공하지 못한 것을 이루어낸 셈이다. 이런 점들을 고려한다면 안드로이드 개발팀이 잘못하고 있
다고 말하기는 어려울 것 같다.
또한 커뮤니티 기반의 프로세스는 개발 중인 기능이 모두 공개되기 때문에 새로운 버전을 출시
36 임베디드 안드로이드
할 때 기삿거리를 만들기 어려워진다. 사업과 홍보 관점에서 볼 때 이런 프로세스의 도입은 당
연하다. 커뮤니티 기반 프로세스에서는 특정한 기능을 구현하기 위한 최고의 방법에 대한 합의
점을 찾는 데만 몇 년씩 걸리는 경우도 허다하다. 뒤돌아보면 안드로이드의 성공 요인 중 하나
는 구글이 새로운 기능들을 신속하게 개발해내면서 기삿거리를 만들어낼 수 있었기 때문이기도
하다.
1.3.2 추가 기능, 로드맵, 새 버전
결론적으로 미래에 공개될 안드로이드의 기능이나 성능과 관련한 로드맵은 공개된 바 없다. 구
글은 다음 버전의 이름과 대략적인 출시일 정도를 공개할 뿐이다. 보통 매년 5월에 열리는 구
글 I/O와 연말 즈음에 새 안드로이드가 나올 것이라고 기대할 수는 있다. 하지만 어떤 기능이
포함될지는 아무도 모른다.
구글은 다음 안드로이드 버전을 함께 작업할 제조사를 보통 한 곳만 선택한다. 그리고 선택한
회사의 엔지니어들과 긴밀히 협력하여 안드로이드의 최신 버전을 대표 기기에 탑재한다. 이 기
간에만 제조사의 엔지니어들은 개발 중인 소스코드에 접근할 수 있다고 한다. 기기가 출시되면
소스코드도 공개되며 신 버전 출시가 마무리된다. 다음 버전에서는 또 다른 제조사를 선택하여
이 과정을 반복한다.
안드로이드 3.x/허니콤을 개발할 때 이런 개발 과정에 예외가 한 번 있었다. 이때만 특수하게
도 구글은 레퍼런스 기기인 모토로라 줌Motorola Xoom 쪽에 소스코드를 공개하지 않았다. 안드로
이드 개발팀이 태블릿용 안드로이드를 시장의 요구에 맞추어 최대한 빨리 만들어내느라 안드
로이드의 코드베이스에서 파생된 코드를 만들어냈기 때문이라고 추정될 뿐이다. 따라서 허니
콤에서는 스마트폰과의 호환성은 최소한으로 고려되었다. 구글은 플랫폼 파편화를 우려하여
코드를 공개하지 않은 것으로 보인다. 그 대신 다음 버전이었던 안드로이드 4.0/아이스크림 샌
드위치에서는 스마트폰과 태블릿을 모두 지원하도록 합쳐졌다.
371장 - 소개
1.4 생태계
2013년 1월 기준으로
●● 매일 130만 대의 안드로이드 기기가 개통되고 있다. 2011년 6월 40만 대와 2010년 8월 20만 대와 비교
해볼 때 증가한 수치다.
●● 구글 플레이에는 대략 70만 개의 앱이 등록되었다. 애플의 앱스토어에 등록된 앱의 개수도 비슷하다.*
●● 전 세계 스마트폰 중 72%가 안드로이드 기반이다.
안드로이드는 명백하게 고속성장 중이다. 가트너는 2016년이면 윈도우마저 제칠 것으로 예측
했다. 10년 전쯤 임베디드 시장을 강타한 리눅스 이후 안드로이드가 다시금 뚜렷한 족적을 남
길 태세다. 기존의 강자들을 시장에서 도태시켜 나가면서 모바일 시장의 판세를 뒤집을 뿐만
아니라 임베디드 기기의 표준 UI로 자리 잡을 확률이 높다. 사용자와 직접 상호작용하지 않는
기기에서마저 기존의 임베디드 리눅스를 교체할 움직임까지 보인다.
전체 생태계가 안드로이드를 중심으로 급속하게 형성되고 있다. ARM, TI, 퀄컴Qualcomm, 프리
스케일Freescale, 엔비디아Nvidia와 같은 반도체 및 시스템-온-칩 제조사들은 제품 차원에서 안드
로이드를 지원하고, 모토로라, 삼성, HTC, 소니, LG, Archos, 델, ASUS와 같은 소비자 제품
제조사들은 안드로이드가 탑재된 제품 출시를 지속해서 확대하고 있다. 이런 생태계에는 아마
존, 버라이즌Verizon, 스프린트Sprint, 반스앤노블Barnes  Noble과 같이 독자적인 앱 마켓을 만들고 있
는 주체들도 포함된다.
안드로이드 기반의 비공개 커뮤니티와 프로젝트도 여기저기에서 생겨나고 있다. 이런 커뮤니
티와 프로젝트들은 여느 오픈 소스 프로젝트처럼 메일링 리스트와 포럼을 통해 이루어진다. 이
들은 공식 안드로이드 소스코드에 독자적인 기능과 개선을 추가하여 분파된 소스코드를 생성
한다. 일례로 사이애노젠모드CyanogenMod 프로젝트는 고급 사용자용 시스템 이미지를 제공한다.
안드로이드를 개량하여 독자적인 플랫폼을 갖추려는 회사도 많다. 예를 들어 여러 ARM SoC
제조사로 구성된 비영리 단체인 리나로는 플랫폼에 최적화된 안드로이드 소스코드 트리를 제
공한다. 제조사가 제공한 바이너리를 해킹해서 독자적인 수정을 적용하거나 변형 버전을 만드
는 해커들도 있다. AOSP에서 분파된 프로젝트와 개발 커뮤니티 전체 목록은 부록 E에서 살펴
볼 수 있다.
*  저자주_ 집필 시점에는 이미 애플 앱스토어의 개수를 훨씬 능가했다.
38 임베디드 안드로이드
1.4.1 오픈 핸드셋 얼라이언스
앞서 언급했듯이 초창기에는 오픈 핸드셋 얼라이언스가 주체가 되어 안드로이드를 공개했다.
웹사이트에는 다음과 같이 소개되어 있다.
82개의 기술 및 모바일 회사가 한데 모여 모바일 혁신을 가속하고 소비자들에게 풍부하고 저
렴하면서도 더 나은 모바일 경험을 제공하고자 한다. 우리는 최초로 완전한 형태의 무료 공개
모바일 플랫폼인 안드로이드를 함께 협력하여 개발한다.
하지만 최초 공개 이후 OHA의 역할은 불분명하다. 예를 들어 구글 I/O 2010의 ‘안드로이드
팀과 나누는 담소(Fireside Chat with the Android Team)’ 행사에서 한 참가자가 OHA
참여사에 소속된 자신에게 개발자로서 얻게 되는 혜택이 무엇인지를 물었다. 패널들의 이야기
를 듣고 내린 결론은 안드로이드 개발팀은 OHA가 아니라서 모른다는 것이다. 이를 미루어 볼
때 안드로이드 개발팀에게 OHA는 딱히 특별한 의미는 없는 것 같다.
OHA는 이사회나 상주 직원이 없어서 더욱 그 역할이 불분명하다. 단지 ‘연합’일 뿐이다. 게다
가 구글이 안드로이드를 공개할 때 OHA에 대해 별다른 언급도 없고, OHA도 새 안드로이드
출시에 대해 별다른 입장을 표명하지 않는다. 종합해보면 구글은 산업계가 안드로이드를 지지
한다는 것을 홍보하기 위해 OHA를 만들었을 뿐, 실제로는 안드로이드 개발에는 거의 관여하
지 않는다고 할 수 있다.
1.5 안드로이드 소스코드 구하기
안드로이드를 임베디드 시스템용으로 사용하려면 안드로이드 호환 리눅스 커널과 안드로이드
자체, 이렇게 두 가지가 필요하다.
상당 기간 안드로이드 호환 리눅스 커널을 구하기가 쉽지 않았다. 집필 시점에서도 어떤 경우
에는 여전히 어려웠다. http://kernel.org에서 ‘바닐라’ 커널(메인라인 커널)을 사용하는 대
신 AOSP의 커널을 사용하거나 바닐라 커널을 안드로이드에 호환되도록 변경해야 한다. 안드
로이드 개발팀에서 안드로이드 구동을 위해 메인라인 커널에 가한 여러 변경이 문제가 될 수
391장 - 소개
있기 때문이다. 추가로 도입된 기능들을 메인라인 커널에 반영하는 것은 지금까지는 상당한 저
항을 불러왔다.
2장에서 커널 이슈를 자세하게 다루겠지만, 2011년 프라하에서 열린 리눅스 커널 서밋Linux
Kernel Summit에서 커널 개발자들이 안드로이드 플랫폼 구동에 필요한 기능들을 공식 리눅스 버
전에 적극 추가하기로 했다. 그래서 안드로이드 필수 기능 중 상당수가 현재까지 메인라인 커
널에 합쳐졌고, 일부는 다른 메커니즘으로 교체 혹은 대체되었거나 진행 중이다. 현재로서는
SoC 제조사에 안드로이드용 커널을 요청하는 것이 가장 효과적인 방법이다. 안드로이드의 대
중성 덕분에 대부분의 주요 SoC 제조사는 안드로이드를 적극 지원한다.
안드로이드 플랫폼은 ‘안드로이드’라고 불리는 사용자 공간user space을 포함한 리눅스 배포판이
다. 릴리스 목록인 [표 1-1]은 플랫폼 출시 목록과 다름없다. 플랫폼의 요소와 구조는 2장에서
논하기로 하고, 지금은 플랫폼 출시는 우분투나 페도라 같은 리눅스 배포판의 출시에 해당한다
고 생각하면 된다. 플랫폼은 독자적 완결성을 갖는 소프트웨어 패키지들의 묶음으로 특정한 도
구, 인터페이스, 개발자 API를 통해 특정한 형태의 사용자 경험을 제공한다.
안드로이드 호환 커널에서 동작하는 안드로이드 배포판의 소스코드를 일컫는 정확한 명칭은 ‘안드
로이드 플랫폼’이다. 이를 보통은 AOSP라고 부르며 이 책에서도 AOSP로 지칭하겠다. 프로젝트 웹사이트
(http://android.google.source.com)에서 제공하는 AOSP에는 플랫폼 이외의 정보도 포함되어 있다.
견본 리눅스 커널 트리나 추가적인 패키지들인데, repo 명령으로 얻어올 때에는 보통 포함되지 않으니 궁금
하면 확인해보는 것도 좋을 것이다.
바이너리 해킹
안드로이드 소스를 구하기 어렵다는 사실도 열정적인 해커들이 안드로이드를 해킹하고 변경하
는 것을 막지는 못했다. 실제로 Android 3.x/허니콤의 소스코드는 구할 수는 없었지만 그래도
해커들은 반스앤노블의 누크Nook에 허니콤을 올렸다. 허니콤 SDK에 포함된 에뮬레이터 이미지
의 실행 파일들을 누크 위에서 구동하는 데 성공한 것이다. 물론 이 때문에 하드웨어 가속은 포
기해야 했다. 이런 종류의 해킹은 제조사가 소스코드를 제공하지 않는 기기를 루팅하거나 일부
구성요소 버전을 갱신하는 데 활용되고 있다.
40 임베디드 안드로이드
1.6 법률 고려사항
다른 소프트웨어들과 마찬가지로 안드로이드를 사용하거나 배포하려면 라이선스, 지적재산권
관련 규약, 시장원리를 지켜야 한다. 이 중 몇 가지를 살펴보자.
필자가 법률 전문가는 아니므로 이 책에서 논의하는 내용을 법률 조언으로 받아들여서는 안 된다.
특정한 사용에 대해 적용될 수 있는 법적 사항과 라이선스에 관련해서는 전문적인 법률 자문을 구하길 바란
다. 법률 전문가는 아니지만 다음의 내용은 오픈 소스 쪽에 오래 몸담았던 엔지니어의 개인적인 소양으로 보
아도 좋을 것이다.
1.6.1 코드 라이선스
앞서 논의했듯이 안드로이드는 안드로이드 호환 리눅스 커널과 AOSP 두 부분으로 이루어
져 있다. AOSP를 구동하기 위해 변경되었지만 안드로이드 호환 리눅스 커널은 여전히 GNU
GPL v2 라이선스로 제공된다. 그렇기 때문에 리눅스 커널 변경 사항은 GPL 외의 다른 라이선
스로 제공할 수 없다. http://android.googlesource.com 또는 SoC 제조사에서 커널을 구
해서 시스템에 맞게 개량한 경우, GPL 라이선스를 따르는 조건으로만 커널 이미지를 제품에서
제공할 수 있다. 이는 이미지를 만드는 데 사용한 소스와 수정사항들이 GPL 라이선스에 따라
모두 공개되어야 함을 의미한다.
리누스 토르발스Linus Benedict Torvalds는 커널 소스의 COPYING 파일에 GPL 라이선스는 커널에
만 적용됨을 명시하였다. 커널 위에서 작동하는 운영 프로그램들은 그 라이선스의 대상이 아니
며 커널에서 파생된 것으로 간주하지 않는다. 따라서 리눅스 커널 위에서 작동하는 응용 프로
그램은 독자적인 라이선스로 배포할 수 있다.
이와 같은 법 규정과 적용은 오픈 소스 커뮤니티와 리눅스 커널을 지원하거나 사용하는 회사
대부분은 잘 이해하고 받아들이고 있다. 커널과 함께 리눅스 기반 배포판의 핵심 요소들 상당
수는 보통 GPL 계열의 라이선스를 활용한다. GNU C 라이브러리(glibc), GNU 컴파일러
(GCC)는 각각 LGPL과 GPL이다. 임베디드 리눅스 시스템에서 두루 사용되는 중요 패키지인
uClibc와 BusyBox 역시 LGPL과 GPL을 따른다.
그렇다고 모두가 GNU GPL을 반기지는 않는다. 실제로 규모가 큰 조직에서는 파생 작업에 적
411장 - 소개
용되는 제약사항들이 문제가 될 수 있다. 조직이 여러 지역에 걸쳐 있고 하부 조직마다 문화가
다를 수 있으며 협력 업체까지 관여하게 되면 더욱 그렇다. 예를 들어 북미의 경우 수십에서 수
백 개의 공급업체와 계약을 맺는 제조사도 있다. 각 공급업체가 납품하는 코드에는 GPL 코드
도 포함될 수 있다. 하지만 고객은 결국 제조사의 이름을 보고 구매하기 때문에 제조사는 공급
업체와 상관없이 GPL에 적용받는 경우 소스코드를 제공해야 한다. 더불어 GPL 기반 프로젝
트에 참여하는 엔지니어들이 라이선스를 준수할 수 있는 프로세스도 도입해야 한다.
구글이 제조사들과 ‘공개’ 모바일 OS를 만들고자 했을 때 가장 먼저 GPL은 될 수 있으면 적용
하지 않도록 신경 써야 했다. 사실 리눅스가 아닌 다른 커널들이 고려되었지만, 리눅스가 이미
업계에 굳건히 자리를 잡았고 특히 ARM 기반 칩 제조사들은 리눅스를 더 많이 활용하는 상태
였다. 하지만 다행히도 커널은 시스템의 다른 부분과 달리 독립적이었기 때문에 GPL을 적용받
는다고 해도 전체에 큰 영향을 주지는 않았다.*
그렇지만 사용자 공간에 위치하는 모듈에는 GPL 문제가 적용되면 곤란하기 때문에 다른 라
이선스가 적용되도록 노력이 필요했다. 그래서 다른 임베디드 리눅스 시스템 대부분에 탑재되
는 glibc, uClibc, BusyBox와 같은 GPL 또는 LGPL 모듈들은 AOSP에 포함되지 않았다.
대신 구글은 AOSP에 필요한 상당수의 구성요소를 직접 제작하여 아파치 라이선스 2.0Apache
License 2.0 (줄여서 ASL)을 적용했으며, glibc와 uClibc를 대체하는 바이오닉Bionic 라이브러리와
BusyBox를 대체하는 툴박스Toolbox 유틸리티와 같은 일부 핵심 요소에는 BSD 라이선스를 적
용했다. 몇몇 기존의 오픈 소스 프로젝트들은 원래의 라이선스를 그대로 적용하여 있는 그대로
의 AOSP를 external/ 디렉터리에서 연동되도록 하였다. 이는 AOSP에는 ASL도 BSD도 아
닌 요소 역시 포함됨을 의미한다. AOSP는 여전히 GPL과 LGPL이 적용되는 요소들을 포함
한다. 하지만 이런 요소를 포함하여 배포하더라도 OEM에서 이를 수정하는 경우는 거의 없고
(즉, 파생 작업이 생기지 않는다) 해당 모듈의 소스코드는 http://android.googlesource.
com에서 이미 제공하고 있다. 즉 이것으로 파생 작업의 재배포에 대한 GPL 규정은 만족하기
때문에 문제될 만한 사항은 아니다.
GPL과 달리 ASL은 파생 작업에 특정한 라이선스를 적용하지 않는다. 수정사항에 어떤 라이
선스를 적용해도 상관없다. 다음은 이와 관련하여 ASL에서 발췌한 내용이다(라이선스 전문은
*  저자주_ 이러한 결정의 뒷 이야기가 궁금하다면 안드로이드 커널 개발팀의 브라이언 스웨트랜드(Brian Swetland)가 LWN에 남긴 글을
읽어보기 바란다. http://lwn.net/Articles/446371
42 임베디드 안드로이드
아파치 소프트웨어 재단http://www.apache.org/licenses에서 찾아볼 수 있다).
●● 이 라이선스의 규정과 조건에 따라 라이선스의 대상이 되는 사용자에게 재현, 파생 작업, 공공 전시 및 실시, 라
이선스 임대, 작업물 및 파생 작업물을 원래 형태(Source) 또는 목적물 형태(Object)로 배포할 수 있는 영
구적이며 전 세계에서 적용되는 비(非)배타적, 무료, 무(無)로열티, 번복 불가능한 저작권을 허여한다.
●● 라이선스 사용자는 수정된 사항에 독자적인 저작권 조항을 적용할 수 있으며 수정사항의 사용, 재현, 수정된
작업물 및 파생 작업물에 대해 추가 또는 다른 라이선스 규정과 조건을 지정할 수 있으며 작업물의 사용, 재현,
배포에 대해 별다른 명시가 없는 경우는 현재 라이선스의 조건을 따른다.
더 나아가 ASL은 특허 실시권을 명시적으로 허용하기 때문에 ASL이 적용된 안드로이드 코드
를 사용할 시에는 구글의 특허 라이선스가 필요하지 않다. 이 라이선스는 몇 가지 행정적인 요
구사항을 포함하는데, 예를 들어 수정된 파일이 읽기 쉬운 형태로 정리되어야 하고, 수신자 역
시 ASL 라이선스를 한 부 받아야 하며, NOTICE 파일들이 있는 그대로 제공되어야 한다. 정
리하면 ASL은 필요에 따라 수정된 사항을 어떤 형태의 라이선스로든 제공할 수 있다는 것이다.
Bionic과 Toolbox에 적용되는 BSD 라이선스는 비슷한 형태로 바이너리 배포만을 허용한다.
따라서 ASL의 다른 규정들을 준수하는 한 제조사들은 AOSP를 변경하더라도 원치 않는다면
변경 내용을 공개하지 않고 소유할 수 있다. GPL이었다면 외부의 요구에 대비하여 모든 변경
을 상세하게 추적하는 프로세스를 도입해야 하는 부담이 없어진다는 점에서 큰 이점이 있다.
GPL 라이선스 요소 추가하기
안드로이드의 사용자 공간에서 GPL은 되도록 쓰지 않는 것이 좋지만 때에 따라서는 GPL이 적
용된 구성요소를 사용하고 싶을 수도 있다. 예를 들어 기존의 리눅스 응용 프로그램을 안드로이
드의 바이오닉에 맞게 이식하기보다는 POSIX 호환 C 라이브러리인 glibc나 uClibc를 사용하
고 싶을 수 있다. 또는 기능이 적은 Toolbox만으로는 부족하므로 BusyBox도 함께 사용하고
자 할 때도 있을 것이다.
이런 추가 사항들은 개발 과정에서 필요하지만, 최종 제품에서는 제거될 수도 있고 맞춤형으로
제작된 안드로이드에 필수요소가 될 수도 있다. 일반적인 안드로이드나 GPL 패키지를 포함하는
경우 라이선스의 요구사항을 모두 준수해야 한다는 점을 명심하자.
431장 - 소개
1.6.2 브랜드 사용
구글은 안드로이드 소스코드를 무척 관대하게 제공하지만, 안드로이드 관련 브랜드는 좀 더 엄
격하게 다룬다. 브랜드와 관련된 사항 몇 가지와 사용 약관을 살펴보자. 공식 목록과 공식 약관
은 http://bit.ly/Zu5HCV에서 확인할 수 있다.
안드로이드 로봇
안드로이드와 관련된 곳에서는 어디에나 등장하는 친숙한 녹색 로봇이다. 이 로봇의 역할
은 리눅스의 펭귄과 비슷하고, 마찬가지로 사용 행태에도 거의 규제가 없다. 구글은 로봇이
“홍보용 사용뿐 아니라 복제와 수정도 임의로 할 수 있다”고 규정한다. 유일한 요구사항은
Creative Commons Attribution 라이선스의 규정을 따라야 한다는 것뿐이다.
안드로이드 로고
이 로고는 독자적인 글씨체를 적용한 A-N-D-R-O-I-D라는 문자 집합을 의미하며, 기
기 및 에뮬레이터의 부팅 시와 안드로이드 웹사이트(http://android.com)에 사용된다.
다른 경우에는 이 로고를 사용할 수 없다. 7장에서 부팅할 때 표시되는 로고를 수정하는 방
법을 다룰 것이다.
안드로이드 글씨체
안드로이드 로고에 사용되는 독자적인 글씨체로 로고에 적용되는 제약사항들이 그대로 적
용된다.
정식 제품명과 설명에서의 ‘Android’
구글이 명시하듯이 ‘Android’를 앱이나 보조 제품의 이름으로 사용할 수 없다. 대신 ‘for
Android(안드로이드용)’라고 표시하여 사용할 수 있다. 즉 Android MediaPlayer는 안
되지만 MediaPlayer for Android는 괜찮다. 구글은 Android는 일반적으로 받아들여
지는 광범위한 의미로 사용될 때는 설명에 포함할 수 있다고 한다. 예를 들어 ‘Android™
앱’인 경우가 그렇다. 물론 상표권 표시는 항상 포함해야 한다. 요약하면 구글의 허락 없
이는 제품 이름을 ‘Android Foo’와 같은 형태로 지을 수 없다는 것이다. 물론 ‘Foo for
Android’는 가능하다.
44 임베디드 안드로이드
‘Android’ 브랜드 기기
안드로이드 호환성 프로그램ACP, Android Compatibility Program의 FAQ에 따르면 기기 제조사가
제품 이름에 ‘Android’를 넣고자 할 때는 호환됨을 먼저 확인받아야 한다. 기기 이름을
‘Android’라고 짓는 것은 구글의 독자적인 권한이다. 즉 기기는 일단 안드로이드와 호환되
어야 하고 ‘Foo Android’와 같은 이름으로 기기를 홍보하려면 먼저 구글과 일종의 협약을
맺어야 한다는 것이다. 안드로이드 호환성 프로그램과 관련해서는 이 장의 뒷부분에서 다시
다루도록 할 것이다.
‘Droid’를 공식 명칭에 사용하는 경우
‘Foo Droid’와 같이 ‘Droid’를 사용할 수 없다. 무슨 연유인지는 아직도 이해할 수는 없지
만 ‘Droid’ 상표권은 영화 스타워즈 제작사인 루카스필름이 소유하고 있다. 이 단어를 사
용하고 싶다면 먼저 제다이가 되어라.
Play라는 단어와 브랜드
구글이 Android 브랜드는 매우 엄격하게 통제하지만 AOSP의 대부분에 적용되는 ASL에는
다음과 같이 명시하고 있다. ‘본 라이선스는 라이선스를 부여자의 상표권, 상표권이 적용된 표
식, 서비스 표식, 제품명을 합리적이고 관습적인 범위 내에서 원 작업물을 설명하는 경우와
NOTICE 파일의 내용을 재현하는 경우를 제외하고는 실시를 허용하지 않는다.’
여기서는 상표권을 사용할 수 없음을 명시하고 있지만 ‘합리적이고 관습적인 범위 내에서 원 작
업물을 설명하는 경우’라는 예외 덕분에 우리의 기기가 ‘AOSP 기반’임을 표시할 수 있다고 해
석하는 것이 일반적이다. 더 나아가 어떤 이들은 ‘Android 기반’ 기기라고 명시하기도 한다.
‘Android’라는 단어는 언급하지 않는 대신 안드로이드 로봇을 내세워 광고하는 경우도 있다.
이제껏 본 것 중 가장 교묘한 경우는 기기의 기능 목록 중 하나로 ‘안드로이드 앱 구동’이라고 표
시한 것이다. 안드로이드 앱을 구동할 수 있다면 어떤 형태로든 AOSP가 사용됐다는 것에 내 손
목과 가진 돈 모두라도 걸 수 있다.
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기
『임베디드 안드로이드』 - 미리보기

Mais conteúdo relacionado

Semelhante a 『임베디드 안드로이드』 - 미리보기

Exynos4210 beginnerrev10
Exynos4210 beginnerrev10Exynos4210 beginnerrev10
Exynos4210 beginnerrev10
mimul
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Sung-tae Ryu
 
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호 track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
양 한빛
 
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
Sang Don Kim
 

Semelhante a 『임베디드 안드로이드』 - 미리보기 (20)

develop android app using intellij
develop android app using intellijdevelop android app using intellij
develop android app using intellij
 
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
How to implement your dream 20150427
How to implement your dream 20150427How to implement your dream 20150427
How to implement your dream 20150427
 
『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기
 
웹표준화,대한민국 의식개선프로젝트-03 웹표준,접근성이란?
웹표준화,대한민국 의식개선프로젝트-03 웹표준,접근성이란?웹표준화,대한민국 의식개선프로젝트-03 웹표준,접근성이란?
웹표준화,대한민국 의식개선프로젝트-03 웹표준,접근성이란?
 
Exynos4210 beginnerrev10
Exynos4210 beginnerrev10Exynos4210 beginnerrev10
Exynos4210 beginnerrev10
 
Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212
 
WHAT / WHY / HOW WE’RE ENGINEERING AT SMARTSTUDY
WHAT / WHY / HOW WE’RE ENGINEERING AT SMARTSTUDYWHAT / WHY / HOW WE’RE ENGINEERING AT SMARTSTUDY
WHAT / WHY / HOW WE’RE ENGINEERING AT SMARTSTUDY
 
[스마트스터디]스마트스터디는 무엇을 / 왜 / 어떻게 만들어 왔는가
[스마트스터디]스마트스터디는 무엇을 / 왜 / 어떻게 만들어 왔는가[스마트스터디]스마트스터디는 무엇을 / 왜 / 어떻게 만들어 왔는가
[스마트스터디]스마트스터디는 무엇을 / 왜 / 어떻게 만들어 왔는가
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망
 
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
 
31기 고지웅 "구글오픈소스"
31기 고지웅 "구글오픈소스"31기 고지웅 "구글오픈소스"
31기 고지웅 "구글오픈소스"
 
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호 track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
 
라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT
 
『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기
 
Hello std.io 유명환_20140125
Hello std.io 유명환_20140125Hello std.io 유명환_20140125
Hello std.io 유명환_20140125
 
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
 
Ces2017브리핑 참석후기
Ces2017브리핑 참석후기Ces2017브리핑 참석후기
Ces2017브리핑 참석후기
 
About Programmer 2021
About Programmer 2021About Programmer 2021
About Programmer 2021
 

Mais de 복연 이

『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
복연 이
 
『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기
복연 이
 
『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기
복연 이
 
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
복연 이
 
『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기
복연 이
 
『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기
복연 이
 

Mais de 복연 이 (20)

​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
 
​『골빈해커의 3분 딥러닝』 맛보기
​『골빈해커의 3분 딥러닝』 맛보기​『골빈해커의 3분 딥러닝』 맛보기
​『골빈해커의 3분 딥러닝』 맛보기
 
​『함수형 반응형 프로그래밍』 맛보기
​『함수형 반응형 프로그래밍』 맛보기​『함수형 반응형 프로그래밍』 맛보기
​『함수형 반응형 프로그래밍』 맛보기
 
『파이썬 라이브러리를 활용한 머신러닝』 맛보기
『파이썬 라이브러리를 활용한 머신러닝』 맛보기『파이썬 라이브러리를 활용한 머신러닝』 맛보기
『파이썬 라이브러리를 활용한 머신러닝』 맛보기
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
 
『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
『밑바닥부터 시작하는 딥러닝』 - 미리보기
『밑바닥부터 시작하는 딥러닝』 - 미리보기『밑바닥부터 시작하는 딥러닝』 - 미리보기
『밑바닥부터 시작하는 딥러닝』 - 미리보기
 
『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기
 
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
 
『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기
 
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기
 
『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기
 
『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기
 
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
 
『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기
 
『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
 

『임베디드 안드로이드』 - 미리보기

  • 1.
  • 2. www.hanbit.co.kr 이것이 프로그래밍이다! 이것이 안드로이드다 진정한 안드로이드 개발자로 이끌어줍니다. SDK 5.0 롤리팝 호환! 책만 보고, 동영상 강좌로도 만족하지 못했다면 Daum 카페 '슈퍼드로이드'에서 만나요 cafe.daum.net/superdroid 박성근 저 | 1,164쪽 | 45,000원 이것이 C언어다 세상에 없던 새로운 C언어 입문서 탄생! 삼성, LG에서 펼쳐졌던 전설의 명강의를 풀타임 동영상 강좌로! 이보다 더 확실한 방법은 없다, 칠판강의 전체 동영상 강좌 유투브 전격 공개! http://goo.gl/tJK3Tu 서현우 저 | 708쪽 | 25,000원 이것이 자바다 가장 중요한 프로그래밍 언어를 하나 배워야 한다면, 결론은 자바다! 중급 개발자로 나아가기 위한 람다식, JavaFX, NIO 수록 자바의 모든 것을 알려주는 인터넷 강의 궁금한 것은 카페에서! cafe.naver.com/thisisjava 신용권 저 | 1,224쪽 | 30,000원 저자직강동영상 제공!
  • 3. 모던 웹을 위한 JavaScript + jQuery 입문 www.hanbit.co.kr 지금은 모던 웹 시대! HTML5 분야 부동의 1위 도서 HTML5 표준안 확정에 맞춘 완전 개정판의 귀환! HTML5 권고안과 최신 웹 브라우저 환경 대응 윤인성 저 | 624쪽 | 30,000원 모던 웹 디자인을 위한 HTML5 + CSS3 입문 자바스크립트에서 제이쿼리, 제이쿼리 모바일까지 한 권으로 끝낸다! 시대의 흐름에 맞춰 다시 쓴 자바스크립트 교과서 윤인성 저 | 980쪽 | 32,000원 페이스북, 월마트, 링크드인은 왜 Node.js를 선택했는가? 이 물음에 대한 답은 Node.js가 보여주는 빠른 처리 능력 때문이다. 윤인성 저 | 484쪽 | 25,000원 모던 웹을 위한 Node.js 프로그래밍 필요한 것만 배워 바로 현장에서 쓰는 HTML5 순서대로 읽으며 실습할 수 있는 HTML5 자습서 김상형 저 | 700쪽 | 32,000원 HTML5 + CSS3 정복
  • 4.
  • 5. 임베디드 안드로이드 :안드로이드 포팅, 확장, 커스터마이징하기 초판발행 2015년 4월 1일 지은이 카림 야크무르 / 옮긴이 이성주 / 펴낸이 김태헌 펴낸곳 한빛미디어 (주) / 주소 서울시 마포구 양화로 7길 83 한빛미디어(주) IT출판부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제10 – 1779호 / ISBN 978-89-6848-177-2 93000 총괄 배용석 / 책임편집 최현우 / 기획 이복연, 김상민 / 편집 백지선 디자인 표지 손경선, 내지 강은영, 조판 이경숙 영업 김형진, 김진불, 조유미 / 마케팅 박상용, 서은옥 / 제작 박성우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright © 2015 Hanbit Media Inc. Authorized Korean translation of the English edition of Embedded Android, ISBN 9781449308292 ⓒ 2013 Karim Yaghmour. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. 이 책의 저작권은 오라일리와 한빛미디어 (주)에 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 복제 및 무단 전재를 금합니다. 지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다. | 표지 설명 | 표지의 그림은 지중해 서쪽과 북아프리카, 북미, 아시아 지역에 서식하 는 무어 벽 도마뱀Moorish wall gecko, Tarentola mauritanica이다. 주로 발견되는 곳은 따뜻한 해안가 도심의 벽이며, 스페인의 경우 내륙에까지 퍼져 있 다. 플로리다 지역에서는 애완용으로도 많이 키우고 있다. 무어 벽 도마뱀은 야행성이지만 겨울 끝자락에는 낮에도 활동한다. 1년 에 두 번, 4월과 6월에 거의 완벽한 구 형태의 알을 두 개씩 낳는다. 알은 4개 월 후에 부화하며 새끼의 몸길이는 5cm가 채 되지 않는다. 성체가 되기까지는 대 략 4~5년 정도 걸린다. 성체는 꼬리를 포함하여 15cm까지 자라며 딴딴한 몸통과 납작한 머리, 부풀릴 수 있는 등 덕분에 가시 달린 갑옷과 같은 느낌을 준다. 색깔은 회갈색 혹은 회색 얼룩무늬의 갈색이다.
  • 6.
  • 7. 4 지은이·옮긴이 소개 지은이 카림 야크무르Karim Yaghmour 임베디드 안드로이드와 임베디드 리눅스 개발과 훈련 서비스를 제공하는 Opersys 사의 CEO 로, 그의 저서인 『임베디드 리눅스 시스템 구축하기』(김태석 옮김, 한빛미디어, 2004)는 여러 나라 언어로 번역되어 전 세계적으로 수만 부가 판매되었다. 리눅스계의 선구자인 카림은 1990년대 후반 리눅스 추적 툴킷LTT, Linux Trace Toolkit을 개발하고 2005년까지 관리하였다. LTT 개발에는 IBM, HP, 인텔 등의 개발자가 참여하였으며 구글, IBM, HP, 오라클, 알카텔, 노텔, 에릭슨, 퀄컴, 나사, 보잉, 에어버스, 소니, 삼성, NEC, 후지 쯔, SGI, 레드햇, 탈레스, 오리콘, 불Bull, 모토로라, ARM, ST마이크로 등 굴지의 기업에서 활 용하였다. 또한 relayfs와 Adeos 개발에도 이바지하였다. 카림은 다양한 콘퍼런스, 잡지, 온라인 저널에 단골로 등장한다. 유즈닉스Usenix, 리눅스 커널 서밋, 임베디드 리눅스 콘퍼런스, 안드로이드 빌더스 서밋, 안데브콘AnDevCon, 임베디드 시스템 콘퍼런스, 오타와Ottawa 리눅스 심포지엄, 리눅스 저널, 오라일리 네트워크, 리얼타임 리눅스 워 크숍 등에 발자취를 남겼다. 옮긴이 이성주 (주)벡터바이트 대표. 연세대학교에서 전기전자공학을 전공하고 같은 대학원에서 컴퓨터과 학 박사과정을 수학했다. 안드로이드 스마트폰이 처음 출시된 대학원 시절, 마침 임베디드 시 스템을 연구하던 중 안드로이드를 접하게 되었다. 『개발 프로세스 향상과 코드의 질을 높이는 Android Developer Tools 필수 가이드(기본편/심화편)』(한빛미디어, 2014)를 번역했다.
  • 8. 5 2010년 이후 3년 동안 안드로이드는 1990년대 마이크로소프트 윈도우가 해냈던 일을 다시 해 냈다. 단지 해낸 수준이 아니라 여러 측면에서 발전된 혹은 진화된 방식으로 세계의 지배적인 플랫폼이 되었다. 스마트폰은 단지 시작에 불과하다. 스마트 시계를 비롯하여 다양한 웨어러블 기기와 네트워크로 연결된 각종 기기, 즉 사물인터넷(IoT)은 이미 도래했거나 곧 공공연해질 것이다. 이러한 추세는 한 사람이 평균 한두 개의 스마트 기기를 소지하는 오늘날의 수준을 훌쩍 뛰어 넘을 것이며 기기의 유형과 개수는 기하급수적으로 증가할 것이다. 이러한 기기들의 양적 팽창 을 지탱해줄 플랫폼에는 많은 것이 요구되지만 그중 표준화, 확장성, 사용 가능성은 빼놓을 수 없는 중요한 특성이다. 안드로이드는 적어도 이 세 가지 사항을 모두 충족한다고 평가되며 스 마트 기기의 양적 팽창이 딛고 일어서는 발판이 될 것이다. 안드로이드는 그동안 (너무 많이) 분파되었던 리눅스 배포판들이 집약되는 구심점이 될 가능 성이 높아 보인다. 그러한 ‘단일화’는 임베디드부터 시작할 것으로 기대되는데 그럴 만한 여러 이유가 있다. 플랫폼의 가치는 앱, 좀 더 정확하게 말하면 앱 개발자의 질과 양이 결정한다. 그 런 측면에서 임베디드 시스템 개발사는 하드웨어별 맞춤형 앱을 개발하는 비용을 낮출 가능성 을 적극적으로 모색할 것이다. 하드웨어별 장치 드라이버를 상대하는 것만으로도 힘든데 그 장 치를 활용하는 API 설계 방식까지 표준화되어 있지 않다면 유지보수를 포함한 개발 비용을 낮 추기는 사실상 어렵다. 이런 이유로 임베디드 안드로이드는 반복적으로 선택되었고, 앞으로도 지속적으로 선택될 플랫폼이며, 이러한 선택이 반복될수록 플랫폼으로서의 가치는 더욱 높아 질 것이다. 20세기에 출발한 키보드와 마우스를 입력장치로 하는 윈도우 같은 운영체제보다는 처음부터 터치 기반의 입력장치를 염두에 두고 설계된 21세기형 운영체제인 안드로이드가 임베디드에 더 적합하다고 평가된다. 이에 임베디드 리눅스 시스템 분야의 권위자인 이 책의 저자 카림 야 크무르가 2년의 세월을 헌신하여 그 결과를 우리에게 제시하였다. 옮긴이의 말
  • 9. 6 이로써 임베디드 시스템 플랫폼 전략을 확립하기 위해 극복해야 할 기술적 난관을 상당 부분 줄일 수 있게 되었다. 임베디드 시스템 개발사라면 이 책의 기술적 내용을 근거로 프로젝트를 진행하는 것이 현재까지 제시된 방법 중 가장 합리적인 선택 중 하나라고 확신한다. - 이성주
  • 10. 7 “안드로이드 기반의 시스템을 만들어보려는 모든 이에게 반드시 필요한 안내서이다. 안드로이 드의 깊은 곳을 다루지만 구글 내부 개발자가 아니라면 이 책이 필요할 것이다.” 그렉 크로아-하트만, 리눅스 커널 핵심 개발자 “맞춤형 안드로이드 이미지, 기기, ROM 모드를 만들어야 하는 개발자라면 이 책이 필요하다! 안드로이드 동작 원리와 빌드 시스템을 비롯하여 안드로이드 전체가 어떻게 조합되어 있는지 를 전반적으로 이해하려면 소스코드를 제외하고 이 책이 유일한 참고서다. 특히 빌드 시스템 과 프레임워크를 설명한 4, 6, 7장에서 굉장한 도움을 받았다. 해당 장에서는 역엔지니어링하 기 어려운 AOSP 소스코드를 바탕으로 한 다양한 정보를 제공한다. 이 책 덕분에 개발자는 많 은 시간을 절약할 수 있을 것이다. 몇 년 전 우리 팀이 프로요 버전 안드로이드를 다룰 때 이 책 이 있었다면 좋았을 것이라고 생각했다. 다음 프로젝트인 인텔 레퍼런스 기기용 안드로이드 스 택 작업에 투입되는 새 인력에게는 필독서가 되리라 생각한다.” 마크 그로스, 인텔 안드로이드/리눅스 커널 아키텍트 “카림은 임베디드 시스템 개발자가 상대해야 하는 안드로이드의 여러 의문점을 체계적으로 공 략하였다. 이 책은 일반 소비자용 스마트폰과 태블릿뿐만 아니라 모든 유형의 기기에서 AOSP 를 구동할 때 필요한 실용적인 방법론을 제공한다. 개인적으로는 에뮬레이터뿐만 아니라 BeagleBone과 같이 합리적인 가격의 하드웨어를 사용하는 다양한 예가 많이 제시되어 기쁘다.” 제이슨 크리드너, 텍사스 인스트루먼트 Sitara 소프트웨어 아키텍처 매니저, BeagleBoard.org 공동창업자 “우리 개발자들이 수백 시간을 투자해서 알아내던 정보가 이 책 한 권에 담겨 있다. 안드로이드 작업에 새로 참여하는 우리 팀 인력이 반드시 숙지해야 할 필독서이다.” 마크 미씨리 박사, 카네기 멜런 대학교 우주ㆍ모바일 필드 로보틱스 연구자 추천의 글
  • 11. 8 ”안드로이드는 견고하고 뛰어난 성능의 리눅스 기반 제품을 만드는 데 필요한 모든 기능을 담 고 있는 수직적으로 통합된 공개 플랫폼이다. 이 책은 임베디드 시스템 개발자들이 안드로이드 에 처음으로 제대로 접근할 수 있도록 해주었다. 안드로이드의 혁신적인 실행 모델은 스마트폰 이나 태블릿에 국한되지 않으며 앱 개발자 플랫폼은 기능과 개발 속도 면에서 타의 추종을 불 허한다. 개발자들은 이 책에서 앱과 커널 사이의 모든 것, 그리고 확장과 수정을 통해 끝없이 다양한 안드로이드를 만드는 데 필요한 귀중한 정보를 얻을 수 있다.” 자크 페퍼, 리나로 안드로이드팀 기술 리더 “드디어 안드로이드 플랫폼을 시스템 관점에서 다룬 책이 나왔다! 앱 개발 관련 서적은 많지만, 안드로이드 내부에 관한 정보를 집약한 자료는 오랫동안 없었다. 카림은 안드로이드 시스템 프 로그래머와 시스템 통합 개발자에게 필수적이면서 유용하고 방대한 자료를 『임베디드 안드로 이드』에 수록했다(물론 앱 개발자에게도 도움이 되리라 생각한다). 카림은 안드로이드에 관한 전문성과 분석을 통해 축적된 다양한 예시, 참조, 설명을 제공하였다. 소니에서 안드로이드를 눈물겹게 배우던 시절, 만약 이 책이 있었으면 몇 개월은 절약할 수 있었을 것이다. 이 책은 앞 으로도 계속 안드로이드 시스템 개발자에게 주요 참고서가 되리라 믿어 의심치 않는다.” 팀 버드, 소니 네트워크 엔터테인먼트 시니어 스태프 엔지니어, 리눅스 재단 CE 워크그룹의 아키텍처 그룹 의장 “카림 야크무르의 책은 성장 중인 안드로이드 기반 임베디드 시스템 시장에 뛰어들고자 하는 사람들에게 탁월한 지침서다. 이 책은 커널 지원부터 라이선스와 상표권 관련 사항, 화면이 없 는 시스템에서 구동하는 방법 등 광범위한 정보를 제공한다. 임베디드 안드로이드 개발자라면 이 책은 반드시 소장해야 한다.” 폴 맥켄니, IBM 수석 엔지니어, 리눅스 커널 RCU 관리자
  • 12. 9 “안드로이드가 초기에는 스마트폰을 염두에 두고 설계되었지만 차츰 태블릿, 자동차, HMI와 같은 UI 패널, 웨어러블 기기를 비롯한 다양한 제품군까지 시장을 넓히고 있다. 이 책은 모바 일과 비모바일 제품에 안드로이드 기반 솔루션을 포팅하고 수정하는 데 필요한 핵심 원리와 개 념을 모두 다루고 있어 적극 추천한다.” 카심 사이드 모하메드, 텍사스 인스트루먼트 리드 엔지니어 “임베디드 안드로이드 개발자뿐만 아니라 안드로이드 앱 개발자에게도 표면 아래의 자바에 대 해 심도 있게 배울 수 있는 매우 훌륭한 자료다.” 라스 보겔, vogella GmbH CEO “다시 한 번, 카림이 제대로 짚었다. 안드로이드를 새 하드웨어에 포팅하거나 안드로이드가 어 떻게 동작하는지 궁금하다면 이 책을 읽어라. 이 책은 AOSP 소스 구하기부터, 빌드 환경을 설 정하고, 여러분의 하드웨어 지원을 소스에 추가하고, 그 하드웨어를 포함하는 새로운 안드로이 드를 빌드하여 배포하기까지의 모든 내용을 다룬다. HAL을 비롯한 안드로이드 프레임워크에 새로운 하드웨어 지원을 제공하기 위한 방법을 설명한다. 이 책은 안드로이드 관련 모든 서적 을 통틀어 안드로이드 기기 개발자에게 가장 좋은 지침서다. 이 책과 함께라면 몇 개월 치의 시 행착오를 피해갈 수 있을 것이다.” 마이크 앤더슨, PTR 그룹 최고 과학자 “어느새 『임베디드 안드로이드』는 우리 회사의 귀중한 자산이 되었다. 안드로이드를 새 하드웨 어에 포팅하거나 낮은 수준에서 새 기능을 통합할 때 반드시 필요하다. 카림은 훌륭한 교사이 며 이 책에 그의 스타일을 잘 반영하였다.” 짐 스틸, 센서 플랫폼즈 엔지니어링 부분 부사장
  • 13. 10 “『임베디드 안드로이드』는 안드로이드의 깊숙한 곳을 다루거나 새로운 하드웨어 플랫폼에 안드 로이드를 올리는 작업을 하는 사람이라면 반드시 읽어야 하는 책이다. 이 책은 방대한 AOSP 의 코드 베이스를 살펴보고 시스템의 전체 아키텍처를 이해하는 데 큰 도움을 준다.” 볼윈더 카울, 압티나 이미징 기술 부분 선임 멤버 “안드로이드 내부를 잘 안다고 생각하는가? 다시 한 번 생각해 보기 바란다! 장을 넘길 때마다 지금껏 몰랐던 사실들을 깨닫고, 왜 안드로이드가 또 하나의 임베디드 리눅스 배포판이 아닌지 알게 된다. 소용돌이 속으로 뛰어들 준비가 되었는가? 구글의 운영체제를 해킹하고자 하는 사 람들에게 『임베디드 안드로이드』는 한 마디로 ‘대박’이다.” 벤자민 조르, 알카텔 루슨트 안드로이드 플랫폼 아키텍트 “안드로이드 시스템 스택을 다루는 가장 가치 있고 완전한 자료다. 모든 안드로이드 시스템 엔 지니어의 필독서!” 맥심 리파드, 프리 일렉트론즈 안드로이드 리드 “얼마 전 리눅스가 올라간 개발 보드에 ‘안드로이드를 올려봐’라는 요청을 받았지만, 새로운 기 기에 안드로이드를 올리는 방법과 관련한 정보를 찾기 어려웠다. 다행히도 개발에 막 돌입한 시점에 마치 구세주처럼 『임베디드 안드로이드』가 출간되었다. 『임베디드 안드로이드』가 알려 준 부팅 절차부터 빌드 시스템에 이르기까지의 세부사항과 배경지식이 무척 마음에 든다. 덕분 에 안드로이드 전반과 안드로이드와 리눅스 커널의 상호작용을 훨씬 더 잘 알게 되었다.” 케이시 앤더슨, 트랜드릴 임베디드 시스템 아키텍트
  • 14. 11 들어가면서 안드로이드의 성장은 경이롭다. 매우 짧은 시간에 시장을 주도하는 데 성공했다. 오픈 소스 라 이선스, 공격적인 시장 진출, 첨단 인터페이스로 이뤄진 독특한 조합이 구글 안드로이드팀의 성과임이 분명하다. 말할 필요도 없이 휴대기기 제조사, 통신사, 칩셋 제조사, 앱 개발자들은 엄청난 사용자를 거느린 안드로이드를 중요하게 여긴다. 안드로이드용, 안드로이드 호환, 안드 로이드 기반 제품들이 전례 없이 빠르게 출시되고 있다. 그런데 스마트폰 시장에서 안드로이드의 성공은 의도하지 않은 또 다른 집단의 관심을 끌고 있는데 그 집단은 바로 임베디드 시스템 개발자들이다. 대다수의 임베디드 기기는 사용자 인 터페이스가 없었는데 이전에는 임베디드로 간주할 만한 기기의 상당수가 이제는 사용자 인터 페이스를 제공한다. 사용자용 기기를 제작하는 개발자는 순수하게 기술적인 기능뿐만 아니라 HCIHuman Computer Interaction 요소를 고려해야 한다. 따라서 디자이너는 사용자에게 이미 친숙한 경험을 제공하거나 또는 잘 알려지지 않았거나 아예 새로운 인터페이스를 학습하게 해야 하는 데, 후자는 거부감을 줄 위험이 있다. 안드로이드 이전에는 이러한 기기의 개발자들이 선택할 수 있는 사용자 인터페이스가 매우 제한적이었다. 물론 임베디드 개발자는 이미 친숙한 사용자 인터페이스를 제공하길 원한다. 과거에는 그러한 인터페이스가 윈도우 기반이었다. 그래서 많은 임베디드 기기가 전통적인 윈도우 중심으로 데 스크톱과 유사하거나 데스크톱 기반의 인터페이스를 제공했다. 애플의 iOS와 구글의 안드로이 드 이후에는 터치 기반의 아이폰 같은 그래픽 인터페이스가 지배적이며 앞으로도 계속 그럴 전 망이다. 이러한 사용자 패러다임의 변화와 기대는 안드로이드의 오픈 소스 라이선스와 결합하 여 임베디드 산업계가 지속해서 안드로이드에 관심을 두게 만드는 근거가 되었다. 안드로이드 앱 개발자와는 달리 안드로이드로 임베디드 기기에서 포팅 등과 같은 플랫폼 작 업을 하는 개발자는 곧 상당한 문제에 맞닥뜨린다. 안드로이드 플랫폼 작업 관련한 문서가 거 의 전무하기 때문이다. 구글은 앱 개발자를 위해 매우 방대한 온라인 문서를 제공하고 해당 주제의 책도 많은 데 반해, 임베디드 개발자용으로 구글이 제공하는 문서는 http://source. android.com에서 제공하는 최소한의 문서뿐이다.
  • 15. 12 이 책의 목적은 이러한 상황을 개선하고 어떤 장치에서든 임베디드 안드로이드를 사용할 수 있 도록 하는 것이다. 따라서 독자는 안드로이드의 아키텍처를 학습하고, 소스코드를 탐색하는 법, 다양한 컴포넌트들을 수정하는 법, 특정 기기를 위한 독자적인 버전을 생성하는 법을 배운 다. 더불어 안드로이드가 리눅스 커널에 어떻게 병합되었는지와 리눅스와의 공통점과 차이점 에 대해 배운다. 예를 들어 안드로이드가 리눅스 장치 모델Linux Device Model을 어떤 방식으로 사용 하여 독자적인 하드웨어 계층을 생성하고 glibc와 BusyBox와 같은 ‘레거시Legacy ’ 리눅스 컴포 넌트들을 채택해서 안드로이드로 패키징했는지를 논의한다. 그러한 과정 속에 개발에 도움이 되는 일상적인 다양한 기법을 학습하게 된다. 여기에는 안드로이드의 repo 도구 사용법과 안 드로이드 빌드 시스템과 병합하거나 수정하는 방법도 포함된다. 안드로이드 임베드하는 법 배우기 필자는 1990년대 중반부터 오픈 소스 소프트웨어에 관여해왔다. 지금처럼 강력한 영향력을 발 휘하기 전에 동참하게 된 것은 행운이며, 덕분에 2000년대 초반 오픈 소스의 급성장을 직접 목 격할 수 있었다. 또한 오픈 소스에 기여도 하고 여기저기서 벌어지는 격렬한 논쟁에도 흔쾌히 참여했다. 그 과정에서 오라일리를 통해 『임베디드 리눅스 시스템 구축하기』(김태석 옮김, 한 빛미디어, 2004)를 집필했다. 그래서 리눅스 기반인 안드로이드가 점차 유명해지기 시작할 때, 리눅스의 역사와 임베디드 리 눅스를 잘 알고 있는 나로서는 충분히 조사해볼만 하다고 생각했다. 처음에는 안일하게도 “내 가 이미 잘 알고 있는 리눅스에 기반한 플랫폼이니 안드로이드가 어려우면 얼마나 어렵겠어?” 라고 생각했다. 안드로이드 내부를 진지하게 살펴보기 전에는 이렇게 생각할 수 있었다. 그런 데 막상 겪어보니 안드로이드는 전혀 딴판이었다. 리눅스와 관련하여 내가 알고 있던 지식과 임베디드 시스템에서 공공연하게 사용되는 패키지 중 안드로이드에 그대로 적용되는 경우가 적었다. 뿐만 아니라 안드로이드가 사용하는 추상화는 더욱 낯설었다.
  • 16. 13 그리하여 이것을 알아내기 위한 매우 긴 여정을 시작하였다. 그리고 아직도 진행 중이다. 안드 로이드는 어떻게 동작하는가? 일반 리눅스와 어떻게 다른가? 어떻게 수정하는가? 임베디드 시 스템에서 어떻게 사용하는가? 어떻게 빌드하는가? 리눅스 사용자 공간에 대한 지식이 안드로 이드 앱 개발 API에 어떻게 적용되는가? 등의 물음에 대답하기 위해 노력해 왔다. 안드로이드 를 파면 팔수록 더 낯설고 질문이 늘어갔다. 첫 번째로 한 일은 http://developer.android.com과 http://source.android.com에서 가능한 모든 정보를 인쇄하고, 실제 개발자 API 참조 문서를 저장해 두었다. 문서는 20에서 25cm 두께 분량이 되었다. 그 대부분을 읽고, 중요한 부분에 밑줄을 긋고, 여백에는 많은 메 모를 달고, 답을 알 수 없는 수많은 질문을 목록으로 만들었다. 이와 동시에, 구글이 제공하는 안드로이드 오픈 소스 프로젝트AOSP, Android Open Source Project를 살펴보기 시작했다. 솔직히, AOSP 구조에 어느 정도 자신이 생기기까지 6개월에서 12개월이 걸렸다. 여러분이 지금 손에 쥔 책은 필자가 안드로이드를 살펴본 이후 해 온 작업을 집대성한 것이다. 여기에는 필자가 여러 개발팀이 그들의 임베디드 설계에 맞게 안드로이드를 수정하도록 도와 준 다양한 프로젝트들도 포함된다. 안드로이드와 관련해서 내가 하고 싶은 말은 이 책이 절대 안드로이드의 모든 것을 담을 수는 없다는 것이다. 안드로이드와 그 내부와 관련한 무수히 많 은 기술이 있고 이 책은 그 모든 것을 다루지도 않으며, 다룰 수도 없다. 그럼에도 이 책은 안드 로이드를 원하는 용도에 맞게 주조하는 노력을 시작할 수 있게 해줄 것이다. 대상 독자 이 책은 주로 안드로이드 기반 임베디드 시스템을 만드는 개발자나 안드로이드를 특정한 용도 에 맞게 변형하고자 하는 사람을 위해 쓰였다. 먼저 독자가 임베디드 시스템 개발을 어느 정도 는 알고, 최소한 리눅스가 어떻게 동작하며 명령행을 어떻게 사용하는지 잘 알고 있다는 가정 하에서 시작한다.
  • 17. 14 자바 관련 지식은 필요하지 않다. 자바를 몰라도 안드로이드를 수정하는 데 필요한 많은 작업 을 수행할 수 있다. 하지만 안드로이드 관련 작업이 진행될수록 자바의 필요성이 어느 정도까 지는 증가한다. 실제로 안드로이드 핵심 중 많은 부분이 자바로 작성되었고, 그렇기 때문에 여 러분의 작품을 안드로이드 스택에 제대로 병합하려면 자바를 알아야 한다. 하지만 이 책은 앱 개발이나 자바 프로그래밍과는 전혀 관련이 없다. 그 주제가 관심사라면 다 른 자료를 살펴보기 바란다. 이미 훌륭한 책들이 많아 나와 있다. 또한 이 책은 임베디드 시스 템과 관련한 책도 아니다. 마지막으로 이 책은 임베디드 리눅스 책이 아니며, 해당 주제 역시 다른 책에서 다루므로 찾아보기 바란다. 그래도 여전히 임베디드 시스템과 리눅스에 친숙하다 면 안드로이드를 이해하는 데 도움이 된다. 실제로 안드로이드는 기존의 ‘임베디드 리눅스’라 불리는 모든 것과 다르지만, 임베디드 리눅스 시스템을 생성할 때 주로 사용되는 많은 기법은 임베디드 안드로이드 시스템을 생성할 때도 훌륭한 지침과 도움이 될 수 있다. 이 책은 또한 안드로이드의 내부를 이해하는 데 도움이 될 것이다. 실제로 안드로이드를 임베 디드 시스템에서 사용하도록 수정하는 작업에는 내부 구조에 대한 기본적인 이해가 반드시 필 요하다. 안드로이드 소스코드를 샅샅이 살펴보지는 않지만, 안드로이드 스택의 다양한 부분들 이 상호작용하는 방식을 자세하게 드러낼 것이다. 책의 구성 다른 많은 책과 마찬가지로 이 책은 후반부로 갈수록 논의가 심오해진다. 앞쪽의 장은 이후 장 을 위한 배경 지식을 제공한다. 관리자라서 핵심 부분만 살펴보고 싶다거나 일부만 선택해서 읽고 싶더라도 최소한 앞의 세 장은 읽어보기 바란다. 그렇다고 나머지 부분이 서로 관련이 없 다는 것은 아니지만, 4장 이후로는 훨씬 독립적으로 구성되어 있다. 1장 ‘소개’는 안드로이드를 임베디드 시스템에서 사용할 때 알아야 하는 일반적인 지식을 다룬 다. 안드로이드는 어떻게 시작되었으며 개발 모델과 라이선스가 기존의 오픈 소스 프로젝트와
  • 18. 15 어떻게 다른지, 안드로이드 구동에 필요한 하드웨어 사양과 같은 내용이다. 2장 ‘안드로이드 내부 들여다보기’는 안드로이드 내부를 파헤치고 안드로이드를 구성하는 주요 추상화 개념을 보여준다. 앱 개발자에게 친숙한 앱 개발 모델을 소개하며 시작한다. 그런 다음 안드로이드만을 위해 가해진 커널 수정, 하드웨어 지원이 안드로이드에 추가된 방식, 안드로이 드 네이티브 사용자 공간, 달빅, 시스템 서버, 시스템 시작 전반을 살펴본다. 3장 ‘AOSP 시작하기’는 구글의 안드로이드 소스코드를 가져오는 방법을 설명하고, 에뮬레이터 이미지로 컴파일하고, 이 이미지를 구동해 셸로 접근하는 법을 설명한다. 에뮬레이터는 실제 하드웨어 없이도 안드로이드의 내부 원리를 살펴보는 손쉬운 수단이다. 4장 ‘빌드 시스템’은 안드로이드 빌드 시스템을 상세하게 설명한다. 실제로 다른 대부분의 오픈 소스 프로젝트와 달리 안드로이드 빌드 시스템은 비재귀적non-recursive이다. 4장은 안드로이드 빌드 시스템의 구조와 AOSP를 빌드하는 전형적인 방법, AOSP에 수정사항을 추가하는 방법 을 설명한다. 5장 ‘하드웨어 기초’는 안드로이드를 구동하도록 설계된 하드웨어들을 소개한다. 안드로이드가 주로 사용하는 시스템-온-칩SoC, System-on-Chip, 안드로이드 시스템의 전형적인 메모리 구조, 개 발 설정, 시제품용 임베디드 안드로이드 시스템을 위해 손쉽게 사용할 수 있는 평가용 보드들 에 대한 내용을 다룬다. 6장 ‘네이티브 사용자 공간’은 루트 파일시스템의 구조, adb 도구, 안드로이드 명령행, init 설 정을 다룬다. 7장 ‘안드로이드 프레임워크’에서는 안드로이드 프레임워크가 어떻게 시작되는지, 프레임워크 와 상호작용할 수 있는 유틸리티와 명령, 정상 동작에 필요한 지원 데몬을 논의한다. 부록 A ‘레거시 사용자 공간’은 레거시 임베디드 리눅스 스택을 안드로이드 사용자 공간과 공존 하도록 하는 방법을 논의한다.
  • 19. 16 부록 B ‘새 하드웨어 지원하기’에서는 안드로이드 스택에 새로운 하드웨어 지원을 추가하는 방 법을 설명한다. 새로운 시스템 서비스를 추가하는 방법과 안드로이드의 하드웨어 추상화 계층 HAL, Hardware Abstraction Layer을 확장하는 방법을 다루게 된다. 부록 C ‘기본 패키지 목록 변경하기’에서는 AOSP로 생성하는 이미지에 기본적으로 포함되는 컴포넌트들을 변경하는 데 도움이 되는 자료를 소개한다. 부록 D ‘기본 init.rc 파일들’은 2.3/진저브레드와 4.2/젤리빈에서 사용되는 기본 init.rc 파일에 대한 보충 설명을 담고 있다. 부록 E ‘참고자료’에서는 웹사이트, 메일링 리스트, 도서, 행사 등과 같은 유용할 참고자료를 정 리하였다. 안드로이드 버전 이 책을 골랐을 때 이미 눈치챘을 수도 있겠지만, 이 책에서 다루는 안드로이드 버전은 현재 최 신 버전보다 한참 뒤떨어져 있을 것이다. 개정판을 내더라도 이러한 상태는 계속될 것이다. 그 이유는 간단하다. 안드로이드는 6개월마다 한 번씩 릴리스된다. 이 책을 쓰는 데 거의 2년이 걸렸고, 과거의 경험으로 유추해보면 기존 서적을 최신 버전에 맞게 갱신하는 데에는 최소한 6개월에서 1년이 걸린다. 그러니 당장 읽기를 멈추고 책을 환불하거나, 옛날 버전을 다룰지라도 이 책을 최대한 활용하 는 법을 알고 싶다면 계속 읽어나가길 바란다. 릴리스 주기가 매우 빠르지만, 안드로이드 내부 구조와 빌드 공정은 5년 전 처음 등장했을 때 와 거의 비슷하다. 이 책도 처음에는 2.3/진저브레드를 기준으로 쓰기 시작했지만 4.2/젤리빈 에 맞게 내용을 갱신하는 작업은 상대적으로 손쉬운 편이었다. 이 과정에서 필요한 경우 4.0/ 아이스크림 샌드위치와 4.1/젤리빈 등 중간 버전에 대한 내용을 제공할 수도 있었다. 새로운 버전에는 새로운 요소가 추가되고, 같은 소프트웨어라도 기능이 더 풍성해지지만, 그 근간이
  • 20. 17 되는 내부 구조와 메커니즘은 상당한 시간이 흘러도 그대로 유지될 가능성이 높다. 따라서 필자가 안드로이드 개발 상황을 지켜보면서 이 책도 그에 맞춰 갱신하는데 인간적으로 최대한 노력하겠지만, 이 책에서 설명한 내용은 앞으로 나올 여러 버전에도 한동안은 계속해서 유용할 것이다. 실제로 어떤 사람들은 2.3/진저브레드가 최신 버전보다 훨씬 낮은 사양의 하드웨어에서 동작 하기 때문에 앞으로 상당한 기간 계속 사용될 것으로 생각한다. 일례로 2012년 12월에 열린 안데브콘AnDevCon IV 콘퍼런스에서 페이스북 소속의 키노트 연사는 자사의 앱은 2.3/진저브레드 기기를 아주 장기적으로 지원할 것이라고 했다. 최신 안드로이드보다 저렴한 기기에서도 동작 하기 때문이다. 예제 코드 활용하기 이 책은 독자의 개발 작업을 돕는 것을 목적으로 한다. 일반적으로 이 책의 코드를 여러분의 프 로그램과 문서에 사용할 수 있다. 코드 전체의 상당 부분을 복제하지 않는 이상은 필자에게 허 가를 구할 필요는 없다. 예를 들어 이 책에 나온 코드 일부를 사용하여 프로그램을 작성하는 경 우에는 허가를 받을 필요가 없다. 예제 코드를 CD에 담아서 판매하거나 배포하려면 허가가 필 요하다. 질문에 답하기 위해 이 책과 예제 코드를 인용할 때는 허가가 필요하지 않다. 여러분 제품의 문서에서 이 책의 예제 코드 상당 부분을 활용하려면 허가가 필요하다.
  • 21. 18 이 책은 10년 만에 낸 필자의 두 번째 책이다. 자기 자신을 분석하는 걸 좋아하진 않지만 필자 는 미지의 영역에 끌리는 경향이 있는 듯하다. 첫 책인 『임베디드 리눅스 시스템 구축하기』를 쓰리라 마음 먹은 2001년에는 임베디드 리눅스가 무엇인지를 전체적으로 설명하는 책이 없 었다. 1년 계획으로 시작했지만 2년이나 걸려서 원래 목표의 절반 정도를 써냈다. 마찬가지로 2011년에 임베디드 안드로이드를 쓰기로 했을 때에는 정보가 거의 없었다. 신기하게도 여러분 이 들고 있는 이 책 역시 끝내는 데까지 2년이나 걸렸다. 전반적으로 책을 집필한다는 것은 지리한 소모전처럼 느껴진다. 선택한 주제 때문이기도 할 것 이고, 혹은 필자가 부족하기 때문일 것이다. 야심 찬 주제에 관한 책을 혼자 감당하기에는 벅차 다. 실제로 이 책을 쓰기로 했을 당시에는 필요한 주제의 일부만 알고 있었다. 집필 과정에서 직접 조사한 것도 많지만 유능한 개발자들과 숱한 논의에서 더 많은 것을 배웠고, 그 결과 이 책이 탄생할 수 있었음을 강조하고 싶다. 따라서 콘퍼런스나 강의에서 필자에게 질문을 던진 적이 있거나 여러분이 안드로이드로 무슨 일을 하고 있는지 그리고 그 과정에서 맞닥뜨린 문제 를 필자에게 설명한 적이 있다면, 혹은 필자가 안드로이드에서 길을 잃고 헤매고 있을 때 올바 른 방향을 제시해준 적이 있다면 이 책에 여러분의 지혜가 녹아 있을 것이다. 이 책을 내준 출판사 역시 특별할 수밖에 없다. 첫 책 때 그랬던 것처럼 오라일리 출판사의 모든 분은 그냥 다 대단하다. 이 프로젝트와 내 집필 능력을 신뢰해준 마이크 헨드릭슨Mike Hendrickson에게 먼저 감사를 드린다. 편집자인 앤디 오람Andy Oram과 다시 한 번 일할 기회를 얻 은 것은 굉장한 특권이었다. 문장 하나하나를 철저하게 검증했고 종종 기술적인 사항들도 지 적해주었다. 앤디와 더불어 이 책을 계속해서 진행하도록 격려해준 레이첼 루멜리오티스Rachel Roumeliotis와 마리아 스탤론Maria Stallone에게도 감사드린다. 이런 종류의 책을 쓸 때는 기술적 정확성을 보장하는 데 가장 많은 신경을 써야 한다. 그렇기 때문에 유능한 기술 리뷰팀이 반드시 필요했다. 그런 점에서 이 프로젝트의 초기부터 검토를 수락해주고 긴 집필 과정 중 많은 의견을 준 매그너스 백Magnus Bäck, 마크 그로스Mark Gross, 아밋 펀디르Amit Pundir에게 먼저 감사드린다. 이 팀에는 계속해서 다른 유능한 사람들이 합류해줬다. 감사의 글
  • 22. 19 하드웨어 최고 전문가인 데이비드 앤더스David Anders는 하드웨어 관련 장에서 핵심적인 의견을 주었다. 로버트 PJ 데이Robert PJ Day는 안드로이드를 전혀 접해 보지 못한 독자들도 쉽게 이해할 수 있도록 집필하는 데 많은 도움을 주었다. 벤자민 조스Benjamin Zores는 스택 내부 구조의 여러 부분을 말끔하게 정리해주었다. 마지막으로 앤드류 밴 유터트Andrew Van Uitert와 맥심 리퍼드Maxime Ripard를 비롯한 이 책의 초기 버전의 독자들은 책을 읽으며 접한 여러 문제를 공유해주었다. 리나로Linaro의 안드로이드팀에도 특별한 감사를 드리며, 2.3/진저브레드 중심으로 쓰인 이 책 의 초기 버전에서 4.2/젤리빈과의 수많은 차이를 거의 혼자서 찾아준 버나드 로젠크랜저Bernhard Rosenkränzer에게 특별히 감사드린다. 원서 출간 시점에서 최신 버전인 4.2/젤리빈에 관한 책의 설 명이 만족스럽다면 그것은 버나드의 공이다. 필자가 이 책을 최신 버전에 맞게 갱신하도록 도 와주었을 뿐만 아니라 제공해준 의견도 매우 방대했고, 그중 상당수는 필자가 받은 의견 중 가 장 상세했다. 그러한 점에서 리나로의 팀이 책 집필을 도와주도록 허락해준 자크 페퍼Zach Pfeffer 에게도 감사드린다. 버나드를 비롯해 비셸 브호Vishal Bhoj, 파하드 쿠나다디Fahad Kunnathadi, 용퀸 리 우YongQin Liu가 기여해주었다. 앞서 언급했듯이 콘퍼런스에서 만난 분들도 집필에 많은 도움을 주었다. 그런 점에서 필자가 콘퍼런스에 참여하도록 해준 두 기관을 소개하고 싶다. 먼저, 2011년부터 안데브콘AnDevCon 콘 퍼런스를 주최해온 BZ 미디어팀에게 감사드린다. 초창기부터 필자에게 안드로이드의 내부 구 조를 주제로 한 강연을 할 수 있도록 신뢰해주었고 계속해서 초청해주었다. 그중 앨런 자이칙 Alan Zeichick, 테드 바르Ted Bahr, 스테이시 버리Stacy Burris, 케이티 세리니스Katie Serignese에게 특별히 감 사드린다. 또한, 키노트 연사로 불러주고, 안드로이드 빌더 서밋Android Builders Summit, 임베디드 리 눅스 콘퍼런스Embedded Linux Conference, 임베디드 리눅스 콘퍼런스 유럽Embedded Linux Conference Europe과 같은 여러 행사에 참여할 수 있도록 해준 리눅스 제단Linux Foundation에도 감사드린다. 그중에서도 마이크 보스터Mike Woster, 아만다 맥퍼슨Amanda McPherson, 안젤라 브라운Angela Brown, 크레이그 로스 Craig Ross, 마레사 파울러Maresa Fowler, 루돌프 스트레이프Rudolf Streif, 도미니크 듀발Dominic Duval, 이브 라힘 하다드Ibrahim Haddad, 제리 쿠퍼스테인Jerry Cooperstein에게 특별히 감사드린다.
  • 23. 20 레볼루션리눅스RevolutionLinux팀도 빼놓을 수 없다. 특히 초창기부터 ‘실험용 쥐’가 되는 것을 흔쾌 히 동의해준 베노이트 리그너리스Benoit des Ligneris, 브루노 램버트Bruno Lambert, 패트릭 터코트Patrick Turcotte에게 특별히 감사드린다. 이분들의 노력이 이렇게 결실을 보았다. 마지막으로, 필자가 그동안 상대해온 것 중 가장 골치 아팠던 작품을 만들어준 구글의 안드로 이드팀에게 진심으로 특별한 감사 인사를 전한다. 이 운영체제를 살펴보는 작업은 한동안 내 가 해왔던 것 중 가장 재미있는 일이었다. 엄청난 소프트웨어를 만들고 매우 관대한 라이선스 로 제공한 구글 개발팀 전체에 찬사를 보낸다. 안드로이드는 기존의 오픈 소스 프로젝트와 달 리 (타당한 이유로) 개발 과정의 투명성에 중점을 두지 않았음을 이해하기에 다양한 방법으로 필자를 도와주었거나 도와주려 노력했던 안드로이드 개발자들에게도 감사드린다. LWN과 관 련한 의문점을 채워준 브라이언 스웨트랜드Brian Swetland와 쳇 하스Chet Haase에게도 감사드린다. 필자에게는 가장 가까운 사람들, 긴 과정 동안 사랑과 인내로 지켜봐준 소니아Sonia, 아나 이스Anaïs, 토마스Thomas, 빈센트Vincent 모두 너무 감사하다. Les mains invisibles qui ont écrit les espaces entre les lignes sont les leurs et je leur en suis profondémment reconnaissant(행간을 채운 보이지 않는 손인 그대들에게 진심으로 감사인사를 전한다).
  • 24. 21 CONTENTS 지은이· 옮긴이 소개 ........................................................................................................... 4 옮긴이의 말 ........................................................................................................................ 5 추천의 글 ........................................................................................................................... 7 들어가면서 ....................................................................................................................... 11 감사의 글 ......................................................................................................................... 18 CHAPTER 1 소개 1.1 역사 ......................................................................................................................... 29 1.2 기능과 특징 ............................................................................................................... 31 1.3 개발 모델 .................................................................................................................. 34 1.3.1 기존 오픈 소스 프로젝트와의 차이점 ..................................................................... 34 1.3.2 추가 기능, 로드맵, 새 버전 ................................................................................... 36 1.4 생태계 ...................................................................................................................... 37 1.4.1 오픈 핸드셋 얼라이언스 ...................................................................................... 38 1.5 안드로이드 소스코드 구하기 ......................................................................................... 38 1.6 법률 고려사항 ............................................................................................................ 40 1.6.1 코드 라이선스 ................................................................................................... 40 1.6.2 브랜드 사용 ...................................................................................................... 43 1.6.3 구글이 제공하는 안드로이드 앱 ............................................................................ 45 1.6.4 다른 앱 마켓들 .................................................................................................. 45 1.6.5 오라클 대 구글 .................................................................................................. 45 1.6.6 모바일 특허 전쟁 ............................................................................................... 46 1.7 하드웨어와 호환성 요구사항 ......................................................................................... 47 1.7.1 호환성 정의 문서 ............................................................................................... 48 1.7.2 호환성 테스트 스위트 ......................................................................................... 52 1.8 개발 설정과 도구 ........................................................................................................ 53
  • 25. 22 CHAPTER 2 안드로이드 내부 들여다보기 2.1 앱 개발자 관점 ........................................................................................................... 55 2.1.1 안드로이드 개요 ................................................................................................ 56 2.1.2 프레임워크 소개 ................................................................................................ 61 2.1.3 앱 개발 도구 ..................................................................................................... 62 2.1.4 네이티브 개발 ................................................................................................... 63 2.2 전체적인 구조 ............................................................................................................ 64 2.3 리눅스 커널 ............................................................................................................... 66 2.3.1 웨이크락 .......................................................................................................... 67 2.3.2 로우-메모리 킬러 .............................................................................................. 69 2.3.3 바인더 ............................................................................................................. 71 2.3.4 안드로이드 공유 메모리 ...................................................................................... 72 2.3.5 알람 ................................................................................................................ 73 2.3.6 로거 ................................................................................................................ 74 2.3.7 안드로이드에서 주목할 만한 다른 특징들 ............................................................... 77 2.4 하드웨어 지원 ............................................................................................................ 78 2.4.1 리눅스의 방식 ................................................................................................... 79 2.4.2 일반적인 안드로이드 방식 ................................................................................... 79 2.4.3 로딩 및 연동 방법 .............................................................................................. 81 2.4.4 기기 지원 ........................................................................................................ 84 2.5 네이티브 사용자 공간 .................................................................................................. 85 2.5.1 파일시스템 구조 ................................................................................................ 86 2.5.2 라이브러리 ....................................................................................................... 87 2.5.3 Init ................................................................................................................. 91 2.5.4 Toolbox .......................................................................................................... 93 2.5.5 데몬 ................................................................................................................ 94 2.5.6 명령행 유틸리티 ................................................................................................ 95 CONTENTS
  • 26. 23 2.6 달빅과 안드로이드 자바 ............................................................................................... 95 2.6.1 자바 네이티브 인터페이스 ................................................................................... 98 2.7 시스템 서비스 ............................................................................................................ 98 2.7.1 서비스 매니저와 바인더 연동 ............................................................................. 104 2.7.2 서비스 호출하기 .............................................................................................. 105 2.7.3 서비스 사례: 액티비티 매니저 ............................................................................ 106 2.8 AOSP 기본 패키지 ................................................................................................... 106 2.9 시스템 시동 ............................................................................................................. 109 CHAPTER 3 AOSP 시작하기 3.1 개발 호스트 설정 ...................................................................................................... 115 3.2 AOSP 받기 ............................................................................................................. 116 3.3 AOSP 내부 ............................................................................................................. 123 3.4 빌드 기본 ................................................................................................................ 128 3.4.1 빌드 시스템 설정 ............................................................................................. 129 3.4.2 안드로이드 빌드하기 ........................................................................................ 132 3.5 안드로이드 구동하기 ................................................................................................. 138 3.6 ADB 사용하기 ......................................................................................................... 140 3.7 에뮬레이터 통달하기 ................................................................................................. 145 CHAPTER 4 빌드 시스템 4.1 다른 빌드 시스템과의 차이점 ...................................................................................... 152 4.2 아키텍처 ................................................................................................................. 154 4.2.1 설정 .............................................................................................................. 155 4.2.2 envsetup.sh ................................................................................................. 159
  • 27. 24 4.2.3 함수 정의 ....................................................................................................... 166 4.2.4 주요 Make ................................................................................................... 167 4.2.5 빌드 청소 ....................................................................................................... 170 4.2.6 모듈 빌드 템플릿 ............................................................................................. 171 4.2.7 결과물 ........................................................................................................... 176 4.3 빌드 방법 ................................................................................................................ 177 4.3.1 기본 droid 빌드 .............................................................................................. 178 4.3.2 빌드 명령 살펴보기 .......................................................................................... 178 4.3.3 리눅스와 맥 OS에서 SDK 빌드하기 ................................................................... 179 4.3.4 윈도우에서 SDK 빌드하기 ................................................................................ 180 4.3.5 CTS 빌드하기 ................................................................................................ 181 4.3.6 NDK 빌드하기 ............................................................................................... 182 4.3.7 API 갱신하기 ................................................................................................. 184 4.3.8 개별 모듈 빌드하기 .......................................................................................... 185 4.3.9 트리 바깥에서 빌드하기 .................................................................................... 186 4.3.10 트리 안에서 재귀적으로 빌드하기 ..................................................................... 188 4.4 AOSP 해킹 기본 ...................................................................................................... 190 4.4.1 기기 추가하기 ................................................................................................. 190 4.4.2 앱 추가하기 .................................................................................................... 196 4.4.3 앱 오버레이 추가하기 ....................................................................................... 197 4.4.4 네이티브 도구와 데몬 추가하기 .......................................................................... 198 4.4.5 네이티브 라이브러리 추가하기 ........................................................................... 199 CHAPTER 5 하드웨어 기초 5.1 일반적인 시스템 아키텍처 .......................................................................................... 203 5.1.1 베이스밴드 프로세서 ........................................................................................ 205 5.1.2 핵심 구성요소 ................................................................................................. 206 CONTENTS
  • 28. 25 5.1.3 실제 세상과 상호작용하기 ................................................................................. 207 5.1.4 연결성 ........................................................................................................... 208 5.1.5 확장, 개발, 디버깅 ............................................................................................ 208 5.2 시스템-온-칩은 무엇인가? ......................................................................................... 210 5.3 메모리 레이아웃과 매핑 ............................................................................................. 214 5.4 개발 설정 ................................................................................................................ 218 5.5 평가용 보드 ............................................................................................................. 220 CHAPTER 6 네이티브 사용자 공간 6.1 파일시스템 .............................................................................................................. 225 6.1.1 루트 디렉터리 ................................................................................................. 229 6.1.2 /system ....................................................................................................... 230 6.1.3 /data ............................................................................................................ 232 6.1.4 SD카드 ......................................................................................................... 235 6.1.5 빌드 시스템과 파일시스템 ................................................................................. 236 6.2 adb ....................................................................................................................... 243 6.2.1 동작 원리 ....................................................................................................... 243 6.2.2 주요 플래그, 인자, 환경 변수 .............................................................................. 245 6.2.3 기본 로컬 명령 ................................................................................................ 246 6.2.4 기기 연결과 상태 ............................................................................................. 248 6.2.5 기본 원격 명령 ................................................................................................ 250 6.2.6 파일시스템 명령 .............................................................................................. 257 6.2.7 상태 변경 명령 ................................................................................................ 260 6.2.8 PPP 터널링 ................................................................................................... 264 6.3 안드로이드 명령행 .................................................................................................... 265 6.3.1 2.3/진저브레드까지의 셸 .................................................................................. 266
  • 29. 26 6.3.2 4.0/아이스크림 샌드위치 이후의 셸 .................................................................... 268 6.3.3 Toolbox ........................................................................................................ 268 6.3.4 핵심 네이티브 유틸리티와 데몬 .......................................................................... 280 6.3.5 추가적인 네이티브 유틸리티와 데몬 .................................................................... 288 6.3.6 프레임워크 유틸리티와 데몬 .............................................................................. 290 6.4 Init ......................................................................................................................... 290 6.4.1 동작 원리 ....................................................................................................... 290 6.4.2 설정 파일 ....................................................................................................... 292 6.4.3 전역 속성 ....................................................................................................... 301 6.4.4 ueventd ....................................................................................................... 307 6.4.5 부트 로고 ....................................................................................................... 310 CHAPTER 7 안드로이드 프레임워크 7.1 프레임워크 시작하기 ................................................................................................. 314 7.1.1 핵심 모듈 ....................................................................................................... 315 7.1.2 시스템 서비스 ................................................................................................. 319 7.1.3 부트 애니메이션 .............................................................................................. 323 7.1.4 Dex 최적화 .................................................................................................... 326 7.1.5 앱 스타트업 .................................................................................................... 328 7.2 유틸리티와 명령어 .................................................................................................... 333 7.2.1 범용 유틸리티 ................................................................................................. 333 7.2.2 서비스 유틸리티 .............................................................................................. 346 7.2.3 달빅 유틸리티 ................................................................................................. 365 7.3 지원 데몬 ................................................................................................................ 370 7.3.1 installd ........................................................................................................ 372 7.3.2 vold ............................................................................................................. 373 CONTENTS
  • 30. 27 7.3.3 netd ............................................................................................................ 375 7.3.4 rild .............................................................................................................. 377 7.3.5 keystore ...................................................................................................... 378 7.3.6 기타 지원 데몬 ................................................................................................ 379 7.4 하드웨어 추상화 계층 ................................................................................................ 380 appendix A 레거시 사용자 공간 ................................................................................... 383 appendix B 새 하드웨어 지원하기 ................................................................................ 401 appendix C 기본 패키지 목록 변경하기.......................................................................... 417 appendix D 기본 init.rc 파일들 ................................................................................... 421 appendix E 참고자료 ................................................................................................. 449 찾아보기 ........................................................................................................................ 456
  • 31.
  • 32. 291장 - 소개 소개 임베디드 기기에 안드로이드를 올리는 작업은 안드로이드 내부를 상세히 이해하고 AOSPAndroid Open Source Project에 기반하여 리눅스 커널을 적절히 수정해야 하는 복잡한 작업이다. 안드로이드 임베디드 작업을 시작하기 전에 먼저 안드로이드의 하드웨어 요구사항과 임베디드 시 고려해 야 하는 안드로이드 관련 법적 사항과 같은 필수 배경 지식을 살펴볼 필요가 있다. 그 첫 번째 로 안드로이드가 어떻게 시작되고 개발되었는지 살펴보자. 1.1 역사 안드로이드의 시작은 2002년 초까지 거슬러 올라간다.* 구글의 래리 페이지Larry Page와 세르게 이 브린Sergre Brin은 스탠퍼드 대학교에서 개최한 당시 신예였던 데인저Danger 사의 사이드킥Sidekick 전화기 개발 관련 세미나에 참석했다. 발표를 진행한 데인저 사의 CEO 앤디 루빈Andy Rubin은 사이드킥이 최초의 인터넷 기반 다기능 기기 중 하나라고 했다. 발표가 끝난 후 래리는 기기를 살펴보았는데 구글이 기본 검색엔진으로 설정된 것을 보고 기뻐했다. 그리고 얼마 지나지 않아 래리와 세르게이는 사이드킥을 사용하기 시작했다. *  저자주_ 2007년 11월 안드로이드 초기 버전이 발표되자 뉴욕타임즈는 “I, Robot: The Man Behind the Google Phone(아이로봇, 구글 폰을 이끈 사람)”이라는 기사를 실었다(http://nyti.ms/148x7bH). 이 기사에는 앤디 루빈이라는 인물과 그의 경력, 그리고 안드로이 드에 대한 통찰력 있는 이야기가 담겨 있다. 이번 절의 일부 역시 이 기사에 기반하였다. CHAPTER 1
  • 33. 30 임베디드 안드로이드 사이드킥은 참신하고 사용자들도 열광했지만 상업적인 면에서는 성공하지 못했다. 2003년 이 되면서 루빈은 데인저 사의 이사회와 본인의 동의로 CEO 자리에서 물러난다. 그리고 다 른 몇 가지 사업을 시도해본 후 다시 전화기 OS 사업에 돌아오기로 결심한다. 자신이 보유한 android.com 도메인을 사용하여 전화기 제조사를 대상으로 한 공개 OS를 만드는 프로젝트 에 개인 자산 대부분을 투자하고 종잣돈을 투자받은 후 본격적인 투자를 유치하기로 한다. 그 리고 얼마 지나지 않은 2005년 8월 구글은 안드로이드 사를 인수하게 된다. 안드로이드를 인수한 후 2007년 11월 OS를 최초 공개하기 전까지 구글은 안드로이드 관련 정 보를 거의 공개하지 않았다. 대신 개발팀은 OS의 시제품 제작에 열중했다. 최초 공개는 오픈 핸드셋 얼라이언스OHA, Open Handset Alliance를 통해 이루어졌다. OHA는 모바일 기기를 위한 표준 개발을 목표로 여러 회사가 참여한 그룹으로 안드로이드가 그 첫 번째 제품이었다. 1년이 지난 2008년 9월 최초의 오픈 소스 버전 안드로이드 1.0이 공개되었다. 그 이후로 여러 안드로이드 버전이 공개되었고 개발은 더 공개적으로 이루어졌다. 뒤에서 자세 히 살펴보겠지만 안드로이드의 작업 대부분은 계속해서 비공개로 진행되고 있다. [표 1-1]은 안드로이드 버전과 각 AOSP에 해당하는 버전별 특징을 보여준다. 표 1-1 안드로이드 버전* 버전 출시일 코드명 주요 기능 소스 공개 1.0 2008년 9월 비공개 공개 1.1 2009년 2월 비공개* 공개 1.5 2009년 4월 컵케익 온-스크린 소프트 키보드 공개 1.6 2009년 9월 도넛 배터리 사용량과 VPN 지원 공개 2.0, 2.0.1, 2.1 2009년 10월 이클레어 익스체인지 지원 공개 2.2 2010년 5월 프로요 JIT 컴파일 공개 2.3 2010년 12월 진저브레드 SIP와 NFC 지원 공개 3.0 2011년 1월 허니콤 태블릿 폼팩터 지원 비공개 3.1 2011년 5월 허니콤 USB 호스트 지원과 API 비공개 4.0 2011년 11월 아이스크림 샌드위치 폰과 태블릿 폼팩터 통합 지원 공개 4.1 2012년 6월 젤리빈 성능 개선 공개 *  저자주_ 프티 푸르(Petit Four)였다는 설이 있다. 관련 이야기는 구글 플러스에 올라온 글인 http://bit.ly/1BjUIQy에서 찾을 수 있다.
  • 34. 311장 - 소개 4.2 2012년 11월 젤리빈 다중 사용자 지원 공개 4.3 2013년 7월 젤리빈 블루투스 LE, SELinux, OpenGL ES 3.0 지원 공개 4.4 2013년 10월 킷캣 메모리 관리 개선, 구글 나우 개선, 클라우드 프린팅 지원 공개 5.0 2014년 10월 롤리팝 ART 가상 머신 지원, 64비트 CPU 지원 공개 5.1 2015년 3월 롤리팝 안정화, 멀티 심카드 지원 공개 1.2 기능과 특징 2.3/진저브레드 출시 즈음에 구글은 개발자 웹사이트에서 다음 기능을 홍보했다. 앱 프레임워크 안드로이드 앱을 개발할 때 개발자들은 앱 프레임워크를 사용한다. 프레임워크 사용법은 온라인 문서(http://developer.android.com)와 오라일리O’Reilly 출판사의 『Learning Android』 등에 소개되었다. 달빅 가상 머신 오라클의 자바 가상 머신JVM, Java virtual machine을 대신하는 안드로이드의 독자적인 바이트 코드 해석기byte-code interpreter이다. 자바 가상 머신의 .class 파일에 해당하는 것이 달빅Dalvik에서는 .dex 파일이다. .dex 파일은 자바 컴파일러가 생성한 .class 파일을 다시 dx 유틸리티를 사용하여 변환한 것이다. 내장 웹브라우저 안드로이드는 웹킷WebKit 기반 웹브라우저를 기본으로 제공한다. 앱 개발자는 WebView 클 래스를 사용하여 앱 안에서 웹킷 엔진을 사용할 수 있다.
  • 35. 32 임베디드 안드로이드 그래픽 최적화 안드로이드는 독자적인 2D 그래픽 라이브러리를 제공하지만 3D 기능은 OpenGL ES에 의존한다.* SQLite 표준 SQLite 데이터베이스로(http://www.sqlite.org) 개발자가 앱 프레임워크에서 사용 할 수 있다. 미디어 지원 안드로이드는 독자적인 미디어 프레임워크인 스테이지 프라이트StageFright로 다양한 미디어 형식을 지원한다. 2.2 버전 이전에는 패킷비디오PacketVideo의 오픈코어OpenCore 프레임워크를 사용했다. GSM 전화 지원** 전화 기능은 기기마다 다르다. 제조사는 HALHadrware Abstraction Layer 모듈을 제공해야 안드로이 드가 하드웨어와 연동될 수 있다. HAL 모듈은 뒤에서 다루도록 하겠다. 블루투스, 엣지, 3G, WiFi 안드로이드는 대부분의 무선 기술을 지원한다. 엣지Edge와 3G는 안드로이드에 특화된 형태 로 구현되었지만, 블루투스와 WiFi의 경우는 일반 리눅스와 동일하게 제공된다. 카메라, GPS, 나침반, 가속센서 사용자의 실제 환경과 연동하는 것은 안드로이드에서 매우 중요하다. 앱 프레임워크는 이들 기기에 접근할 수 있는 API를 제공하며, 그 일부는 HAL 모듈이 있어야 활성화된다. 풍부한 개발 환경 안드로이드의 가장 큰 장점이다. 개발 환경은 안드로이드 개발을 손쉽게 시작할 수 있게 해 *  저자주_ OpenGL ES는 OpenGL 표준의 임베디드 시스템용 버전이다. **  저자주_ 안드로이드는 물론 GSM 기술 외에도 많은 것을 지원하지만 공식적으로 이 이름으로 통칭하여 부른다.
  • 36. 331장 - 소개 준다. 전체 SDKSoftware Development Kit에는 에뮬레이터, 이클립스 플러그인, 디버깅 및 프로파 일링 도구들이 포함되며 무료로 내려받을 수 있다. USB 지원, 멀티태스킹, 멀티 터치, SIP, 테더링, 음성 명령 등 안드로이드의 기능은 상당히 많 지만, 이 목록만으로도 안드로이드에 어떤 기능이 있는지 감을 잡기에는 충분하다. 안드로이드 버전이 갱신될 때마다 새로운 기능이 추가되므로 각 버전에 추가된 기능과 향상된 점은 공식 웹사이트에서 확인하기 바란다. 이상의 기본 기능 외에도 안드로이드 플랫폼은 다음 몇 가지 특성들로 임베디드 개발에 무엇보 다 적합할 수 있다. 간단히 살펴보도록 하자. 풍부한 앱 생태계 구글 플레이Google Play에는 약 130만 개의 앱이 등록되어 있다. 등록된 앱의 개수는 애플 앱스 토어Apple App Store에 등록된 120만 개를 넘어서며 임베디드 기기에 앱을 탑재하는 경우 다양 한 앱 중에서 선택할 수 있다. 임베디드 기기에 탑재하려면 앱 배포사와 사전 협의가 있어야 한다는 점을 명심하자. 구글 플레이에 등록되었다고 해서 앱 배포사가 아닌 제3자가 임베디 드 기기에 임의로 탑재할 수 있다는 의미가 아니라는 것이다. 앱 API 일관성 안드로이드 앱 프레임워크의 모든 API는 상위 호환성forward compatible을 염두에 두고 있다. 따 라서 임베디드 기기에 탑재하는 앱은 안드로이드 향후 버전에서도 계속해서 동작한다. 반 면, 안드로이드 소스코드를 수정한 경우는 바로 다음 버전에서도 동작한다고 보장할 수는 없다. 교체 가능 모듈 안드로이드는 오픈 소스이고 구조 특성상 많은 모듈을 교체할 수 있다. 예를 들어 기본 런 처Launcher 앱(홈 화면)이 마음에 들지 않으면 새로 만들 수 있고 구조적인 변경도 가능하다. GStreamer* 개발자들은 안드로이드의 기본 미디어 프레임워크인 스테이지 프라이트를 앱 API를 수정하지 않고도 GStreamer로 교체할 수 있었다고 한다. *  저자주_ GStreamer는 Gnome, KDE, XFCE 등 대부분의 데스크톱 리눅스의 기본 미디어 프레임워크다.
  • 37. 34 임베디드 안드로이드 확장성 소스코드 공개와 안드로이드의 구조적인 특성이 안겨주는 또 하나의 장점은 새로운 기능과 하드웨어 지원이 상대적으로 수월하다는 것이다. 같은 종류의 하드웨어나 기능이라면 플랫 폼의 동작을 그대로 따라하기만 하면 된다. 예를 들어 HAL에 새로운 하드웨어 지원을 추가 하려면 파일 몇 개만 추가하면 된다(부록 B). 사용자화 기본 런처 앱과 같은 모듈을 그대로 사용할 때도 원하는 대로 변경할 수 있다. 동작을 수정 하거나 모양과 느낌을 변경하기 위해 자유롭게 AOSP를 수정할 수 있다. 1.3 개발 모델 임베디드 플랫폼으로 안드로이드를 고려한다면 소스코드를 수정하거나 내부 구조에 종속된 코 드를 작성할 시에 안드로이드 개발 프로세스가 여기에 영향을 줄 수 있음을 인지해야 한다. 1.3.1 기존 오픈 소스 프로젝트와의 차이점 안드로이드의 가장 큰 특징 중 하나는 오픈 소스라는 점이다. 실제로 오픈 소스로 개발 시 누릴 수 있는 소프트웨어 엔지니어링의 많은 이점이 안드로이드에 적용된다. 단, 라이선스는 오픈 소스지만 안드로이드는 대부분의 다른 오픈 소스와 달리 개발은 비공개로 진행된다. 오픈 소스는 주로 공개 메일링 리스트와 포럼에서 프로젝트 개발자들의 논의를 볼 수 있고 공개된 소스 저장소에서 개발 코드를 받아볼 수 있다. 안드로이드는 이런 것이 없다. 앤디 루빈은 “오픈 소스는 커뮤니티 기반 프로젝트와 다르다. 안드로이드는 커뮤니티 기반에는 큰 비중을 두지 않지만 오픈 소스라는 점은 매우 비중 있게 다룬다”라며 안드로이드가 따르는 오픈 소스 방식의 특징을 설명한 바 있다. 좋든 싫든 안드로이드는 구글의 개발팀이 주로 개발하고, 일반 개발자는 내부 논의에 참여하
  • 38. 351장 - 소개 거나 개발 중인 코드를 볼 수 없다. 대신 구글은 새 버전의 안드로이드가 새 기기에 탑재되어 출시될 때마다 완성된 코드를 공개한다. 이 코드 공개는 대략 6개월 주기로 이루어진다. 일 례로 2010년 12월 삼성 넥서스 S 출시 며칠 후, 새로운 2.3/진저브레드 소스코드가 http:// android.googlesource.com에 공개되었다. 일부 오픈 소스 커뮤니티는 표준화된 개발 방법론과 모순되는 개발 방식의 안드로이드가 계속 ‘오픈 소스’라고 불리는 것에 불편해한다. 안드로이드의 인지도를 고려하면 더욱 그렇다. 이제 껏 안드로이드와 유사한 방식으로 개발된 프로젝트들이 오픈 소스 커뮤니티를 존중하는 경우 는 드물었다. 이런 개발 모델에서는 구글의 사업 목표가 바뀌면 큰 타격을 받을 수밖에 없다는 점을 우려하는 사람들도 있다. 정치적인 사안들을 제쳐두고 논하자면 안드로이드 개발 모델에서는 개발자로서 안드로이드에 이바지하기는 어렵다. 구글 안드로이드 개발팀이 아닌 이상 코드 개발에 참여할 수는 없다. 일 부 극히 예외적인 경우를 제외하면 핵심 개발팀과 일대일로 개선사항을 논의할 수도 없다. 하 지만 여전히 AOSP 코드에 대한 개선이나 오류 수정을 http://android.googlesource.com 에 제출할 수는 있다. 구글 방식에서는 안드로이드 개발팀이 플랫폼에 대해 어떤 결정을 내리고 있는지 알 수 없다는 점이 가장 큰 단점이다. AOSP에 새 기능이 추가되는 경우나 핵심 모듈이 수정되면 다음에 공 개된 버전 소스코드를 분석하지 않는 이상 무엇이 바뀌었는지, 그로 인해 영향을 받을 만한 변 경은 무엇인지 알 수 없다. 게다가 수정되거나 추가된 기능이 어떤 요구사항과 제약사항으로 인해 만들어진 것인지도 알 수 없다. 안드로이드가 진정한 의미의 오픈 소스였다면 이런 사항 들을 공개된 메일링 리스트에서 살펴볼 수 있었을 것이다. 그럼에도 구글은 안드로이드를 오픈 소스 라이선스로 제공함으로써 이미 많은 기여를 하고 있 다. 오픈 소스 커뮤니티 관점에서는 개발 모델이 좀 어색하지만, 많은 개발자들에게는 구글이 개발하는 안드로이드는 그야말로 하늘에서 떨어진 것이나 다름없다. 게다가 엄청나게 성공적 인 리눅스 배포판을 만들어냈다는 점에서 안드로이드는 이제껏 어떤 오픈 소스 프로젝트도 성 공하지 못한 것을 이루어낸 셈이다. 이런 점들을 고려한다면 안드로이드 개발팀이 잘못하고 있 다고 말하기는 어려울 것 같다. 또한 커뮤니티 기반의 프로세스는 개발 중인 기능이 모두 공개되기 때문에 새로운 버전을 출시
  • 39. 36 임베디드 안드로이드 할 때 기삿거리를 만들기 어려워진다. 사업과 홍보 관점에서 볼 때 이런 프로세스의 도입은 당 연하다. 커뮤니티 기반 프로세스에서는 특정한 기능을 구현하기 위한 최고의 방법에 대한 합의 점을 찾는 데만 몇 년씩 걸리는 경우도 허다하다. 뒤돌아보면 안드로이드의 성공 요인 중 하나 는 구글이 새로운 기능들을 신속하게 개발해내면서 기삿거리를 만들어낼 수 있었기 때문이기도 하다. 1.3.2 추가 기능, 로드맵, 새 버전 결론적으로 미래에 공개될 안드로이드의 기능이나 성능과 관련한 로드맵은 공개된 바 없다. 구 글은 다음 버전의 이름과 대략적인 출시일 정도를 공개할 뿐이다. 보통 매년 5월에 열리는 구 글 I/O와 연말 즈음에 새 안드로이드가 나올 것이라고 기대할 수는 있다. 하지만 어떤 기능이 포함될지는 아무도 모른다. 구글은 다음 안드로이드 버전을 함께 작업할 제조사를 보통 한 곳만 선택한다. 그리고 선택한 회사의 엔지니어들과 긴밀히 협력하여 안드로이드의 최신 버전을 대표 기기에 탑재한다. 이 기 간에만 제조사의 엔지니어들은 개발 중인 소스코드에 접근할 수 있다고 한다. 기기가 출시되면 소스코드도 공개되며 신 버전 출시가 마무리된다. 다음 버전에서는 또 다른 제조사를 선택하여 이 과정을 반복한다. 안드로이드 3.x/허니콤을 개발할 때 이런 개발 과정에 예외가 한 번 있었다. 이때만 특수하게 도 구글은 레퍼런스 기기인 모토로라 줌Motorola Xoom 쪽에 소스코드를 공개하지 않았다. 안드로 이드 개발팀이 태블릿용 안드로이드를 시장의 요구에 맞추어 최대한 빨리 만들어내느라 안드 로이드의 코드베이스에서 파생된 코드를 만들어냈기 때문이라고 추정될 뿐이다. 따라서 허니 콤에서는 스마트폰과의 호환성은 최소한으로 고려되었다. 구글은 플랫폼 파편화를 우려하여 코드를 공개하지 않은 것으로 보인다. 그 대신 다음 버전이었던 안드로이드 4.0/아이스크림 샌 드위치에서는 스마트폰과 태블릿을 모두 지원하도록 합쳐졌다.
  • 40. 371장 - 소개 1.4 생태계 2013년 1월 기준으로 ●● 매일 130만 대의 안드로이드 기기가 개통되고 있다. 2011년 6월 40만 대와 2010년 8월 20만 대와 비교 해볼 때 증가한 수치다. ●● 구글 플레이에는 대략 70만 개의 앱이 등록되었다. 애플의 앱스토어에 등록된 앱의 개수도 비슷하다.* ●● 전 세계 스마트폰 중 72%가 안드로이드 기반이다. 안드로이드는 명백하게 고속성장 중이다. 가트너는 2016년이면 윈도우마저 제칠 것으로 예측 했다. 10년 전쯤 임베디드 시장을 강타한 리눅스 이후 안드로이드가 다시금 뚜렷한 족적을 남 길 태세다. 기존의 강자들을 시장에서 도태시켜 나가면서 모바일 시장의 판세를 뒤집을 뿐만 아니라 임베디드 기기의 표준 UI로 자리 잡을 확률이 높다. 사용자와 직접 상호작용하지 않는 기기에서마저 기존의 임베디드 리눅스를 교체할 움직임까지 보인다. 전체 생태계가 안드로이드를 중심으로 급속하게 형성되고 있다. ARM, TI, 퀄컴Qualcomm, 프리 스케일Freescale, 엔비디아Nvidia와 같은 반도체 및 시스템-온-칩 제조사들은 제품 차원에서 안드 로이드를 지원하고, 모토로라, 삼성, HTC, 소니, LG, Archos, 델, ASUS와 같은 소비자 제품 제조사들은 안드로이드가 탑재된 제품 출시를 지속해서 확대하고 있다. 이런 생태계에는 아마 존, 버라이즌Verizon, 스프린트Sprint, 반스앤노블Barnes Noble과 같이 독자적인 앱 마켓을 만들고 있 는 주체들도 포함된다. 안드로이드 기반의 비공개 커뮤니티와 프로젝트도 여기저기에서 생겨나고 있다. 이런 커뮤니 티와 프로젝트들은 여느 오픈 소스 프로젝트처럼 메일링 리스트와 포럼을 통해 이루어진다. 이 들은 공식 안드로이드 소스코드에 독자적인 기능과 개선을 추가하여 분파된 소스코드를 생성 한다. 일례로 사이애노젠모드CyanogenMod 프로젝트는 고급 사용자용 시스템 이미지를 제공한다. 안드로이드를 개량하여 독자적인 플랫폼을 갖추려는 회사도 많다. 예를 들어 여러 ARM SoC 제조사로 구성된 비영리 단체인 리나로는 플랫폼에 최적화된 안드로이드 소스코드 트리를 제 공한다. 제조사가 제공한 바이너리를 해킹해서 독자적인 수정을 적용하거나 변형 버전을 만드 는 해커들도 있다. AOSP에서 분파된 프로젝트와 개발 커뮤니티 전체 목록은 부록 E에서 살펴 볼 수 있다. *  저자주_ 집필 시점에는 이미 애플 앱스토어의 개수를 훨씬 능가했다.
  • 41. 38 임베디드 안드로이드 1.4.1 오픈 핸드셋 얼라이언스 앞서 언급했듯이 초창기에는 오픈 핸드셋 얼라이언스가 주체가 되어 안드로이드를 공개했다. 웹사이트에는 다음과 같이 소개되어 있다. 82개의 기술 및 모바일 회사가 한데 모여 모바일 혁신을 가속하고 소비자들에게 풍부하고 저 렴하면서도 더 나은 모바일 경험을 제공하고자 한다. 우리는 최초로 완전한 형태의 무료 공개 모바일 플랫폼인 안드로이드를 함께 협력하여 개발한다. 하지만 최초 공개 이후 OHA의 역할은 불분명하다. 예를 들어 구글 I/O 2010의 ‘안드로이드 팀과 나누는 담소(Fireside Chat with the Android Team)’ 행사에서 한 참가자가 OHA 참여사에 소속된 자신에게 개발자로서 얻게 되는 혜택이 무엇인지를 물었다. 패널들의 이야기 를 듣고 내린 결론은 안드로이드 개발팀은 OHA가 아니라서 모른다는 것이다. 이를 미루어 볼 때 안드로이드 개발팀에게 OHA는 딱히 특별한 의미는 없는 것 같다. OHA는 이사회나 상주 직원이 없어서 더욱 그 역할이 불분명하다. 단지 ‘연합’일 뿐이다. 게다 가 구글이 안드로이드를 공개할 때 OHA에 대해 별다른 언급도 없고, OHA도 새 안드로이드 출시에 대해 별다른 입장을 표명하지 않는다. 종합해보면 구글은 산업계가 안드로이드를 지지 한다는 것을 홍보하기 위해 OHA를 만들었을 뿐, 실제로는 안드로이드 개발에는 거의 관여하 지 않는다고 할 수 있다. 1.5 안드로이드 소스코드 구하기 안드로이드를 임베디드 시스템용으로 사용하려면 안드로이드 호환 리눅스 커널과 안드로이드 자체, 이렇게 두 가지가 필요하다. 상당 기간 안드로이드 호환 리눅스 커널을 구하기가 쉽지 않았다. 집필 시점에서도 어떤 경우 에는 여전히 어려웠다. http://kernel.org에서 ‘바닐라’ 커널(메인라인 커널)을 사용하는 대 신 AOSP의 커널을 사용하거나 바닐라 커널을 안드로이드에 호환되도록 변경해야 한다. 안드 로이드 개발팀에서 안드로이드 구동을 위해 메인라인 커널에 가한 여러 변경이 문제가 될 수
  • 42. 391장 - 소개 있기 때문이다. 추가로 도입된 기능들을 메인라인 커널에 반영하는 것은 지금까지는 상당한 저 항을 불러왔다. 2장에서 커널 이슈를 자세하게 다루겠지만, 2011년 프라하에서 열린 리눅스 커널 서밋Linux Kernel Summit에서 커널 개발자들이 안드로이드 플랫폼 구동에 필요한 기능들을 공식 리눅스 버 전에 적극 추가하기로 했다. 그래서 안드로이드 필수 기능 중 상당수가 현재까지 메인라인 커 널에 합쳐졌고, 일부는 다른 메커니즘으로 교체 혹은 대체되었거나 진행 중이다. 현재로서는 SoC 제조사에 안드로이드용 커널을 요청하는 것이 가장 효과적인 방법이다. 안드로이드의 대 중성 덕분에 대부분의 주요 SoC 제조사는 안드로이드를 적극 지원한다. 안드로이드 플랫폼은 ‘안드로이드’라고 불리는 사용자 공간user space을 포함한 리눅스 배포판이 다. 릴리스 목록인 [표 1-1]은 플랫폼 출시 목록과 다름없다. 플랫폼의 요소와 구조는 2장에서 논하기로 하고, 지금은 플랫폼 출시는 우분투나 페도라 같은 리눅스 배포판의 출시에 해당한다 고 생각하면 된다. 플랫폼은 독자적 완결성을 갖는 소프트웨어 패키지들의 묶음으로 특정한 도 구, 인터페이스, 개발자 API를 통해 특정한 형태의 사용자 경험을 제공한다. 안드로이드 호환 커널에서 동작하는 안드로이드 배포판의 소스코드를 일컫는 정확한 명칭은 ‘안드 로이드 플랫폼’이다. 이를 보통은 AOSP라고 부르며 이 책에서도 AOSP로 지칭하겠다. 프로젝트 웹사이트 (http://android.google.source.com)에서 제공하는 AOSP에는 플랫폼 이외의 정보도 포함되어 있다. 견본 리눅스 커널 트리나 추가적인 패키지들인데, repo 명령으로 얻어올 때에는 보통 포함되지 않으니 궁금 하면 확인해보는 것도 좋을 것이다. 바이너리 해킹 안드로이드 소스를 구하기 어렵다는 사실도 열정적인 해커들이 안드로이드를 해킹하고 변경하 는 것을 막지는 못했다. 실제로 Android 3.x/허니콤의 소스코드는 구할 수는 없었지만 그래도 해커들은 반스앤노블의 누크Nook에 허니콤을 올렸다. 허니콤 SDK에 포함된 에뮬레이터 이미지 의 실행 파일들을 누크 위에서 구동하는 데 성공한 것이다. 물론 이 때문에 하드웨어 가속은 포 기해야 했다. 이런 종류의 해킹은 제조사가 소스코드를 제공하지 않는 기기를 루팅하거나 일부 구성요소 버전을 갱신하는 데 활용되고 있다.
  • 43. 40 임베디드 안드로이드 1.6 법률 고려사항 다른 소프트웨어들과 마찬가지로 안드로이드를 사용하거나 배포하려면 라이선스, 지적재산권 관련 규약, 시장원리를 지켜야 한다. 이 중 몇 가지를 살펴보자. 필자가 법률 전문가는 아니므로 이 책에서 논의하는 내용을 법률 조언으로 받아들여서는 안 된다. 특정한 사용에 대해 적용될 수 있는 법적 사항과 라이선스에 관련해서는 전문적인 법률 자문을 구하길 바란 다. 법률 전문가는 아니지만 다음의 내용은 오픈 소스 쪽에 오래 몸담았던 엔지니어의 개인적인 소양으로 보 아도 좋을 것이다. 1.6.1 코드 라이선스 앞서 논의했듯이 안드로이드는 안드로이드 호환 리눅스 커널과 AOSP 두 부분으로 이루어 져 있다. AOSP를 구동하기 위해 변경되었지만 안드로이드 호환 리눅스 커널은 여전히 GNU GPL v2 라이선스로 제공된다. 그렇기 때문에 리눅스 커널 변경 사항은 GPL 외의 다른 라이선 스로 제공할 수 없다. http://android.googlesource.com 또는 SoC 제조사에서 커널을 구 해서 시스템에 맞게 개량한 경우, GPL 라이선스를 따르는 조건으로만 커널 이미지를 제품에서 제공할 수 있다. 이는 이미지를 만드는 데 사용한 소스와 수정사항들이 GPL 라이선스에 따라 모두 공개되어야 함을 의미한다. 리누스 토르발스Linus Benedict Torvalds는 커널 소스의 COPYING 파일에 GPL 라이선스는 커널에 만 적용됨을 명시하였다. 커널 위에서 작동하는 운영 프로그램들은 그 라이선스의 대상이 아니 며 커널에서 파생된 것으로 간주하지 않는다. 따라서 리눅스 커널 위에서 작동하는 응용 프로 그램은 독자적인 라이선스로 배포할 수 있다. 이와 같은 법 규정과 적용은 오픈 소스 커뮤니티와 리눅스 커널을 지원하거나 사용하는 회사 대부분은 잘 이해하고 받아들이고 있다. 커널과 함께 리눅스 기반 배포판의 핵심 요소들 상당 수는 보통 GPL 계열의 라이선스를 활용한다. GNU C 라이브러리(glibc), GNU 컴파일러 (GCC)는 각각 LGPL과 GPL이다. 임베디드 리눅스 시스템에서 두루 사용되는 중요 패키지인 uClibc와 BusyBox 역시 LGPL과 GPL을 따른다. 그렇다고 모두가 GNU GPL을 반기지는 않는다. 실제로 규모가 큰 조직에서는 파생 작업에 적
  • 44. 411장 - 소개 용되는 제약사항들이 문제가 될 수 있다. 조직이 여러 지역에 걸쳐 있고 하부 조직마다 문화가 다를 수 있으며 협력 업체까지 관여하게 되면 더욱 그렇다. 예를 들어 북미의 경우 수십에서 수 백 개의 공급업체와 계약을 맺는 제조사도 있다. 각 공급업체가 납품하는 코드에는 GPL 코드 도 포함될 수 있다. 하지만 고객은 결국 제조사의 이름을 보고 구매하기 때문에 제조사는 공급 업체와 상관없이 GPL에 적용받는 경우 소스코드를 제공해야 한다. 더불어 GPL 기반 프로젝 트에 참여하는 엔지니어들이 라이선스를 준수할 수 있는 프로세스도 도입해야 한다. 구글이 제조사들과 ‘공개’ 모바일 OS를 만들고자 했을 때 가장 먼저 GPL은 될 수 있으면 적용 하지 않도록 신경 써야 했다. 사실 리눅스가 아닌 다른 커널들이 고려되었지만, 리눅스가 이미 업계에 굳건히 자리를 잡았고 특히 ARM 기반 칩 제조사들은 리눅스를 더 많이 활용하는 상태 였다. 하지만 다행히도 커널은 시스템의 다른 부분과 달리 독립적이었기 때문에 GPL을 적용받 는다고 해도 전체에 큰 영향을 주지는 않았다.* 그렇지만 사용자 공간에 위치하는 모듈에는 GPL 문제가 적용되면 곤란하기 때문에 다른 라 이선스가 적용되도록 노력이 필요했다. 그래서 다른 임베디드 리눅스 시스템 대부분에 탑재되 는 glibc, uClibc, BusyBox와 같은 GPL 또는 LGPL 모듈들은 AOSP에 포함되지 않았다. 대신 구글은 AOSP에 필요한 상당수의 구성요소를 직접 제작하여 아파치 라이선스 2.0Apache License 2.0 (줄여서 ASL)을 적용했으며, glibc와 uClibc를 대체하는 바이오닉Bionic 라이브러리와 BusyBox를 대체하는 툴박스Toolbox 유틸리티와 같은 일부 핵심 요소에는 BSD 라이선스를 적 용했다. 몇몇 기존의 오픈 소스 프로젝트들은 원래의 라이선스를 그대로 적용하여 있는 그대로 의 AOSP를 external/ 디렉터리에서 연동되도록 하였다. 이는 AOSP에는 ASL도 BSD도 아 닌 요소 역시 포함됨을 의미한다. AOSP는 여전히 GPL과 LGPL이 적용되는 요소들을 포함 한다. 하지만 이런 요소를 포함하여 배포하더라도 OEM에서 이를 수정하는 경우는 거의 없고 (즉, 파생 작업이 생기지 않는다) 해당 모듈의 소스코드는 http://android.googlesource. com에서 이미 제공하고 있다. 즉 이것으로 파생 작업의 재배포에 대한 GPL 규정은 만족하기 때문에 문제될 만한 사항은 아니다. GPL과 달리 ASL은 파생 작업에 특정한 라이선스를 적용하지 않는다. 수정사항에 어떤 라이 선스를 적용해도 상관없다. 다음은 이와 관련하여 ASL에서 발췌한 내용이다(라이선스 전문은 *  저자주_ 이러한 결정의 뒷 이야기가 궁금하다면 안드로이드 커널 개발팀의 브라이언 스웨트랜드(Brian Swetland)가 LWN에 남긴 글을 읽어보기 바란다. http://lwn.net/Articles/446371
  • 45. 42 임베디드 안드로이드 아파치 소프트웨어 재단http://www.apache.org/licenses에서 찾아볼 수 있다). ●● 이 라이선스의 규정과 조건에 따라 라이선스의 대상이 되는 사용자에게 재현, 파생 작업, 공공 전시 및 실시, 라 이선스 임대, 작업물 및 파생 작업물을 원래 형태(Source) 또는 목적물 형태(Object)로 배포할 수 있는 영 구적이며 전 세계에서 적용되는 비(非)배타적, 무료, 무(無)로열티, 번복 불가능한 저작권을 허여한다. ●● 라이선스 사용자는 수정된 사항에 독자적인 저작권 조항을 적용할 수 있으며 수정사항의 사용, 재현, 수정된 작업물 및 파생 작업물에 대해 추가 또는 다른 라이선스 규정과 조건을 지정할 수 있으며 작업물의 사용, 재현, 배포에 대해 별다른 명시가 없는 경우는 현재 라이선스의 조건을 따른다. 더 나아가 ASL은 특허 실시권을 명시적으로 허용하기 때문에 ASL이 적용된 안드로이드 코드 를 사용할 시에는 구글의 특허 라이선스가 필요하지 않다. 이 라이선스는 몇 가지 행정적인 요 구사항을 포함하는데, 예를 들어 수정된 파일이 읽기 쉬운 형태로 정리되어야 하고, 수신자 역 시 ASL 라이선스를 한 부 받아야 하며, NOTICE 파일들이 있는 그대로 제공되어야 한다. 정 리하면 ASL은 필요에 따라 수정된 사항을 어떤 형태의 라이선스로든 제공할 수 있다는 것이다. Bionic과 Toolbox에 적용되는 BSD 라이선스는 비슷한 형태로 바이너리 배포만을 허용한다. 따라서 ASL의 다른 규정들을 준수하는 한 제조사들은 AOSP를 변경하더라도 원치 않는다면 변경 내용을 공개하지 않고 소유할 수 있다. GPL이었다면 외부의 요구에 대비하여 모든 변경 을 상세하게 추적하는 프로세스를 도입해야 하는 부담이 없어진다는 점에서 큰 이점이 있다. GPL 라이선스 요소 추가하기 안드로이드의 사용자 공간에서 GPL은 되도록 쓰지 않는 것이 좋지만 때에 따라서는 GPL이 적 용된 구성요소를 사용하고 싶을 수도 있다. 예를 들어 기존의 리눅스 응용 프로그램을 안드로이 드의 바이오닉에 맞게 이식하기보다는 POSIX 호환 C 라이브러리인 glibc나 uClibc를 사용하 고 싶을 수 있다. 또는 기능이 적은 Toolbox만으로는 부족하므로 BusyBox도 함께 사용하고 자 할 때도 있을 것이다. 이런 추가 사항들은 개발 과정에서 필요하지만, 최종 제품에서는 제거될 수도 있고 맞춤형으로 제작된 안드로이드에 필수요소가 될 수도 있다. 일반적인 안드로이드나 GPL 패키지를 포함하는 경우 라이선스의 요구사항을 모두 준수해야 한다는 점을 명심하자.
  • 46. 431장 - 소개 1.6.2 브랜드 사용 구글은 안드로이드 소스코드를 무척 관대하게 제공하지만, 안드로이드 관련 브랜드는 좀 더 엄 격하게 다룬다. 브랜드와 관련된 사항 몇 가지와 사용 약관을 살펴보자. 공식 목록과 공식 약관 은 http://bit.ly/Zu5HCV에서 확인할 수 있다. 안드로이드 로봇 안드로이드와 관련된 곳에서는 어디에나 등장하는 친숙한 녹색 로봇이다. 이 로봇의 역할 은 리눅스의 펭귄과 비슷하고, 마찬가지로 사용 행태에도 거의 규제가 없다. 구글은 로봇이 “홍보용 사용뿐 아니라 복제와 수정도 임의로 할 수 있다”고 규정한다. 유일한 요구사항은 Creative Commons Attribution 라이선스의 규정을 따라야 한다는 것뿐이다. 안드로이드 로고 이 로고는 독자적인 글씨체를 적용한 A-N-D-R-O-I-D라는 문자 집합을 의미하며, 기 기 및 에뮬레이터의 부팅 시와 안드로이드 웹사이트(http://android.com)에 사용된다. 다른 경우에는 이 로고를 사용할 수 없다. 7장에서 부팅할 때 표시되는 로고를 수정하는 방 법을 다룰 것이다. 안드로이드 글씨체 안드로이드 로고에 사용되는 독자적인 글씨체로 로고에 적용되는 제약사항들이 그대로 적 용된다. 정식 제품명과 설명에서의 ‘Android’ 구글이 명시하듯이 ‘Android’를 앱이나 보조 제품의 이름으로 사용할 수 없다. 대신 ‘for Android(안드로이드용)’라고 표시하여 사용할 수 있다. 즉 Android MediaPlayer는 안 되지만 MediaPlayer for Android는 괜찮다. 구글은 Android는 일반적으로 받아들여 지는 광범위한 의미로 사용될 때는 설명에 포함할 수 있다고 한다. 예를 들어 ‘Android™ 앱’인 경우가 그렇다. 물론 상표권 표시는 항상 포함해야 한다. 요약하면 구글의 허락 없 이는 제품 이름을 ‘Android Foo’와 같은 형태로 지을 수 없다는 것이다. 물론 ‘Foo for Android’는 가능하다.
  • 47. 44 임베디드 안드로이드 ‘Android’ 브랜드 기기 안드로이드 호환성 프로그램ACP, Android Compatibility Program의 FAQ에 따르면 기기 제조사가 제품 이름에 ‘Android’를 넣고자 할 때는 호환됨을 먼저 확인받아야 한다. 기기 이름을 ‘Android’라고 짓는 것은 구글의 독자적인 권한이다. 즉 기기는 일단 안드로이드와 호환되 어야 하고 ‘Foo Android’와 같은 이름으로 기기를 홍보하려면 먼저 구글과 일종의 협약을 맺어야 한다는 것이다. 안드로이드 호환성 프로그램과 관련해서는 이 장의 뒷부분에서 다시 다루도록 할 것이다. ‘Droid’를 공식 명칭에 사용하는 경우 ‘Foo Droid’와 같이 ‘Droid’를 사용할 수 없다. 무슨 연유인지는 아직도 이해할 수는 없지 만 ‘Droid’ 상표권은 영화 스타워즈 제작사인 루카스필름이 소유하고 있다. 이 단어를 사 용하고 싶다면 먼저 제다이가 되어라. Play라는 단어와 브랜드 구글이 Android 브랜드는 매우 엄격하게 통제하지만 AOSP의 대부분에 적용되는 ASL에는 다음과 같이 명시하고 있다. ‘본 라이선스는 라이선스를 부여자의 상표권, 상표권이 적용된 표 식, 서비스 표식, 제품명을 합리적이고 관습적인 범위 내에서 원 작업물을 설명하는 경우와 NOTICE 파일의 내용을 재현하는 경우를 제외하고는 실시를 허용하지 않는다.’ 여기서는 상표권을 사용할 수 없음을 명시하고 있지만 ‘합리적이고 관습적인 범위 내에서 원 작 업물을 설명하는 경우’라는 예외 덕분에 우리의 기기가 ‘AOSP 기반’임을 표시할 수 있다고 해 석하는 것이 일반적이다. 더 나아가 어떤 이들은 ‘Android 기반’ 기기라고 명시하기도 한다. ‘Android’라는 단어는 언급하지 않는 대신 안드로이드 로봇을 내세워 광고하는 경우도 있다. 이제껏 본 것 중 가장 교묘한 경우는 기기의 기능 목록 중 하나로 ‘안드로이드 앱 구동’이라고 표 시한 것이다. 안드로이드 앱을 구동할 수 있다면 어떤 형태로든 AOSP가 사용됐다는 것에 내 손 목과 가진 돈 모두라도 걸 수 있다.