안드로이드 framework 노트
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 PresentationTRANSCRIPT
1박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
안드로이드 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
실행
상속관계
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 개 이다 .
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 번이 실행된다 .
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 로딩 )
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 가 생성된다 .
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
8박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
2 System Server
시스템 서비스 명 역할
hardware
alarm
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()
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천이
11박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
3 SMS 서비스의 AIDL
ISms
ISms.stub
remote 에서처리될 Interface
ISms.Proxy
Local 에서처리될 Interface
transact
Native 영역
Process1 Process2
onTransact()
Service Manager 단
12박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
4 SMS IPC 구조 : 타 Process 에 command 보내기
IPCThreadState transac()
writeTransactionData()타 Process 에서 처리된 함수 데이터를mOut 변수 Parcel 에 저장해 둔다 .
waitForResponse()IPC 통신을 가능하게 해주는 커널 드라이버에 해당 함수를 write 한다 .결과를 받아야 하는 상황이면 Threadwait 상태가 되고 결과가 드라이버에서처리 완료되면 드라이버에서 현재 Thread를 깨우고 결과를 던져 준다 .
talkWithDriver()IPC 통신을 가능하게 해주는 커널 드라이버를 사용하는 함수이다 .
13박 성 근 (010-9985-2539) 무단 도용을 금함 (^^;)
4 SMS IPC 구조 : 타 Process 에 command 보내기
IPCThreadState joinThreadPool()
talkWithDriver()IPC 통신을 가능하게 해주는 커널 드라이버를 사용하는 함수이다 .본 함수에서 read 할 데이터가 있는지 확인한다 . read 할 데이터가 있으면 mIn 변수 Parcel에 저장한다 .
executeCommand()
mIn 에 데이터가 있으면 해당 정보를 파싱하여 데이터에 담긴실행해야 할 정보를 실행한다 .
만일 응답을 주어야 할 데이터가 있으면
writeTransactionData()
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
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 데이타
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
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