슬라이드 1

Download Report

Transcript 슬라이드 1

안드로이드 FrameWork 노트
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
1
1
Thread (Looper / MessageQueue / Handler) 관계
Thread
객체
2 start Thread
run() 함수 호출
상속관계
생성 객체
HandlerThread
생성 및
Thread start
3
HandlerThread
1
run() 함수 처리
생성
4
Looper 생성
Looper
Handler
Handler
생성
Message 달림
5
MessageQueue 생성
messageQueue
6
생성
11
8 Message 추가
9
추출
Handler
handleMessage()
실행
Message 생성 및 Queue 삽입/추출
Message
7
생성
handleMessage()
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
Handler
10
Handler를
통해서 메시지 안에
Callback함수 추출
2
1
Thread (Looper / MessageQueue / Handler) 관계
int
what
int
arg1
int
arg2
Object
obj
각종 Class를 담고 참조 할 수 있도록 함
Messenger
replyTo
메시지에 대한 응답을 위한 변수
long
when
큐에서 메시지를 처리하기 추출 되는 시간
Bundle
data
Handler
target
메시지를 처리하는 객체(callback우선실행 2순위)
이를 통해 실제적으로 메시지가 실행된다.
Runnable
callback
callback 우선실행 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개 이다.
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
메시지의 용도 코드 (Handler에서 처리될 상수 정의)
3
1
Thread (Looper / MessageQueue / Handler) 관계
메시지의 callback 실행 구조
what
arg1
arg2
obj
replyTo
when
data
target
1
callback
next
2
callback
좌측 그림과 같이 우선적으로
1번이 실행되고 1번이 NULL일
경우 2번이 실행된다.
mPoolSync
mPool
mPoolSize
MAX_POOL_SIZE
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
4
2
System Server
System Server 클래스는 안드로이드의 entry point 라고 볼 수 있다.
그러므로 안드로이드의 많은 부분을 이해하려면 꼭 구조를 이해해야 할 부분이기도 하다.
Dalvik 단
Framework 단
ServerThread
run() 함수 처리
8
System Server
1
Zygote
Looper
main()
(server lib 로딩)
System.loadLibrary("android_servers");
system_init.cpp
int1()
9
2
3
Looper 생성
MessageQueue 생성
messageQueue
JNI int1()
4
5
int2()
10
6
Android Context를
생성하고 모든 시스템
서비스를 각각의 Thread를
생성하여 가동한다.
run() 함수 호출
7
start()
Thread 가동
Thread
객체
11
Looper 가동
상속관계
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
5
2
System Server
1) Application Context 생성
Context는 모든 application에 필요한 정보를 담고 있다.
예) Activity1
Wrapper Context
예) Activity2
Wrapper Context
Context
Context
Context
…
…
…
ApplicationContext
ContextWrapper
ContextWrapper
실질적으로 모든
Context가 존재
mBase
mBase
Core Context
core Context 레퍼런스 복사
Application Context 인스턴스는 하나의 Process 안에는 모든 Thread가 공유 된다.
단 다른 프로세스가 생성되면 새로운 Application Context가 생성된다.
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
6
2
System Server
2) 시스템 서비스들에 대해서
시스템 서비스 명
역할
power
telephony.registry
package
activity
meminfo
cpuinfo
activity.broadcasts
activity.services
activity.senders
activity.providers
permission
content
battery
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
7
2
System Server
시스템 서비스 명
역할
hardware
alarm
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
8
3
SMS 서비스의 AIDL
<<Interface>>
IInterface
<<Interface>>
Binder
<<Interface>>
IBinder
<native> getCallingPid()
getInterfaceDescriptor()
<native> getCallingUid ()
pingBinder ()
<native> clearCallingIdentity ()
isBinderAlive ()
getAllMessagesFromSimEf()
<native> restoreCallingIdentity ()
queryLocalInterface ()
updateMessageOnSimEf()
<native> flushPendingCommands ()
dump ()
copyMessageToSimEf()
<native> joinThreadPool ()
transact ()
sendRawPdu()
<native> init ()
linkToDeath ()
sendMultipartText()
<native> destroy ()
unlinkToDeath ()
asBinder()
<<Interface>>
ISMS
Binder()
<<Interface>>
Stub()
attachInterface ()
binderDied()
asInterface ()
getInterfaceDescriptor ()
asBinder ()
pingBinder ()
onTransact ()
isBinderAlive ()
<native> pingBinder ()
queryLocalInterface ()
<native> isBinderAlive ()
onTransact ()
<native> getInterfaceDescriptor ()
dump ()
<native> transact ()
final transact ()
<native> linkToDeath ()
linkToDeath ()
<native> unlinkToDeath ()
unlinkToDeath ()
<native> destroy ()
finalize ()
queryLocalInterface ()
execTransact ()
dump ()
<<abstract>>
Stub
Proxy
Proxy()
asBinder()
getAllMessagesFromSimEf()
updateMessageOnSimEf()
copyMessageToSimEf()
sendRawPdu()
sendMultipartText()
<<final>>
DeathRecipient
BinderProxy
BinderProxy()
@override finalize()
final sendDeathNotice()
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
9
3
SMS 서비스의 AIDL
Local Process
ISms
ISms.stub
asInterFace()
1
remote에서
처리될 Interface
4
SMS Manager
상속
Parcel 된 함수 형을
Proxy
인스턴스를
받음
인스턴스
sendRawPdu()
메시지 발송
Proxy
생성
3
return sendRawPdu
(arg1,arg2,..)
8
으로 풀어서 실행
2
ISms.Proxy
5
sendRawPdu()
메시지 발송
Local 에서
처리될 Interface
6
7
transact
process
천이
SimSmsInterfaceManager
sendRawPdu()
구현 함수
Parcel 객체 생성
리턴 sendRawPdu(인자) 정보를 Parcel 객체에 담는다.
return Parcel
sendRawPdu (
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
arg 1..arg nParcel
Remote Process
)
10
3
SMS 서비스의 AIDL
ISms
ISms.stub
remote에서
처리될 Interface
onTransact()
ISms.Proxy
Process1
Local 에서
처리될 Interface
transact
Process2
Native 영역
Service Manager 단
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
11
4
SMS IPC 구조 : 타 Process에 command 보내기
transac()
IPCThreadState
writeTransactionData()
타 Process에서 처리된 함수 데이터를
mOut변수 Parcel에 저장해 둔다.
waitForResponse()
IPC 통신을 가능하게 해주는 커널
드라이버에 해당 함수를 write한다.
결과를 받아야 하는 상황이면 Thread
wait 상태가 되고 결과가 드라이버에서
처리 완료되면 드라이버에서 현재 Thread
를 깨우고 결과를 던져 준다.
talkWithDriver()
IPC 통신을 가능하게 해주는 커널
드라이버를 사용하는 함수이다.
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
12
4
SMS IPC 구조 : 타 Process에 command 보내기
IPCThreadState
joinThreadPool()
talkWithDriver()
IPC 통신을 가능하게 해주는 커널
드라이버를 사용하는 함수이다.
본 함수에서 read할 데이터가 있는지
확인한다.
read할 데이터가 있으면 mIn변수 Parcel
에 저장한다.
executeCommand()
mIn에 데이터가 있으면
해당 정보를 파싱하여 데이터에 담긴
실행해야 할 정보를 실행한다.
만일 응답을 주어야 할 데이터가 있으면
writeTransactionData()
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
13
5
SMS 발송 과정
발송
SmsManager
SMSDispatcher
sendRawPdu()
sendSMS()
6
run()
Handler
SimSmsInterfaceManager
실행
Object
메시지 발송용
Intent 작성 전달
10
ISms (AIDL)
RILReceiver
Local Socket으로
메시지 발송
5
4
1
SmsTracker
응답
Looper
7
messageQueue
sendRawPdu()
sendRawPdu()
CommandsInterface
RIL
sendRawPdu 함수 정보를
Parcel에 담아서 저장
2
공유 메모리
sendSMS()
3
리턴 RILRequest
정보
Object
8
9
RILSender
메시지 처리 정보
Handler
EVENT_SEND
RIL_REQUEST_SEND_SMS
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
14
5
SMS 수신 과정
RIL Class
ReceiverThread (RIL Receiver)
Run()
요청에 의한 응답
Response solicited
요청하지 않은 응답
1
Response Unsolicited
새로운 메시지가 도착 했다는 상수
2
RIL_UNSOL_RESPONSE_NEW_SMS
sendBroadcast()
3
string 형
데이타
4
파싱
7
SmsMessage
Data
해당 메시지를 Broadcast 한다.
ACTION : Intents.SMS_RECEIVED_ACTION
Extra : PDU 데이타
SMSDispatcher : EVENT_NEW_SMS
Handler 실행
5
acknowledgeLastIncomingSMS()
6
발신측에 메시지를 잘 받았다는 SMS 발송
SMS DELIVERY REPORT
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
15
5
SMS 수신 과정
Java Layer
C++ Layer
RIL Class
SenderThread (RIL Sender)
Looper
messageQueue
Run()
Local Socket
ReceiverThread (RIL Receiver)
요청에 의한 응답
Response solicited
요청하지 않은 응답
readRilMessage
Response Unsolicited
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
16
6
안드로이드 시스템 서비스
Content
Manager
Telephony
Service
Bluetooth
Service
Connectivity
Service
Location
Manager
Window
Manager
Activity
Manager
Package
Manager
Power
Manager
…
13
Add Service
Service
Manager
11
10
daemons
Service
Manager
usbd
Audio Flinger
Add Service
9
Surface
Flinger
8
5
adbd
runtime
6
debuggerd
12
4
System
Server
7
2
3
rild
Init
Zygote
Dalvik VM
1
Linux Kernel
박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
커널 단
라이브러리 단
Dalvik 단
Framework 단
17