Zygote
- 실행되면서 Dalvik 가상 머신을 초기화하고 구동시킨다.
- application이 실행되기 전에 실행된 가상 머신의 코드 및 메모리 정보를 공유 - app이 실행되는 시간을 단축.
- 특히 한정된 자원을 사용해야 하는 임베디드 기기에서 적합함

안드로이드에서 하나의 Application은 isolated 된 하나의 프로세스로 실행하게 됩니다. 안드로이드가 실행되면 zygote라는 최초의 Dalvik VM 프로세스 실행되는데 zygote는 부팅시에 많은 시스템 클래스 라이브러리들을 로드 하게 되며 새로운 Application이 실행될 때마다 fork() 함수를 통해 새로운 자식 프로세스를 생성하게 됩니다. Linux는 프로세스가 fork될 때 부모 프로세스의 주소 영역을 카피하는데 이것이 오버헤드가 심하여 빠른 fork를 위해 다른 방법들을 사용합니다. 대표적인 것이 COW(Copy On Write)인데 부모의 주소 영역을 자식 프로세스가 공유하다가 실제 자식 프로세스가 어떤 영역에 쓰기를 시작할 때 별도의 메모리(페이지)를 할당하는 식입니다. 



ZygoteInit

Dalvik VM --> ZygoteInit::main()
 
(1) registerZygoteSocket()
- 새로운 Android application의 실행 요청을 받기 위한 소켓 바인딩
- UDS (Unix Domain Socket)을 사용하며 init.rc에서 app_process를 실행할때 /dev/zygote으로 등록한 socket을 사용한다
(2) preloadClasses()
           preloadResources()
- Android Application Framework에서 사용할 클래스들과 리소스의 로딩
(3) startSystemServer()
- System Server 시작 - Android platform에 필요한 주요 네이티브 서비스를 실행한다
(SurfaceFlinger, AudioFlinger, MediaPlayerService, CameraService)
(4) runSelectLoopMode()
- 새로운 Android application 실행 요청에 대한 처리

'Android' 카테고리의 다른 글

Android GestureDetector  (0) 2012.06.12
Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
블로그 이미지

민둥

,

JNI (Java Native Interface) 
 

- Java와 C/C++간의 인터페이스를 가능하게 해주는 매개체

- Java class에서 C언어로 작성된 라이브러리에 포함된 함수를 사용하고 싶다거나, 반대로 C에서 자바 클래스 라이브러리를 사용하고 싶은 경우

(1) 빠른 처리 속도를 요구하는 루틴 작성

(2) 하드웨어 제어

(3) 기존 C/C++ 프로그램의 재사용

JNI 개발 순서
 

(1) Java 코드 작성

- method 선언은 Java에서, 선언된 method의 실제 구현은 C/C++에서 이루어 진다.

- native keyword로 native method 선언

- System.loadLibrary()에서 C 라이브러리를 로딩

  (윈도우: hellojni.dll / 리눅스: libhellojni.so) 

(2) Java 코드 컴파일

(3) C header 파일 생성

(4) C 코드 작성

(5) C shared library 생성

(6) Java 프로그램 실행


 

Camera

frameworks/base/core/jni/android/graphics/Camera.cpp

frameworks/base/graphics/java/android/graphics/Camera.java


AlarmManagerServie

frameworks/base/services/jni/com_android_server_AlarmManagerService.cpp



frameworks/base/services/java/com/android/server/AlarmManagerService.java




참고: http://blog.naver.com/PostView.nhn?blogId=iflowerpot&logNo=80119729013 

http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=20 

http://blog.naver.com/PostView.nhn?blogId=oh4zzang&logNo=40111762322 



'Android' 카테고리의 다른 글

Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
블로그 이미지

민둥

,

p.46 init.rc 분석 실행

 

  • system/core/init/init.c

 

--> int main(int argc, char **argv)
 


(1) init.rc 파일 파싱: 안드로이드가 동작하는데 공통적으로 필요한 환경 설정

(2) init.{hardware}.rc 파일 파싱: 플랫폼 특화된 환경 설정

(3) early-init 액션 리스트 실행:

(4) init 액션 리스트 실행

 

p.47 액션리스트

 

  • 'on' 키워드로 시작하는 액션 리스트
    • on init: 환경변수를 등록하고 파일 디렉터리 생성/마운트, 퍼미션을 조작한다.
    • on boot: application 종료 조건 설정, 구동에 필요한 디렉터리 파일 퍼미션 등을 설정한다.
  • 'service' 키워드로 시작하는 서비스 리스트
    • init 프로세스가 실행시킬 프로세스들을 기술.
    • service들은 모두 service list 등록되고, init 프로세스는 이를 순차적으로 실행한다.

 

  • init.rc 예제 (linaro-android 파일에서 가져옴)

 

on early-init

    start ueventd

 

on init

 

sysclktz 0

 

loglevel 3

 

# setup the global environment

    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

    export LD_LIBRARY_PATH /vendor/lib:/system/lib

    export ANDROID_BOOTLOGO 1

    export ANDROID_ROOT /system

    export ANDROID_ASSETS /system/app

   

...

 

on boot

# basic network init

    ifup lo

    hostname localhost

    domainname localdomain

 

# set RLIMIT_NICE to allow priorities from 19 to -20

    setrlimit 13 40 40

 

# Define the oom_adj values for the classes of processes that can be

# killed by the kernel.  These are used in ActivityManagerService.

    setprop ro.FOREGROUND_APP_ADJ 0

    setprop ro.VISIBLE_APP_ADJ 1

    setprop ro.PERCEPTIBLE_APP_ADJ 2

    setprop ro.HEAVY_WEIGHT_APP_ADJ 3

    setprop ro.SECONDARY_SERVER_ADJ 4

...

 

# adbd on at boot in emulator

on property:ro.kernel.qemu=1

    start adbd

 

on property:persist.service.adb.enable=1

    start adbd

 

on property:persist.service.adb.enable=0

    stop adbd

 

service servicemanager /system/bin/servicemanager

    user system

    critical

    onrestart restart zygote

    onrestart restart media

 

service vold /system/bin/vold

    socket vold stream 0660 root mount

    ioprio be 2

...

 

 

p.55 액션 리스트 서비스 리스트의 실행

 

  • 액션 리스트와 서비스 리스트의 실행
    • 책에서는 drain_action_queue() 함수라고 소개되어 있지만 (p.55) 바뀐듯.
    • drain_action_queue() --> for + execute_one_command() 같은 역할을 한다.

 


  • 리스트의 명령어를 실행한 , 이벤트에 대한 파일 디스크립트 설정한다.
  • POLL 등록된 fd 이벤트를 기다리게 되고, 이벤트 발생시에 poll() 함수를 통해 이벤트를 처리한다. (p.45~46)


     

'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
Linaro  (0) 2011.11.28
블로그 이미지

민둥

,

Chapter 03

init 프로세스

$ head Makefile

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = 39

EXTRAVERSION = .4

 

p.33 init 프로세스의 실행과정

 

  • kernel/init/main.c

 

--> asmlinkage void __init start_kernel(void)

--> static noinline void __init_refok rest_init(void)

--> static int __init kernel_init(void * unused)
 


(init=/init  같이 최상위 디렉토리에서 init 찾고)
 

--> static noinline int init_post(void)
 

(최상위 디렉토리에 없는 경우 /sbin, /etc, /bin 차례로 찾는다.)
 

 

  • system/core/init/init.c

 

--> int main(int argc, char **argv)
 


(부팅에 필요한 디렉토리들 생성 + 마운트)

 

 

p.36 init 프로세스의 주요 역할
 

  • 디바이스 드라이버 노드 생성
  • 자식 프로세스 종료 처리
  • 프로퍼티 서비스

 

'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
Linaro  (0) 2011.11.28
Porting Android to x86  (0) 2011.11.23
블로그 이미지

민둥

,

Chapter 01

안드로이드 프레임워크 개요

Chapter 02

안드로이드 개발 환경 구축

 
 

p.14 이클립스 개발 환경 구축

 

 

p.20 HelloWorld application 작성

  • Android Project 생성
  • Android SDK and AVD Manager: 안드로이드 가상 머신 생성

 


 

 

'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
Linaro  (0) 2011.11.28
Porting Android to x86  (0) 2011.11.23
인사이드 안드로이드  (0) 2011.11.23
블로그 이미지

민둥

,
인사이드 안드로이드 (Inside the Android Framework)

----------[[ Chapter 06 안드로이드 서비스 개요 ]]----------

Android Service
UI없이 주기적으로 특정한 일을 수행하는 백그라운드 프로세스
ex) Alarm service

Android service 
1) System service
2) Application service

Binding: service를 원격제어할 수 있게 다른 service에 연결하는것
실행 startService()
제어 bindService()

서비스와 이를 생성한 서비스가 동일한 프로세스인지에 따라 로컬 서비스, 리모트 서비스로 구별
- 로컬 서비스: 자신을 생성한 app안에서만 사용, app이 종료되면 종료
- 리모트 서비스: 별개의 독립적인 프로세스에서 동작, main app이 종료되어도 계속 실행

* 바인더 IPC 통신
서비스와 액티비티 사이에 데이터를 주고받을때 --> 마샬링/언마샬링 과정
AIDL (Android Interface Definition Language)


----------[[ Chapter 07 안드로이드 바인더 IPC ]]----------

바인더는 원래 IPC (Inter Proocess Communication) 도구
안드로이드에선 RPC (Remote Procedure Call)를 지원하는데 주로 이용된다.

바인더 IPC 데이터
1) 핸들: 서비스를 구별하는 번호
2) RPC 데이터: 서비스에서 호출할 함수의 인자
3) RPC 코드: 서비스에서 호출할 함수
4) Binder Protocol: IPC 데이터의 처리방법

IPC --> Binder driver : Binder command protocol (BC_)
Binder driver --> IPC : Binder Return protocol (BR_)

Context Manager (핸들번호 0)
다양한 서비스를 모두 목록화해서 관리하는 컨텍스트 매니져
서비스마다 핸들 번호를 할당. 서비스의 추가/검색 등의 관리 기능 수행

Binder Addressing
IPC 핸들을 가지고 서비스 서버를 찾는 과정

컨텍스트 매니져 (Service manager process)

 
----------[[ Chapter 08 안드로이드 서비스 프레임워크 ]]----------

시스템 서비스 <-- 서비스 프레임워크를 통해 구현
서비스 프레임워크: 안드로이드 플랫폼에서 동작하는 서비스를 개발하기위한 클래스의 집합

프레임워크의 대표적인 특징
1) 확장을 통해 새로운 기능을 추가할 수 있다.
2) 구현된 프로그램의 제어 흐름이 프로그램 자체에 있는게 아니라 프레임워크에 의해 좌우된다.

안드로이드 서비스 프레임워크
- 서비스 인터페이스
- 서비스 생성 (서비스, 서비스 프록시)
- 바인더 IPC 지원
- 서비스 매니져

서비스 클라이언트
- 서비스 레이어
- RPC 레이어
- IPC 레이어
- (바인더 드라이버)

* 마샬링 (Marshalling)
하나 이상의 프로그램 또는 연속되어 있지 않은 저장 공간으로 부터 데이터를 모은 다음, 데이터들을 메세지 버퍼에 집어넣고, 특정 수신기나 프로그래밍 인터페이스에 맞도록 그 데이터 를 조직화하거나, 미리 정해진 다른 혀식으로 변환하는 과정을 말한다.
클라이언트에서 마샬링된 데이터를 서버에 전달하게 되면, 서버에서는 그 데이터를 언마샬링하여 사용함으로써 원격지(다른 프로세스)간의 데이터 사용이 가능하게 된다.


'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
Linaro  (0) 2011.11.28
Porting Android to x86  (0) 2011.11.23
블로그 이미지

민둥

,