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