Android 인사이드 강의 2012-06-30 |
문서 암호 : 9V8~hbe[Z2
공부의 흐름?
1. 리눅스 부트 로더 올리는 것을 알아야 한다. -> 밑단에 대한 공부 ARM (Cortex - A8 A9) CPU 에서 올려 봐야 함. Device Driver 를 알아야 함.
3.Linux kernel을 알아야 한다 How to learn kernel? -> 1. 포팅 하면서 공부한다. 2. 내부 operation을 통해 시스템프로그래밍을 해본다.
4.Process 동기화
5.Kernel Network.
6.File system
7.Android |
최신 흐름 방향?
è 가전 제품!
안드로이드 system architecture
응용프로그램 프레임워크 라이브러리 - 달빗 가상 머신 리눅스 커널 è 백그라운드 스레드, 메모리 관리, 보안, 디바이스 드라이버, 런타임 : 달빅 가상 머신과 자바 코어 라이브러리로 구성 프레임 워커 : 안드로이드 API 응용 프로그램
|
인스턴스화 할 수 있는 4개의 컨포넌트 (쉽게 복사할수 있는 매개체)
:액티비티, 서비스. 방송수신자, 콘텐츠 제공자
리눅스 커널과는 달리 안드로이드 커널에 추가된 부분
Alarm 기능 Low Memory killer Ashmem Kernel Debugger Binder Power manager
|
Android : HAL
안드로이드가 새롭게 만든 서비스 계층
Hardware Abstraction Library -> 커널 디바이스 드라이버
Android Libraries
è JNI
Surfaceflinger/Audioflinger
What is frame buffer? -> 디바이스 드라이버
Android Runtime – Dalvik VM Android의 개발은 Eclipse 의 ADT Plug-in 을 통해서 JAVA로 컴파일 되고, Class 와 Resource가 Dx컨버터를 통해 Android app(.apk)로 변환 되어 Dalvick VM 을 사용
|
Kernel
Device file system |
Buffer chache |
Network |
|
|
|
|
|
|
디바이스가 부팅 될 때는 reset exception 이 발생하고 이는 처음 부팅할 때 0x0000000 을 로드하고, 그 안에는 시작할 번지수가 들어가 있다.
그 시작 할 번지는 스택을 만드는데, 이는 C언어의 함수들은 스택 구성으로 이뤄지기 때문이다.
Binder
IPC(inter processing coumnunication)의 프로세싱 오버헤드와 보안 헛점을 해결하기 위해 채택
Android 의 init의 특징
Init.rc 와 init.%hardware%.rc를 로딩하여 처리 è 안드로이드는 이 부팅 시 두 개 파일밖에 처리 하지 않는다. è 이렇게 통합된 이유는 퍼미션의 문제와 보안 때문이다. Init.rc 혹은 devices.c 의 해당 부분을 직접 수정한다.
일반 리눅스와의 차이 통합된 init 전통적인 /etc/passwd , /etc/group 을 사용하지 않음 /이러한 permission이 결정되고, 이 후 변경하지 못함 모든 안드로이드 어플리케이션은 AndroidManifest.xml 파일을 가지고 권한을 준다.
사용자 그룹 ID가 지정되어 있는곳은 System/core/include/private/android_
Android 에서 device node 생성 기본적으로 read-only로 생성 각 device 별 소유와 접근 permission을 source 에서 처리 위치 : system/core/init/devices.c
|
Android 의 초기 실행 과정
System mount 및 Log system 초기화 ->
Handler 란?
SIGCHLD handler란? 좀비 프로세스 같은 것을 막아두기 위해 사용 되는 것이다. 프로세스간의 동기화 같은 것을 잘 처리하기 위해 사용된다. 따라서 init process 는 SIGCHLD Signal 를 처리 해야만 한다. |
Init.rc 파일 parsing
Init.rc 파일을 파싱하여 service_list와 action_list구성을 한다 환경 변수 초기화 Mount point 생성 MTD(랜드 플래시 쪽과 같이)파티션 마운트 기본 파일 시스템
On boot. |
QEMU_init()
Qemu_perms 영역을 meset()을 이용 초기화 Early-init 영역 실행 Device node 생성 System Property 초기화
|
임베디드 환경에서 커널 컴파일 할때의 명령어?
#make zimage |
Action_list의 init 영역을 action_list에 파싱하여 저장
파일 포인터와 파일 디스크립터 차이점
파일포인터는 FILE*타입의 포인터 변수를 말하며, C표준 IO라이브러리에서 사용하는 IO개체로, 스트림 기반으로 동작합니다.
파일디스크립터는 대개는 int 타입으로 선언되는 고유 식별 번호이며, 각 OS별로 제공되는 IO시스템 콜에서 각 IO자원을 구별하기 위해 사용합니다.
물론, C표준 입출력 스트림 역시 OS가 제공하는 IO서비스를 이용하므로, 당연히 FILE구조체의 멤버로 파일 디스크립터가 있을 수 밖에 없습니다만, FILE*는 여기에 더해서 스트림 방식의 형식화된 입출력을 지원하기 위해 여러가지 부가 정보가 붙습니다. 다시말하면, FILE*는 C표준에서 제정한, 파일디스크립터의 래퍼(wrapper) 자료구조라고 보시면 되겠습니다.
파일포인터와 파일 디스크립터의 가장 큰 차이는, 파일포인터는 C라는 언어에서 제정한 표준 입출력 객체이며, 파일디스크립터는 OS에서 제공하는 입출력 식별자라는 점입니다.
|
Zygote(수정란)
Zygote를 통한 프로세스 관리(fork 의 아류작!)
어플리케이션을 빠르게 구동하기 위해 미리 fork 되어 있는 프로세스 시스템에서 exec() 호출을 통해 특정 어플리케이션을 실행하고자 하기 전까지는 중립적인 상태, 즉 특정 애플리케이션과 합체되지 않는 상태를 유지.
|
Ramdisk.img
작은 크기로, 설정 파일과 init 프로세스 recovert\y와 같은 실행 파일을 포함 System.img / userdata.img
|
NDK(Android native Development eit) 를 이용한 개발
JNI 폴더가 같이 커파일된다. C파일에는 jni.h 가 같이 들어간다.
ds에 기본 구성에서 통신하는 부분이 기본 예제로 짜여져 있다.
#define led_dev “/dev/led” //dev 밑에 led가 있다는 것을 정의한다. Dev open (led_dev,O_RDWR); // 이런식으로 파일 디스크립터를 불러낸다. Write(dev,&buff,2) Close(dev) |
위와 같은 코드 식으로 전개 된다.
C/C++ 로 작업하면 이가 shared object(SO) 파일로 자바단에서 불러진다. 그리고 함수 호출하듯 호출된다.
NK 에서 제공하는 것들 Libc (c library) STL OPEN CV 등 /so 파일로 만들어진 native 바이너리는 apk 파일에 보관되고 이는 /data/data 파일에 저장된다
|