Google Android Introduction AESOP/ 고도리 2011 년 07 월 16 일 1
Index 안드로이드개요 안드로이드특징 안드로이드구성요소및구조 안드로이드개발방법 2
1.1 Android 개요 3
안드로이드소개 Google 에서개발한스마트폰용오픈소스플랫폼 2011.07 월현재관련플랫폼버전 Phone 용 : 23Gi 2.3 Gingerbread Tablet 용 : 3.x Honeycomb Google TV 2011.09 월에발표될 Icecream Sandwitch 버전에서는위의세플랫폼통합예정 USB host API 추가 Android Open Accessory Development Kit 2.3.x 버전에도존재하나사용용도는 Icecream Sandwitch version서부터라고생각됨 플랫폼을다루기위하여여러가지프로그래밍언어로구성 Application: JAVA Native Framework: C/C++ Kernel: C 4
안드로이드소개 모바일소프트웨어개발을위한공개개발환경 OS, 미들웨어, 어플리케이션이완전히분리된구조 Open Handset Alliance (OHA) 프로젝트 리눅스운영체제기반 Linux kernel v2.6.25 2625 이후버전지원 ( 현재 gingerbread 는 v2.6.35.7) 26357) 자바기반의손쉽고빠른개발환경지원 Emulator 환경지원 Mac, Windows, Linux Apache 2 라이선스기반 License 부분에서다시설명 5
안드로이드소개 통신사입장 iphone 의독점적권위에위기의식느낌 경쟁플랫폼도입의필요성 스마트폰서비스플랫폼의부재 단말제조사입장 iphone 의독주및폐쇄적인정책에따른경쟁플랫폼부재 기존의 Feature Phone 플랫폼을너무오래유지한덕에변화에대한필요성을느끼지못했음 Apple 사의단말플랫폼외에서비스플랫폼경쟁력의부재 (ex> 앱스토어 ) 위와같은이유로현재가장경쟁력있는 Android 플랫폼을대부분통신사와제조사가선택 6
안드로이드소개 통신사위주의시장에서제조사와사용자위주의모바일시장으로변화기회 구글의입장 검색시장의점유율증대 서비스강화및광고수익증대 구글의정책의목적은무엇일까? iphone 의성공요소를그대로따라함 서비스시장의장악 Icecream Sandwitch에서추가되는특징을봤을경우 Game console 시장으로의진출과 Smart TV 로의진화 7
1.2 Android 특징 8
안드로이드의특징 다른스마트폰플랫폼과다른특징 오픈소스소프트웨어 지속적인소스에대한변화가이루어짐 구글이라는광고 / 검색시장 1 위라는기업이만들었다는점 Application Framework Application 의재사용과대체가가능함 Dalvik VirtualMachine 모바일디바이스에최적화됨. 통합브라우저 오픈소스 Webkit 엔진기반. 그래픽최적화 2D/3D(OpenGL ES 1.0 사양 - Android 2.0서부터는 OpenGL2.0 지원 ) Hardware 가속기능지원 9
안드로이드의특징 SQLite 데이터저장을위한데이터베이스엔진제공 미디어지원 다양한오디오, 비디오및이미지포맷지원 (MPEG4, H.264, MP3, JPG, PNG, GIF 등 ) 기존의 Phone 에적용된 format 만지원, PC 에서사용하는 format 들은지원하지못함 (ex> AVI/WMV 등 ) 하드웨어의존적인기술들 GSM 텔레포니기술, Bluetooth, EDGE, 3G, and WiFi, Camera, GPS, e-compass 와 accelerometer 유용한개발환경을지원 디버깅을위한 Eclipse IDE 기반의디바이스애뮬레이터를지원 메모리및성능프로파일링기능지원 Eclipse IDE에기반한 x86 기반의크로스개발환경지원 10
오픈소스라이센스 안드로이드는오픈소스이므로관련 Open source license 정책에영향을받음. GPL GPL로작성된소스를기반으로작성하여상용화했을경우반드시소스공개 version 2 v2 로작성된코드와결합되었을경우모든소스가 version 2 가됨 version 3 v2 의문제점인기존의라이센스코드와 GPL 코드가결합불가했던부분을수정 LGPL(Lesser GPL) Library GPL 관련소스를수정했을때는공개, 동적로딩라이브러리로배포시이라이브러리를사용한소스는공개하지않아도됨 11
오픈소스라이센스 BSD, Apache license 진정한공개라이센스 소스의사용에제약이없음 ( 상용화시공개의무없음 ) Apache license 는 BSD 라이센스에법적인명시조항만추가작업한라이센스 MPL(Mozilla Public License) 전체소스코드내에서 MPL 라이센스를따르는파일에한정하여소스공개요구 상용화에유리 12
안드로이드라이센스 Linux Kernel 은 GPL 라이선스를사용 Android 는대부분 Apache v2 라이선스를사용 GPL 과 Apache Apache license 아파치웹서버를포함한아파치재단 (ASF: Apache Software Foundation) 의모든소프트웨어에적용 BSD 라이센스와비슷하여소스코드공개등의의무가발생하지않음. 다만 'Apache' 라는이름에대한상표권을침해하지않아야한다는조항이명시적으로들어가있음. 특허권에관한내용이포함되어 BSD 라이센스보다는좀더법적으로정리된것이특징. 특히 Apache License 2.0에서특허에관한조항이삽입되어 GPL 2.0으로배포되는코드와결합되는것이어려웠으나, GPL 3.0( 안 ) 에서는이문제를해결하여 Apache License로배포되는코드가 GPL 3.0으로배포되는코드와결합하는것이가능. 13
1.3 ~ 1.7 안드로이드구성요소및구조 14
안드로이드의구성요소및구조 - 전체 15
안드로이드플랫폼의구조 크게 4~5 개의구조로볼수있음 Applications (JAVA 로작성된실행프로그램 ) Application i Framework (JAVA API 에해당함 ) 이계층과 Native framework 사이에는 JAVA Virtual Machine(Dalvik) 과 JNI(JAVA Native Interface) 가존재 C/C++ 로작성된 Libraries(Native 라고도표현한다 ) 중요멀티미디어, 디스플레이엔진등이여기에속함 HAL(Hardware Abstraction Layer): 제외되는경우가있음 안드로이드용으로패치된리눅스커널 16
안드로이드용리눅스커널패치 안드로이드에알맞게수정된리눅스커널 수정된내용 안드로이드프레임워크에서사용되는부분 (binder, ashmem, logger 등 ) 휴대폰에알맞게수정이되는부분 (alarm, low memory killer, power management 등 ) 17
안드로이드커널특징 Low memory killer 기존리눅스용의 Out of memory killer 와의차이 binder 메모리부족시프로세스우선순위가낮은그룹을제거 binder 시스템을이용하기때문에하나의응용프로그램은여러개의프로세스로이루어진다 안드로이드프레임워크에서중요하게사용되는프로세스간통신메커니즘 ashmem(anonymouns shared memory) 공유메모리메커니즘, 주로바인더와연동해서사용된다 Power management wakelock 과같은폰에서사용이용이한 locking 메커니즘등을도입 기존의리눅스전원관리는주로노트북에만맞춰져있음 kernel logger 안드로이드에서발생하는로그를처리할수있도록만든메커니즘 printf 등과같은것은사용되지않는다 18
안드로이드라이브러리계층 Android Native Framework 이라고불림 세가지부분으로나눌수있음 안드로이드이전에개발된라이브러리혹은외부에서기존프로젝트에서사용하던라이브러리 ( 주로 external 디렉터리 ) 안드로이드 Framework 부분 (frameworks/base 디렉터리중 C++ 로작성된것 - JNI는제외 ) 안드로이드의 HAL 부분 19
안드로이드라이브러리계층 주요내용 Java 와인터페이스하기위해존재한다. Surface Manager - UI Windows 제어를담당한다. 2D/3D 그래픽라이브러리를포함한다. 멀티미디어코덱,SQLiteDB 엔진, WWW 엔진을포함한다. 이계층에서주의해서봐야할점 고속, 대용량데이터를처리하는부분 안드로이드핵심인 surface manager, media framework이존재 binder 메커니즘으로구성되어있음 HAL과연동되는부분 주로 binder 서버의형태로구성되어있음 (Binder service 의형태 ) 20
안드로이드라이브러리계층 함수호출구성 응용프로그램에서의함수호출과라이브러리계층에서의함수의움직임 응용프로그램에서는 libui, i libmedia, libutils 까지호출 libbinder를이용 Binder Native Service 들과연동 (IPC이용) Binder Native Service 들은 HAL 을통해서커널로진입 21
안드로이드라이브러리계층 함수호출구성 앞장의그림과같이함수호출이구성되는이유 UI에서하드웨어를제어할경우유닉스 system call의특징이 blocking I/O 의문제때문에 binder 를사용 구성상안드로이드응용프로그램에서시스템으로접근할수있는권한을주지않음 보안혹은주요시스템의제거등과같은문제 ex> 전화통화관련프로그램삭제등 22
대표적인 Binder 서비스 Surfaceflinger Surface(Window) 를합성하는서버 X-windows 의 X-server 와유사한기능 23
대표적인 Binder 서비스 Audioflinger 사운드시스템의주요부분을담당하는서비스 오디오믹싱기능과하드웨어제어가주목적 24
안드로이드라이브러리계층 - HAL HAL 하드웨어인터페이스담당모듈 많은모듈로구성되어있고, 대체적으로 4 가지의형태로존재 1. Input key, touch, mouse 등등 frameworks/base/libs/ui/eventhub.cpp 2. Native Service 에서직접제어하는경우 표준 I/O interface class 를가지고있음. 단, 각모듈별 template interface 는서로틀림 Audio, Surface(Video), Camera 등... 3. 기존 Daemon process 에의 client 로동작하는경우 wifi, ril, bluetooth 4. 그외의 hw module hw 표준인터페이스를가지고있음 (class or structure) ex> sensor 관련부분들, gralloc root filesystem 의 system/lib/hw/* 파일들 25
안드로이드 Runtime JAVA Runtime 과동등한레벨 프로세스가동작되면서 Library 를호출할때사용 JAVA 어플리케이션에서 Libc 기반의 C/C++ Library 를호출할때 Runtime Library를호출 Android는 Dex.(Dalvik Executables (DEX)) 실행파일의구조를사용, 실행파일이 Symbolic Resolution을통하여함수를가지고있다가 Library를호출 Android Runtime 은 Dalvik VM 과 Core Libraries 로구성 Android의개발은 Eclipse의 ADT Plug-in을통해서 JAVA로컴파일되고, Class와 Resource가 Dx 컨버터를통해 Android App(.apk) 로변환되어 Dalvik VM 위에서동작 Dalvik VM은작은메모리에서도최적화되는 Dalvik Executable(.dex) 포멧파일의실행을지원 Dalvik VM은스레딩과저수준의메모리관리지원을위해리눅스커널을이용 26
안드로이드 Runtime Android Runtime 의구조 27
Dalvik VM Dalvik VM 비표준 JAVA Virtual Machine Android SDK로는 Java 소스를 Dalvik 용 bytecode 로직접컴파일이불가능 DEX File 포멧의 Application 을수행 DX 툴을사용하여자바의.class 파일을 Dalvik용 bytecode로변한하여실행코드를생성 C++ 기반의 Class 보다작고, 호환성이좋음 SUN의라이선스정책에따른라이선스비용을회피하기위하여개발 JAVA 는 GPLv2 하의배포된오픈소스였으나 Java ME 에서예외가발생, 핸드셋에 JAVA를탑해하기위해서는라이선스비용발생 현재 (2011.07) Sun microsystems를인수한 Oracle과 Google과의소송진행중에있음 28
Application Framework JAVA API 기반의인터페이스제공 주로 JAVA로이루어진 Binder 서비스와매니저들이존재 Activity Manager 안드로이드애플리케이션의수명주기를관리한다. View System 표준 widget 을담당한다. Window Manager 모든응용프로그램과관련된화면을담당한다. Package Manager etc 시스템에서동작중인응용프로그램의정보를담당한다. 29
Applications JAVA 로구성되어있음 기본프로그램은안드로이드코드안에존재 Dalvik VM 에서실행되므로메모리를관리하는데주의요함 30
안드로이드개발환경 SDK 개발 Eclipse IDE 자바응용프로그램을개발하기위한통합개발플랫폼 안드로이드 emulator 와연동되도록구성 안드로이드 Emulator QEMU 기반의 ARM emulator Eclipse IDE 와연동 타겟보드 안드로이드플랫폼개발용혹은안드로이드폰형태의보드 Emulator로처리가불가능한실제하드웨어와플랫폼개발용 Evaluation board의형태로많이존재 Nexus-one, Nexus-S와같은폰은직접개발이가능하다 31
리눅스와안드로이드시스템구조 리눅스와안드로이드의시스템은다음과같이구성된다 Application Layer Application Layer Application Application Application Userspace (3GBytes) process process process Userspace (3GBytes) Application Frameworks (with Dalvik VM) JAVA to native Interface(JNI) System Services Hardware Abstraction Layer(HAL) Kernel Layer Kernel Layer Kernelspace (1GBytes) filesystem device driver Kernelspace (1GBytes) filesystem device driver memory management Process management memory management Process management Linux system architecture Android Features Android system architecture 32
Android 부팅의요소와 Root filesystem 안드로이드는리눅스를기반으로한다 리눅스부팅의 3 가지요소 부트로더 커널 Root Filesystem 안드로이드는 Root filesystem 을새롭게구성한것이다. 안드로이드소스컴파일시출력되는결과물 컴파일후 out/target/product/{productname}/ 디렉토리에결과물이생성 ramdisk.img, system.img, userdata.img 세개의파일이생성 root, system, data 란디렉토리도생성되어있음 33
Android Root Filesystem Root filesystem 관련파일과디렉토리관련 ramdisk.img root 디렉토리를 cpio 형태의 ramdisk 로만든파일 system.img system 디렉토리를 yaffs2 filesystem image 로만든파일 userdata.img data 디렉토리를 yaffs2 filesystem image 로만든파일 이파일들은각각폰의 NAND 파티션영역에 write 된다. 34
Android Root Filesystem 부팅후구성 안드로이드가부팅된후의디렉토리구성은다음과같다 Android Root Filesystem / -- acct Account 관련시스템 UID 정의 -- cache Cache 파티션을위한영역 -- config Account(google/host) 관련설정 -- d -> /sys/kernel/debug/k 시스템리소스디버깅디렉토리 -- data 사용자데이터, DB, property 리소스 -- anr, app, app-private, backup, dalvik-cache, data, dontpanic `-- local, lost+found, misc, property, secure, system, tombstones -- dev 디바이스노드관련디렉토리 -- etc -> /system/etc 각종설정파일관련디렉토리 -- mnt sdcard 등의 filesystem 및 storage 마운트포인트 `-- asec, obb, sdcard, secure -- proc procfs 마운트포인트이자디버깅포인트 -- sbin superuser 용바이너리디렉토리 -- sdcard -> /mnt/sdcard sdcard 마운트포인트 -- sys sysfs 마운트포인트, 시스템리소스관리 -- system Android Platform 관련핵심디렉토리 -- app, bin, etc, fonts, framework, lib -- media, tts, usr, vendor `-- xbin `-- vendor -> /system/vendor Chipvendor 관련리소스디렉토리 35
Android Root Filesystem 과구성요소의저장 NAND 혹은 Storage 의구성과 Root Filesystem 의구성매칭 36
Root filesystem 관련부팅순서 부팅순서 부트로더실행 커널로부팅 ramdisk.img를 ramdisk로로딩 : 이때 / 디렉토리로로딩 init.rc 와 init.%hardware%.rc 파일을로딩 system.img를 yaffs2 filesystem으로 /system 디렉토리로 mount userdata.img를 yaffs2 filesystem으로 /data 디렉토리로 mount NAND 파티션의 cache영역을 /cache 디렉토리로 mount 부팅완료 37
Android toolchain, Root Filesystem Android 관련 toolchain gcc: GNU compiler 사용 bionic i C BSD 의 libc 를개선 라이선스 : User Application 에서 GPL 문제회피 Size : 약 200k 로 Glibc 의절반크기 개별프로세스마다포함되어야하는부분이기때문에제한된 CPU 파워에서빠른속도동작할수있도록하기위함 Linker 의재구성 Root filesystem binary 구성 기존의 Linux 에서많이사용하는 busybox 를사용하지않음 toolbox 를사용 개발시는 busybox 를사용하는게상대적으로개발에용이함 38
1.8 안드로이드개발방법 39
안드로이드개발방법 안드로이드플랫폼개발에서의여러가지방법 SDK(Software Development Kit) 응용프로그램개발 PDK(Platform Development Kit) Android 소스를가지고개발하는방법 HAL 의구성에따라개발방법에차이가남 NDK(Native Development Kit) 응용프로그램개발 C/C++ 로작성한라이브러리를 JAVA에서직접호출할수있도록구성 JNI를자동으로매핑해주는툴이라고보는편이적합함 PDK에서도 NDK를이용해개발이가능하다 SDK 와 NDK 는안드로이드소스없이개발이가능 단, NDK 는 PDK 에도포함이되어있으므로, 소스가있어도되고없어도개발가능 40
SDK 를이용한개발 SDK 를이용한개발 주로 Application 의경우이방법사용 Android Emulator 와 SDK 를이용해서개발 41
SDK 를이용한개발 GPS 의예 42
PDK 를이용한개발 (1) PDK(Platform Development Kit) 를이용한개발방법 1 Android Porting의개념 : Android 전체소스를가지고개발 주로 Android 소스만으로이루어진서비스개발시사용 43
PDK 를이용한개발 (2) PDK(Platform Development Kit) 를이용한개발방법 2 Android Porting의개념 : Android 전체소스를가지고개발 기존의 Linux용 Daemon 프로그램을 Android가이용하는방법 RILD(Radio Interface Layer Daemon), WiFi, Bluetooth 44
PDK 를이용한개발 (2) RILD 의예 RILD 와 Vendor RIL 과의관계 45
PDK 를이용한개발 (2) Wifi 의예 46
NDK 를이용한개발 NDK(Native Development Kit) 를이용한개발방법 Application을개발할때사용 기존의 C/C++ 라이브러리이용 Library는 C/C++ 로사용, Application개발은 SDK사용 47