안드로이드 framework 노트

17
1 박 박 박 (010-9985-2539) 박박 박박박 박박 (^^;) 박박박박박 FrameWork 박박

Upload: zamora

Post on 11-Jan-2016

132 views

Category:

Documents


0 download

DESCRIPTION

안드로이드 FrameWork 노트. 1. Thread 객체. Message. handleMessage(). Thread (Looper / MessageQueue / Handler) 관계. 3. run() 함수 호출. 2. start Thread. 상속관계. 생성 객체. HandlerThread. 1. HandlerThread 생성 및 Thread start. run() 함수 처리. 생성. 4. Looper 생성. Looper. Handler. Handler 생성. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 안드로이드  FrameWork  노트

1박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

안드로이드 FrameWork 노트

Page 2: 안드로이드  FrameWork  노트

2박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

1 Thread (Looper / MessageQueue / Handler) 관계

생성 객체

HandlerThread생성 및

Thread start

Handler생성

HandlerThread

Thread객체

생성1

2 start Thread

3 run() 함수 호출

run() 함수 처리

4 Looper 생성

Looper

messageQueue

5 MessageQueue 생성

Handler

Message 생성 및 Queue 삽입 / 추출

생성6

Message

handleMessage()생성7

Message 추가8

Handler

Message 달림

Handler

9 추출

10

Handler 를통해서 메시지 안에Callback 함수 추출

handleMessage()

11

실행

상속관계

Page 3: 안드로이드  FrameWork  노트

3박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

1 Thread (Looper / MessageQueue / Handler) 관계

int what 메시지의 용도 코드 (Handler 에서 처리될 상수 정의 )

int arg1

int arg2

Object obj 각종 Class 를 담고 참조 할 수 있도록 함

Messenger replyTo 메시지에 대한 응답을 위한 변수

long when 큐에서 메시지를 처리하기 추출 되는 시간

Bundle data

Handler target메시지를 처리하는 객체 (callback 우선실행 2 순위 )이를 통해 실제적으로 메시지가 실행된다 .

Runnable callbackcallback 우선실행 1 순위이를 통해 실제적으로 메시지가 실행된다 .

Message next 다음 처리될 메시지의 포인터를 기억한다 .

static Object mPoolSync

static Message mPool Pool ( Message 를 늘 New 하지 않고 생성된 )

static int mPoolSize Pool 개수 (Max 는 10 개 이지만 현재는 1 개 밖에 저장 안됨 )

static int MAX_POOL_SIZE Pool 개수 최고 10 개 이다 .

Page 4: 안드로이드  FrameWork  노트

4박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

1 Thread (Looper / MessageQueue / Handler) 관계

what

arg1

arg2

obj

replyTo

when

data

target

callback

next

mPoolSync

mPool

mPoolSize

MAX_POOL_SIZE

callback

메시지의 callback 실행 구조

1

2

좌측 그림과 같이 우선적으로1 번이 실행되고 1 번이 NULL 일경우 2 번이 실행된다 .

Page 5: 안드로이드  FrameWork  노트

5박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

2 System Server

System Server 클래스는 안드로이드의 entry point 라고 볼 수 있다 .그러므로 안드로이드의 많은 부분을 이해하려면 꼭 구조를 이해해야 할 부분이기도 하다 .

System Server

Framework 단Dalvik 단

Zygote

JNI int1()

int2()

int1()

1

23

4

ServerThread

run() 함수 처리

8 Looper 생성

Looper

messageQueue

9 MessageQueue 생성

Thread객체

5

6

상속관계

run() 함수 호출7

start()Thread 가동

Android Context 를생성하고 모든 시스템

서비스를 각각의 Thread 를생성하여 가동한다 .

10

11 Looper 가동

system_init.cpp

System.loadLibrary("android_servers");

main()(server lib 로딩 )

Page 6: 안드로이드  FrameWork  노트

6박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

2 System Server

1) Application Context 생성

Context

ApplicationContext

실질적으로 모든Context 가 존재

Context

ContextWrapper

mBase

Context

ContextWrapper

mBase

Core Context Wrapper Context Wrapper Context

예 ) Activity1 예 ) Activity2

core Context 레퍼런스 복사

Context 는 모든 application 에 필요한 정보를 담고 있다 .

Application Context 인스턴스는 하나의 Process 안에는 모든 Thread 가 공유 된다 .단 다른 프로세스가 생성되면 새로운 Application Context 가 생성된다 .

Page 7: 안드로이드  FrameWork  노트

7박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

2 System Server

2) 시스템 서비스들에 대해서

시스템 서비스 명 역할

power

telephony.registry

package

activity

meminfo

cpuinfo

activity.broadcasts

activity.services

activity.senders

activity.providers

permission

content

battery

Page 8: 안드로이드  FrameWork  노트

8박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

2 System Server

시스템 서비스 명 역할

hardware

alarm

Page 9: 안드로이드  FrameWork  노트

9박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

3 SMS 서비스의 AIDL

<<Interface>> IBinder

getInterfaceDescriptor()

pingBinder ()

isBinderAlive ()

queryLocalInterface ()

dump ()

transact ()

linkToDeath ()

unlinkToDeath ()

<<Interface>>

DeathRecipient

binderDied()

<<Interface>> Binder

<native> getCallingPid()

<native> getCallingUid ()

<native> clearCallingIdentity ()

<native> restoreCallingIdentity ()

<native> flushPendingCommands ()

<native> joinThreadPool ()

<native> init ()

<native> destroy ()

Binder()

attachInterface ()

getInterfaceDescriptor ()

pingBinder ()

isBinderAlive ()

queryLocalInterface ()

onTransact ()

dump ()

final transact ()

linkToDeath ()

unlinkToDeath ()

finalize ()

execTransact ()

<<final>> BinderProxy

<native> pingBinder ()

<native> isBinderAlive ()

<native> getInterfaceDescriptor ()

<native> transact ()

<native> linkToDeath ()

<native> unlinkToDeath ()

<native> destroy ()

queryLocalInterface ()

dump ()

BinderProxy()

@override finalize()

final sendDeathNotice()

<<Interface>> ISMS

getAllMessagesFromSimEf()

updateMessageOnSimEf()

copyMessageToSimEf()

sendRawPdu()

sendMultipartText()

<<Interface>>

IInterface

asBinder()

<<abstract>> Stub

Stub()

asInterface ()

asBinder ()

onTransact ()

Proxy

Proxy()

asBinder()

getAllMessagesFromSimEf()

updateMessageOnSimEf()

copyMessageToSimEf()

sendRawPdu()

sendMultipartText()

Page 10: 안드로이드  FrameWork  노트

10박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

ISms

3 SMS 서비스의 AIDL

SMS Manager

sendRawPdu()메시지 발송

asInterFace()ISms.stub

remote 에서처리될 Interface

ISms.Proxy

Local 에서처리될 Interface

SimSmsInterfaceManager

sendRawPdu() 구현 함수

Proxy생성

인스턴스Proxy인스턴스를

받음

23

sendRawPdu()메시지 발송

5

1

4

Parcel 객체 생성

리턴 sendRawPdu( 인자 ) 정보를 Parcel 객체에 담는다 .

return Parcel arg 1..arg nParcelsendRawPdu ( )

6

상속

Local Process

Remote Process

7

transact

8

Parcel 된 함수 형을

return sendRawPdu(arg1,arg2,..)으로 풀어서 실행

process천이

Page 11: 안드로이드  FrameWork  노트

11박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

3 SMS 서비스의 AIDL

ISms

ISms.stub

remote 에서처리될 Interface

ISms.Proxy

Local 에서처리될 Interface

transact

Native 영역

Process1 Process2

onTransact()

Service Manager 단

Page 12: 안드로이드  FrameWork  노트

12박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

4 SMS IPC 구조 : 타 Process 에 command 보내기

IPCThreadState transac()

writeTransactionData()타 Process 에서 처리된 함수 데이터를mOut 변수 Parcel 에 저장해 둔다 .

waitForResponse()IPC 통신을 가능하게 해주는 커널 드라이버에 해당 함수를 write 한다 .결과를 받아야 하는 상황이면 Threadwait 상태가 되고 결과가 드라이버에서처리 완료되면 드라이버에서 현재 Thread를 깨우고 결과를 던져 준다 .

talkWithDriver()IPC 통신을 가능하게 해주는 커널 드라이버를 사용하는 함수이다 .

Page 13: 안드로이드  FrameWork  노트

13박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

4 SMS IPC 구조 : 타 Process 에 command 보내기

IPCThreadState joinThreadPool()

talkWithDriver()IPC 통신을 가능하게 해주는 커널 드라이버를 사용하는 함수이다 .본 함수에서 read 할 데이터가 있는지 확인한다 . read 할 데이터가 있으면 mIn 변수 Parcel에 저장한다 .

executeCommand()

mIn 에 데이터가 있으면 해당 정보를 파싱하여 데이터에 담긴실행해야 할 정보를 실행한다 .

만일 응답을 주어야 할 데이터가 있으면

writeTransactionData()

Page 14: 안드로이드  FrameWork  노트

14박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

5 SMS 발송 과정

SmsManager

sendRawPdu()

ISms (AIDL)

sendRawPdu()

공유 메모리

sendRawPdu 함수 정보를Parcel 에 담아서 저장

SimSmsInterfaceManager

sendRawPdu()

1

2 3

SMSDispatcher

sendSMS()

4메시지 발송용

Intent 작성 전달

SmsTracker5

6

7

CommandsInterface

RIL

sendSMS()

8EVENT_SEND

9

Looper

messageQueue

10

실행

Local Socket 으로메시지 발송

Handler

Object

리턴정보 메시지 처리 정보RILRequest

Object

RILReceiver

run()

발송 응답

RIL_REQUEST_SEND_SMS

RILSender

Handler

Page 15: 안드로이드  FrameWork  노트

15박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

5 SMS 수신 과정

ReceiverThread (RIL Receiver)

Run()

요청에 의한 응답

요청하지 않은 응답Response Unsolicited

Response solicited

RIL Class

RIL_UNSOL_RESPONSE_NEW_SMS

새로운 메시지가 도착 했다는 상수

string 형 데이타

SmsMessageData

파싱

SMSDispatcher : EVENT_NEW_SMS실행Handler

발신측에 메시지를 잘 받았다는 SMS 발송

SMS DELIVERY REPORT

1

2

43

5

6

acknowledgeLastIncomingSMS()

sendBroadcast()

7해당 메시지를 Broadcast 한다 .

ACTION : Intents.SMS_RECEIVED_ACTIONExtra : PDU 데이타

Page 16: 안드로이드  FrameWork  노트

16박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

5 SMS 수신 과정

SenderThread (RIL Sender)

Looper

messageQueue

ReceiverThread (RIL Receiver)

C++ LayerJava Layer

Run()

Loca

l Socke

t

readRilMessage

요청에 의한 응답

요청하지 않은 응답Response Unsolicited

Response solicited

RIL Class

Page 17: 안드로이드  FrameWork  노트

17박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)

6 안드로이드 시스템 서비스

Linux Kernel

Init

ServiceManager

adbd

usbd

1

debuggerd

rild

daemons

2Zygote

3

runtime

4

5

Dalvik VM

SystemServer

76

SurfaceFlinger

Audio Flinger

8

9

10

11

ContentManager

TelephonyService

BluetoothService

ConnectivityService

LocationManager

WindowManager

ActivityManager

PackageManager

PowerManager

12

13 Add Service

Add Service

커널 단 라이브러리 단

Dalvik 단 Framework 단

ServiceManager