3 부실제편 Chapter 11 안드로이드아키텍처의이해및분석 Chapter 12 에뮬레이터개발지원환경및분석 Chapter 13 실제타깃으로포팅하기 Chapter 14 타깃장치로고급포팅하기 Chapter 15 안드로이드마켓
11 장안드로이드아키텍처의 이해및분석
목차 11.1 안드로이드소프트웨어플랫폼 11.2 안드로이드커널
11.1 안드로이드소프트웨어플랫폼 4 플랫폼구조 소프트웨어플랫폼이란? 소프트웨어의주요구성요소, 구성요소간의인터페이스, 중요동작방식등의주요특징들을결정짓는모든설계구조 소프트웨어플랫폼은소프트웨어개발에있어가장영향력 소프트웨어플랫폼종류 : 윈도우, 리눅스, 닷넷, 자바 런타임 (runtime) 이란? 안드로이드소프트웨어플랫폼? 모바일장치를위한소프트웨어집합체계층적구조 : 커널, 라이브러리, 런타임라이브러리, 애플리케이션프레임워크, 애플리케이션으로적층 자바플랫폼이라고하지않음 [ 그림 11-1] 안드로이드플랫폼
11.1 안드로이드소프트웨어플랫폼 안드로이드파일시스템구조 일반리눅스파일시스템구조와다르다. [ 그림 11-2] 일반리눅스파일시스템구조
11.1 안드로이드소프트웨어플랫폼 6 안드로이드파일시스템구조 일반리눅스파일시스템에안드로이드플랫폼위한파일저장폴더추가 /data, /system 폴더추가 /recovery 추가 : 안드로이드 2.2 버전 각각의추가된폴더에어떤내용이들어있는지확인필요 [ 그림 11-3] 안드로이드리눅스파일시스템구조
11.1 안드로이드소프트웨어플랫폼 7 안드로이드파일시스템구조 adb 를사용한파일시스템내용 [ 그림 11-4] 안드로이드파일시스템구조확인
11.1 안드로이드소프트웨어플랫폼 8 안드로이드파일시스템구조 adb 를사용한 /data/app/ 폴더내용 [ 그림 11-5] /data/app 디렉토리내용
11.1 안드로이드소프트웨어플랫폼 9 안드로이드파일시스템구조 adb 를사용한 /data/data/ 폴더내용 [ 그림 11-6] 애플리케이션용데이터저장파일
10 커널특징 Open source 리눅스커널 2.6.x 에안드로이드커널패치 내부메모리관리, 프로세스관리, 네트워킹, 운영체계 상위층 : 라이브러리, 달빅런타임 하위층 : 하드웨어 ( 기본장치외의하드웨어릏모듈형식으로동작 ) 사용자모드로동작하면커널버전이갱신될때마다플러그인방식으로배포 / 사용이편리속도느려지는단점라이선스안정성향상 [ 그림 11-7] /dev 의하드웨어드라이버확인
11 우분투리눅스 + 안드로이드기능추가 Debian GNU/Linux 기본 무료로다운로드 GPL, LGPL 라이선스 레드햇리눅스상업화이후독보적마켓쉐어 커널설정에서다음기능추가 Alarm 기능, 공유메모리 (ashmem), low memory-killer, 전력관리 (Power management), 바인더, logger 등 [ 그림 11-8] 우분투홈사이트
12 커널빌드도구변경 기존임베디드시스템은 ARM 사의 ABI (Application Binary Interface) 기반 gcc 컴파일러사용 안드로이드에서는 ARM EABI (Embedded Application Binary Interface) 기반의툴체인사용 EABI?
13 안드로이드일반라이브러리 라이브러리 : C/C++ 로제작 C/C++ 라이브러리변경 : glibc -> BSD Unix 의 libc->bionic C 라이브러리가동적라이브러리확장자 (so)/system/lib 폴더에위치 surface manager, media framework, sqlite, webkit, libc 등으로구성 [ 그림 11-9] 안드로이드라이브러리종류
14 안드로이드일반라이브러리 : surface manager 애플리케이션생성화면 -> 프레임버퍼저장 (RAM) -> LCD 화면표시 LCD 와 CPU 데이터처리속도차이 : 프레임버퍼저장후일시에 LCD 출력 2D, 3D 표현 화면합성, 결합, 반투명효과 [ 그림 11-10] 서피스매니저
15 안드로이드일반라이브러리 : 미디어프레임워크 : PocketVideo OpenCORE 기반, MPEG4, H264, AAC Sqlite : 개방형관계형데이터베이스 WebKit : 웹브라우저기반엔진, 화면웹내용, 오픈소스, 웹관련클래스제공 glibc : GPL, 소스공개의무 libc : BSD, 공개의무없음, 코드경량, libc 를플랫폼에맞게수정한 Bionic C lib, 프로세스마다동적으로적재, libc.so: 226KB 의경량쓰레드 모든라이브러리코드가 bionic 과함께컴파일 LibWebCore OpenGL ES FreeType Audio Manager [ 그림 11-11] 오디오매니저
16 안드로이드런타임라이브러리 : 컴퓨터프로그램을실행하는동안의기능을추가하기위하여사용되는특별한프로그램라이브러리 입출력, 메모리관리, 산술함수기능 일반라이브러리와차이는컴파일러제조사에따라다름 런타임라이브러리는컴파일러와플랫폼에종속 달빅 (Dalvik) 가상머신의지원으로하드웨어종속성해결, 달빅은 405KB 의 livdvm.so 라이브러리로지원
[ 그림 11-12] 자바와달빅가상머신바이트코드비교 11.2 안드로이드커널 안드로이드런타임라이브러리 : DalVik VM 달빅가상머신 가장신비스러운곳 : 미공개소스 Interpreter, register based, 적은메모리에최적화된가상머신, banked 레지스터기반데이터이동으로속도가빠름 일반자바가상머신 : stack based(push, POP 사용 ) 자바언어사용하지만선마이크로시스템스의자바와는다름 ( 특허문제때문 ) 선마이크로시스템스 Java : 1-2 바이트길이코드 안드로이드 Java : 4 바이트코드, ARM 프로세서에최적화, 4 바이트레지스터로명령수행, 빠른성능 17
18 안드로이드런타임라이브러리 : Dalvik VM 일반자바 : 소스코드 (.java) -> 자바컴파일러 -> 클래스생성 (.class) -> 가상머신에서실행 안드로이드자바 : 소스코드 (.java) -> 자바컴파일러 -> 클래스생성 (.class) -> dx 사용 -> dex ( 최소메모리로최적화 ) -> Dalvik 가상머신에서실행
19 안드로이드런타임라이브러리 : Dalvik VM dex 파일구조실습 tools> dexdump -d classes.dex < 실습 11-1> dexdump 의이용 1. cmd 명령으로명령창띄운다. 2. D 드라이버로이동하기위하여 d: 을입력한다. 3. 안드로이드 SDK 에대한환경변수설정이되어있지않다면 cd android\android-sdk\platforms\android-3\tools 명령을실행한다. 4. dexdump -f D:\android\workspace\android\bin\classes.dex 명령을실행
20 안드로이드런타임라이브러리 : Dalvik VM dex 파일구조실습 DEX 버전 : 최초 8 바이트의 Magic Value 값은 035 이다. [ 그림 11-13] dex 파일의헤더구조
< 표 11-1> Dex 파일헤더구조 오프셋 크기 ( 바이트 ) 설명 0x0 8 'Magic' value: "dex\n009\0" 0x8 4 Checksum 0xC 20 SHA-1 Signature 0x20 4 Length of file in bytes 0x24 4 Length of header in bytes (currently always 0x5C) 0x28 8 Padding (reserved for future use?) 0x30 4 Number of strings in the string table 0x34 4 Absolute offset of the string table 0x38 4 Not sure. String related 0x3C 4 Number of classes in the class list 0x40 4 Absolute offset of the class list 0x44 4 Number of fields in the field table 0x48 4 Absolute offset of the field table 0x4C 4 Number of methods in the method table 0x50 4 Absolute offset of the method table 0x54 4 Number of class definitions in the class definition table 0x58 4 Absolute offset of the class definition table
22 안드로이드런타임라이브러리 : Dalvik VM 모든애플리케이션은각자의프로세스실행 고유의달빅가상머신인스턴스 그래서안드로이드는동시에여러개의가상머신실행 일반자바는 1 개의가상머신실행 안드로이드에서애플리케이션프로세스간의독립과메모리관리쓰레드는리눅스운영체제의지원 애플리케이션 ( 자바코드 ) 에서 JNI 를통하여 C 라이브러리 ( 하드웨어드라이버 ) 호출이가능 [ 그림 11.14] 라이브러리동작개념
Application Framework 애플리케이션기발 Activity manager, Window manager, package manager, telephony, resource manager, location manager, content provider 로구성 개발자는프레임워크의 API 활용하여애플리케이션개발 자바로구현 프레임워크와라이브러리사이에는자바와 C 사이의호출규약을매핑하는 JNI 바인딩기술존재 23 윈도우, 리눅스 : 다수의애플리케이션동시에표시 안드로이드 : 1 개의 foreground 애플리케이션표시, 액티비티매니저에의해관리 패키지매니저 : 시스템에동작중인애플리케이션관련정보관리, 하나의패키지파일로배포 ( 윈도우는다수의 DLL 로구성, 배포 ) 윈도우매니저 : 애플리케이션과관련된화면관리 컨텐트프로바이더 : 데이터에대한접근제어, 다른애플리케이션과데이터공유,
24 Application Activity, Broadcast receiver, service, content provider 4 가지 components 조합으로구성 애플리케이션간의동일한권한 애플리케이션에서는사용컴포넌트목록을 AndroidManifest.xml 파일에기록 하나의애플리케이션패키지 : apk 기본 Home 화면내용 : 전화 dial, e-mail, 주소록, web browser, 안드로이드마켓 애플리케이션은각각독립된메모리공간 인텐트 : 애플리케이션간의메모리공유 [ 그림 11-15] 애플리케이션분류
안드로이드플랫폼부팅 커널부팅 -> init ( 파일시스템마운팅, 폴더권한설정, 시작프로그램동작 ) -> 안드로이드데몬적재 25 [ 그림 11-16] 안드로이드플랫폼부팅과정
안드로이드플랫폼부팅 리눅스커널시작후안드로이드의고유데몬실행 소리볼륨데몬 -> 디버그시스템데몬 -> 자이고트 26 [ 그림 11-17] 커널부팅후실행중인프로세스
안드로이드플랫폼부팅 자이고트 달빅 -> 시스템서버 -> 서피스매니저 -> 오디오매니저시동 자이고트와시스템서버간의 IPC (127.0.0.x) 소켓통신 27 [ 그림 11-18] 안드로이드부팅과정
안드로이드플랫폼부팅 시스템서버 (system server) Native services 미디어관련서비스시작 [ 그림 11-19] 네이티브서비스초기화순서
안드로이드플랫폼부팅 Native service 초기화코드부분 < 코드 11-1> 네이티브서비스초기화코드 extern "C" status_t system_init() { LOGI("Entered system_init()"); sp<processstate> proc(processstate::self()); sp<iservicemanager> sm = defaultservicemanager(); LOGI("ServiceManager: %p\n", sm.get()); sp<grimreaper> grim = new GrimReaper(); sm->asbinder()->linktodeath(grim, grim.get(), 0); char propbuf[property_value_max]; property_get("system_init.startsurfaceflinger", propbuf, "1"); if (strcmp(propbuf, "1") == 0) { // Start the SurfaceFlinger SurfaceFlinger::instantiate(); } // On the simulator, audioflinger et al don't get started the // same way as on the device, and we need to start them here if (!proc->supportsprocesses()) { // Start the AudioFlinger AudioFlinger::instantiate(); // Start the media playback service MediaPlayerService::instantiate(); // Start the camera service CameraService::instantiate(); 29
안드로이드플랫폼부팅 자이고트이후각종기본서비스및애플리케이션 30 [ 그림 11-20] 안드로이드데몬 / 애플리케이션동작상황
안드로이드플랫폼부팅 안드로이드부팅이후자바서비스시작 : 시스템서버 /frameworks/base/services/java/com/ android/server/systemserver.java 시스템서버는 Native 서비스외에도다양한서비스지원 31 [ 그림 11-21] 시스템서버서비스순서
32 < 코드 11-2> 시스템서버에서 init2() 와스레드를호출하는코드 // And now start the Android runtime. LOGI("System server: starting Android runtime.\n"); AndroidRuntime* runtime = AndroidRuntime::getRuntime(); LOGI("System server: starting Android services.\n"); runtime->callstatic("com/android/server/systemserver", "init2"); // If running in our own process, just go into the thread // pool. Otherwise, call the initialization finished // func to let this process continue its initilization. if (proc->supportsprocesses()) { LOGI("System server: entering thread pool.\n"); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); LOGI("System server: exiting thread pool.\n"); } return NO_ERROR; }
33 시스템서버의기타서비스목록네트워크상태서비스 NetStat Service, 연결서비스 Connectivity Service, 노티피케이션매니저 Notification Manager, 마운트서비스 Mount Service, 디바이스스토리지모니터서비스 Device Storage Monitor Service, 위치매니저 Location Manager, 탐색매니저서비스 Search Manager Service, 폴백체크인서비스 Fallback Checkin Service, 배경화면서비스 Wallpaper Service, 오디오서비스 Audio Service, 핸드셋옵저버 Headset Observer 등 [ 그림 11-22] 서비스목록