안드로이드 플랫폼 설명
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

안드로이드 플랫폼 설명

  • 3,410 views
Uploaded on

수원 안드로이드 스터디 ...

수원 안드로이드 스터디
안드로이드 구조와 원리 세미나 자료

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,410
On Slideshare
3,410
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
71
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 안드로이드 구조와 원리 수원 안드로이드 스터디Linux Kernel Source 분석 스터디 이백
  • 2. 안드로이드• Android is an open-source software stack for mobile deviceshttp://developer.android.com/guide/basics/what-is-android.htmlOS(kernel) + root filOS(k l) t filesystem + GUI 프레임워크 t컴파일러 + 라이브러리 + 개발 툴 + 디버깅 + 가상 디바이스
  • 3. 안드로이드를 선택하는 이유?• 단말기 제조사- 잘 만들었는데, 컨텐츠 개발이 부담된다 .• 시스템 프로그래머- OS, 툴체인, GUI 프레임워크는 무엇으로 하지?- SDK 구성 및 배포 책임• 애플리케이션 프로그래머- 단말기에 종속 되지 않는다 않는다.- 저기요. 툴체인 및 sdk 주세요.- 저기요. LCD on/off 어떻게 합니까?
  • 4. 안드로이드 플랫폼
  • 5. 사운드 프레임워크 구조 Application 애플리케이션애플리케이션 프레임워크 MediaPlayer JNI ( 달빅 ) 서비스 프레임워크 MediaPlayer AudioFlinger RPC ( 바인더 ) libaudio.so HAL Alsa Library Library Alsa Driver 디바이스 드라이버
  • 6. Application 개발 환경• SDK 다운 다운로드• Eclipse 설치 p• ADT(Android• Development Tool) 설치• http://developer.android.com/sdk/index.html• http://www.androidpub.com/41231
  • 7. SDK 업데이트
  • 8. Application 개발 준비 완료
  • 9. 안드로이드 플랫폼 소스# cd ~ d# mkdir bin# echo $PATH# curl http://android.git.kernel.org/repo >~/bin/repo# chmod a+x ~/bin/repo# export PATH=$PATH:/root/bin# cd /android_root/# repo i it -u git://android.git.kernel.org/platform/manifest.git init it // d id it k l / l tf / if t it# repo synchttp://source.android.com/source/download.html
  • 10. 안드로이드 플랫폼 소스 구조• bionic bi i : 안드로이드 표준 라이브러리• bootable : 참고용 안드로이드 부트로더• build : 안드로이드 빌드 시스템• cts : 안드로이드 호환성 테스트 프로그램• dalvik : 달빅 가상 머신• development : 개발 관련 지원 소스• external : 공개용 라이브러리• frameworks : 안드로이드 프레임워크• hardware : 안드로이드 HAL• out : 빌드 후 모음• packages : 안드로이드 기본 애플리케이션• prebuilt : 컴파일러• system : 안드이드 코어 프로그램, init 프로세스
  • 11. bionic 라이브러리Why build a custom libc library?• License: we want to keep GPL out of user-space• Size: will load in each process, so it needs to be small• Fast: limited CPU power means we need to be fast• BSD License• Small size and fast code paths• Very fast and small custom pthread implementationBuilt-in support for important Android-specific services• system properties getprop(“my.system.property”, buff, default);• log capabilities LOGI(“Logging a message with priority ‘Info’”);bionic/libc/SYSCALLS.TXT (지원하는 시 템 콜 목록bi i lib 지원하는 시스템 목록)http://andstudy.springnote.com/pages/3660069 (스터디에서 조사한 추가 자료)/etc/passwd, /etc/group 없음,// system/core/include/private/android_filesystem_config.h y / / /p / _ y _ g#define AID_ROOT 0 /* traditional unix root user */#define AID_SYSTEM 1000 /* system server */#define AID_RADIO 1001 /* telephony subsystem, RIL */#define AID_BLUETOOTH 1002 /* bluetooth subsystem */:
  • 12. 안드로이드 소스 빌드• 빌드export LANG=cexport JAVA_HOME=/usr/jdk1.5.0_19export PATH=$JAVA_HOME/bin:$PATHexport ANDROID_JAVA_HOME=$JAVA_HOME$ make k• 파일 복사out/target/product/generic/ramdisk.img -> platforms/android-7/images/out/target/product/generic/system.img -> platforms/android-7/images/out/target/product/generic/userdata.img -> platforms/android-7/images/
  • 13. Goldfish 리눅스 커널 빌드• 다운로드 및 빌드# git clone git://android.kernel.org/kernel/common.git kernel-goldfish# cd kernel-goldfish# git branch -r g / origin/HEAD origin/android-2.6.25 origin/android-2.6.27 origin/android-2.6.29 origin/android-goldfish-2.6.27 origin/android-goldfish-2.6.29 i i d id ldfi h# git checkout --track -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29# export ARCH=arm# export CROSS_COMPILE=/android_root/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/arm-eabi-# make goldfish_defconfig# make• 파일 복사arch/arm/boot/zImage -> platforms/android-7/images/kernel-qemu
  • 14. 파티션 구조 비교기본 임베디드 linux 환경의 파티션 안드로이드 환경의 파티션부트로더 <- u-boot.bin 부트로더 <- u-boot.bin커널 <- zImage 커널 <- zImage루트파일시스템 <- rootfs 루트파일시스템 <- ramdisk.imgUser 영역 ( APP, 추가 데이터 ) system <- system.img cache userdata <- userdata.img / : /system /cache /data
  • 15. 안드로이드 커널• Linux kernel 2.6 기반• ashmem/pmem – 프로세스간 메모리 공유 p• Binder - RPC• Power Management• Low Memory Killer• Logger
  • 16. Runtime Walkthrough Content Telephony Bluetooth Connectivity Location Manager M Service Service Service Manager Window Activity Package Power … Manager Manager Manager Manager JNI AudioFlinger Surface MediaPlayerService Flinger System CameraService Server컨텍스트 데몬 Media매니저 데몬 데몬 Zygote Dalvi VM Server init
  • 17. init출처 : [책] 인사이드 안드로이드
  • 18. init.rc init rc• init.rc int.hardware.rc init rc , int hardware rc ( /proc/cpuinfo의 Hardware 필드 ) 파일 분석on initsysclktz 0loglevel 3 g export PATH /sbin:/system/sbin:/system/bin:/system/xbin export LD_LIBRARY_PATH /system/lib:on boot ifup lo setrlimit 13 40 40:service console /system/bin/sh consoleservice adbd /sbin/adbd disabled 출처 : [책] 인사이드 안드로이드:• system/core/init/readme.txt : 구조에 대한 설명• system/core/rootdir/init.rc : 기본 init.rc 파일
  • 19. 디바이스 노드 생성• 빌드 시 만들어 지는 루트파일 시스템에는 /d 가 존재하지 않는다/dev 않는다.• 콜드플러그(Cold Plug)/핫 플러그(Hot Plug)• uevent 사용 – 커널에서 사용자 공간으로의 정보 전달• /sys 의 uevent 파일 검색 -> “add” uevent 강제 발생 > add• 퍼미션 변경이 필요한 경우 소스 내에 기록된 퍼미션 적용 ( 기본 0600, root, root ) “addn” struct uevent { const char *action; // "add" /sys/devices/mydd/uevent const char *path; const char *subsystem; subsystem; my Device Driver const char *firmware; int major; // xx int minor; // xx ; }// system/core/init/devices.cstatic struct perms devperms[] = { perms_ uevent socket{ "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 },{ "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 },:
  • 20. 펌웨어 업데이트• 리눅스에서 처리되는 uevent ( / /bi /h t l t /usr/bin/hotplug )SUBSYSTEM=moduleDEVPATH=/module/firmware_sample_driverLD_LIBRARY_PATH=/lib:/usr/libPATH=/sbin:/bin:/usr/sbin:/usr/binPATH / bi /bi / / bi / /biecho 1 > /sys/$DEVPATH/loadingcat $HOTPLUG_FW_DIR/$FIRMWARE > /sys/$DEVPATH/dataecho 0 > /sys/$DEVPATH/loading $• init 의 처리 ( 시간이 다소 걸리는 것을 고려해서 이 루틴은 별도의 프로세스(fork)로 동작한다. )// system/core/init/devices.cstatic int load_firmware(int fw_fd, int loading_fd, int data_fd){ // 1) loading_fd 에 1 를 write 하여 다운로드 시작 알림 // 2) 바이너리 펌웨어를 읽어서 (fw_fd), 드라이버의 버퍼로 복사(data_fd) // 3) loading_fd 에 0 를 wirte 하여 다운로드 완료 알림}
  • 21. 프로퍼티• ashmem(Android Sh d M h (A d id Shared Memory) 영역 )• 모든 프로세스에서 조회 가능 및 init에게 변경 요청 bionic 의 start 코드에서 이 영역의 정보를 가진다. -> _start -> __libc_init() 함수 > libc init() -> __libc_init_common() 함수 -> __system_properties_init() 함수 -> main 함수 # default.prop # ADDITIONAL DEFAULT PROPERTIES ADDITIONAL_DEFAULT_PROPERTIES # ro.secure=0 ro.allow.mock.location=1 ro.debuggable 1 ro.debuggable=1 출처 출 : [책] 인사이드 안드로이드 persist.service.adb.enable=1 [command line] # setprop net.dns1 168.126.63.1
  • 22. 자식 프로세스• service 키워드로 기술된 내용 i• 자식 프로세스가 종료(SIGCHILD) 될 때 필요한 작업을 수행한다. ( 리소스 해제 및 재 시작 )service servicemanager /system/bin/servicemanager user system critical onrestart restart zygote onrestart restart mediaservice zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart mediaservice b i bootanim / i /system/bin/bootanimation /bi /b i i user graphics group graphics disabled oneshot
  • 23. POLL 서버(메인루프)ufds[0].fd device_fd;ufds[0] fd = device fd; // 디바이드의 uevent 서비스ufds[0].events = POLLIN;ufds[1].fd = property_set_fd; // 프러퍼티 변경 서비스ufds[1].events = POLLIN;ufds[2].fd = signal_recv_fd; // 자식 프로세스 종료 처리 서비스ufds[2].eventsufds[2] events = POLLIN;fd_count = 3;:for(;;) {nr = poll(ufds, fd_count, timeout); p ( , , ); // 자식 프로세스 종료 처리 및 재 시작 // 디바이스 노드 생성 // 프로퍼티 변경} 출처 : [책] 인사이드 안드로이드
  • 24. 그외• 초기에 디렉 리 생성 및 마 기에 디렉토리 마운트• stdin, stdout, stderr 를 사용 못함• “ANDROID” 글자 출력( /initlogo.rle 파일이 있으면 화면 출력 )• 리눅스의 숨겨진 기능을 활용하는 잘 짜여진 코드
  • 25. logcat# logcatI/DEBUG ( 1780): debuggerd: Jun 9 2009 13:56:46E/flash_image( 1788): cant find recovery partitionI/ServiceManager( 1778): sm : startI/Binder ( 1778): [BLEE] binder_open fd=6, mapped=0x40008000 mapsize=131072D/qemud ( 1790): main: cant find android.qemud= in /proc/cmdline /q ) q /p /I/vold ( 1779): Android Volume Daemon version 2.0E/vold ( 1779): Unable to open /sys/class/mmc_host (m)D/vold ( 1779): Bootstrapping completeD/AndroidRuntime( 1782):D/AndroidRuntime( 1782): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<D/AndroidRuntime( 1782): CheckJNI isD/A d idR ti ( 1782) Ch kJNI i ONI/ ( 1783): ServiceManager: 0xac38
  • 26. JNIJNI(Java N ti I t fJNI(J Native Interface) )출처 : [책] 인사이드 안드로이드
  • 27. 안드로이드 JNI Application classes.dex Hello.java Hello.apk resources.arsc *.xml libhello-jni.so Hello.cpp Hello.java public native String printHello(String str); so 파일 로딩 시 심볼을 검색 후 동적 테이블을 생성한다. default JNI_OnLoad(..) 달빅 가상머신 Hello.cpp jstringJava_com_example_hellojni_HelloJni_printHello( JNIEnv* env, jobject thiz, jstring srt )NDK ( Native Development Kit ) - http://developer.android.com/sdk/ndk/index.html- Hello.cpp 컴파일 하여 hello-jni.so 생성해 준다.- so 바이너리를 생성하기 위한 툴일 뿐이며, 코드 작성 및 필요한 사항은 개발자가 해 주어야 한다. 필 한 한다
  • 28. NDK 컴파일 $ cd android ndk r3 android-ndk-r3 $ ./build/host-setup.sh $ make APP=hello-jniNew -> Project -> Android Projectandroid-ndk-r3/apps/hello-jni/project
  • 29. system server - 정적 테이블 public class SystemServer/* { * JNI registration. native public static void init1(String[] args); } */static JNINativeMethod gMethods[] = { g [] /* name, signature, funcPtr */ { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },};int register_android_server_SystemServer(JNIEnv* env){ return jniRegisterNativeMethods(env "com/android/server/SystemServer", jniRegisterNativeMethods(env, com/android/server/SystemServer gMethods, NELEM(gMethods));} JNI_OnLoad(..) JNI OnLoad(..) 에서 구현 static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz) { system_init(); system init(); }• frameworks/base/services/jni/*
  • 30. zygote• 달빅(Dalvik) 달빅(D l ik) 초기화 수행• 애플리케이션 실행 속도 향상• System Server 를 실행// init.rcservice zygote / y yg /system/bin/app_process -Xzygote /system/bin --zygote -- / / pp_p yg / y / ygstart-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media
  • 31. zygote – 동작 원리 출처 : [책] 인사이드 안드로이드 zygote 에서 새로운 애플리케이션 실행# sh B – 리눅스에서 새로운 리눅 에서 새 운프로세스 실행
  • 32. zygote - Preload classes & yg Resoures출처 : [책] 인사이드 안드로이드
  • 33. 서비스 출처 : [책] 인사이드 안드로이드https://sites.google.com/site/io/anatomy--physiology-of-an-android
  • 34. 애플리케이션 서비스 출처 : [책] 인사이드 안드로이드 <로컬서비스> 로컬서비스서비스의 레퍼런스를 가져온다 <리모트서비스> AIDL(Android Interface Definition Language)를 사용한 바인더 IPC http://developer.android.com/guide/developing/tools/aidl.html
  • 35. 시스템 서비스• 네이티브 서비스AudioFlinger – 오디오 입/출력SurfaceFlinger – 화면 출력CameraService – 카메라 입/출력• 코어 플랫폼 서비스Activity Manager Service – 액티비트 관리Window Manager Service – 화면 그리기 관리Package Manager Service – 패키지(apk) 관리• 하드웨어 서비스 출처 : [책] 인사이드 안드로이드Alarm Manager Service – 타이머 관리Connectivity Service – 네트웍 상태 정보Location Service – 단말의 위치 정보Power Service – 전원 관리Sensor Service – 센서 디바이스 관리Telephony Service – 전화 서비스Wifi Service – 무선 검색, 연결 관리
  • 36. Layer Interaction• There are 3 main fl h flavors of Android l f d d layer cake: k• App -> Runtime Service -> lib• App -> Runtime Service -> Native Service -> lib• App -> Runtime Service -> Native Daemon -> lib
  • 37. App -> Runtime Service -> lib > >
  • 38. App -> Runtime Service -> Native Service -> lib > > >
  • 39. App -> Runtime Service -> Native Daemon -> lib > > >
  • 40. Media Server / System Server 출처 : [책] 인사이드 안드로이드
  • 41. 컨텍스트 매니저 네 네, 저한테 저는 foo라 맡겨 주십 는 서비스 시요. 입니다. 컨텍스트 매니저 서비스 컨텍 컨텍스트 매니저! 매니저 foo라는 서비스를 찾습니다.// init.rc 서비스 사용자service servicemanager /system/bin/servicemanager user system t critical onrestart restart zygote onrestart restart media
  • 42. 서비스,서비스 서비스 사용자
  • 43. 바인더• IPC ( Inter Process Communication)• RPC ( Remote Procedure Call) 프로세스 구분 명령 함수구분 인자 프로세스 프로세스 B A 프로세스 C
  • 44. 바인더 프로토콜 출처 : [책] 인사이드 안드로이드
  • 45. 바인더 어드레싱 - 서비스 등록출처 : [책] 인사이드 안드로이드
  • 46. 바인더 어드레싱 – 서비스 검색출처 : [책] 인사이드 안드로이드
  • 47. 바인더 어드레싱 – 서비스 사용 출처 : [책] 인사이드 안드로이드
  • 48. 바인더 mmap 영역 출처 : [책] 인사이드 안드로이드
  • 49. 서비스 프레임워크• P ProcessState St t– biner open, mmap 할당• IPCThreadState- 바인더 프로토콜, IPC 처리 콜• BpBinder / BBinder- 서비스 프록시 / 서비스 스텁 인터페이스 IInterface• IInterface- 바인더 공통 부분 IFooService 서비스 인터페이스• BpXXX / BnXXX- 서비스 프록시 / 서비스 스텁 BnFooService BpFooService 서비스 스텁 서비스 프록시• 서비스 매니저 FooService- 서비스 등록, 서비스 검색 서비스
  • 50. 서비스 프레임워크 - 레이어 서비스 클라이언트 서비스 서버 서비스 사용자 IFooService IFooService 서비스 인터페이스 서비스 서비스 인터페이스 레이어 FooService F S i 서비스 BpFooService RPC BnFooService 서비스 프록시 레이어 서비스 스텁 BpBinder BBinder IPC IPCThreadState 레이어 IPCThreadState 바인더 드라이버
  • 51. 서비스 프레임워크 - 프록시 서비 서비스 사용자서비스 레이어 함수 호출 인자 전달 서비스 프록시RPC 레이어 바인더 RPC 코드 바인더 RPC 데이터 BpBinder 서비스 핸들IPC 레이어 IPCThreadState 바인더 프로토콜 바인더 IPC 데이터 바인더 binder_transaction_data 프로토콜 handle code buffer BC_TRANSACTION 1 바인더 RPC 코드 바인더 RPC 데이터 ioctl i i l write 바인더 드라이버
  • 52. 서비스 프레임워크 - 스텁 서비 서비스서비스 레이어 함수 호출 인자 전달 서비스 스텁RPC 레이어 바인더 RPC 코드 바인더 RPC 데이터 BBinder 서비스 인스턴스IPC 레이어 IPCThreadState 바인더 프로토콜 바인더 IPC 데이터 바인더 binder_transaction_data 프로토콜 cookie code buffer BR_TRANSACTION xxx 바인더 RPC 코드 바인더 RPC 데이터 ioctl i l read d 바인더 드라이버
  • 53. 서비스 프레임워크 – 주요 상속 출처 : [책] 인사이드 안드로이드
  • 54. 서비스 프레임워크 – 바인더 연결 출처 : [책] 인사이드 안드로이드
  • 55. 서비스 매니저출처 : [책] 인사이드 안드로이드
  • 56. 서비스 매니저 구조 출처 : [책] 인사이드 안드로이드
  • 57. 서비스 프레임워크 상호 동작 프로세스 A의 프로세스 B의 사용자 메모리 영역 바인더 mmap 영역 프로세스 A 용어1 - 바인더 RPC 데이터 용어1 - 바인더 RPC 데 이터 프로세스 B value value BpAudioFlinger AudioFlinger ( 서비스) (서비스 프록시)setMasterVolume(float value) setMasterVolume(float value){... 바인더 RPC { ...} } 서비스 서비스 프레임워크 바인더 IPC 프레임워크 용어2 - 바인더 IPC 데이터 용어2 - 바인더 IPC 데이터 바인더 binder_transaction_data 바인더 binder_transaction_data 프로토콜 프로토콜 handle code buffer cookie code buffer SET_MASTER_VOLUME SET_MASTER_VOLUME ioctl ioctl 바인더 드라이버
  • 58. 자바 서비스 프레임워크출처 : [책] 인사이드 안드로이드 JNI 네이티브 서비스 프레임워크
  • 59. 자바 서비스 프레임워크 특징< FooManager 랩퍼 클래스 제공 >출처 : [책] 인사이드 안드로이드 < 네이티브 서비스 프레임워크 재 사용>
  • 60. 자바 서비스 프레임워크 동작 출처 : [책] 인사이드 안드로이드 바인더 드라이버
  • 61. 자바 서비스 프레임워크 상호작용 출처 : [책] 인사이드 안드로이드
  • 62. Q&A