2012. 6. 30. 16:46

Android 인사이드 강의

2012-06-30

 문서 암호 : 9V8~hbe[Z2


android_JNI-NDK_APv1.0.pdf


공부의 흐름?

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 파일에 저장된다

 

 

Posted by k1rha