안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
-
Upload
ongameserver -
Category
Technology
-
view
5.738 -
download
6
Transcript of 안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
Android 프로세스들의 통신 메커니즘
바인더 이야기
Joonseok 2012.05.19 @ SDC3
주체 : 온라인 서버 개발자 모임 후원 : 넷텐션
개요
• Android 플랫폼의 C++ 코드를 살펴 본다.
• Android 아키텍처 구조를 살펴본다.
• Android 는 프로세스 기반 컴포넌트 프로그래밍 모델을 제공한다. 프로세스 간 메쉬업을 위한 기반 설비 인 바인더에 대해 알아 본다.
ANDROID 코드를 보다. 같은 곳을 바라 보다..
https://github.com/android
Android C++ 코드들을 보면..
sp<IBinder>
RefBase
class BnSurface : public BnInterface<ISurface>
void*
reinterpret_cast<>
①
②
③
객체 관리 @Android
/frameworks/base/utils/StrongPointer.h ①
객체 관리 @Android
wp<>.promote()
를 통한 약한 참조로
순환 참조 문제 해결
Strong Pointer
강한 참조
객체소유권O 객체생명관리O
Weak Pointer
약한 참조
객체소유권X 객체생명관리X
BBinder
BnInterface<>
BnAudioManager
IAudioManager
②
class A { }; class B : public A { }; class C : public B { };
템플릿 상속#1
A
B
C
X#1
A, B 는 변경하지 않고 다양한 X 를 상속 받는 방법은?
X#2
class A { }; template<class T> class B : public A , public T { }; class X { }; class C : public B<X> { };
템플릿 상속#2
BBinder
BnInterface<>
BnAudioManager
IAudioManager
Binder C++ Library
Poll? Epoll?
③
ANDROID PC OS, Linux 프로세스
PC OS가 스마트폰 속으로..
Android
C++ Infra
Java Infra
JAVA Layer
C/C++ Layer
JNI
DalvikVM BioniC
Binder
Linux Kernel
Process
Process
Process
Process
Linux Kernel
Process
Process
Process
Process
시스템 서비스 프로세스
VM
VM
애플리케이션 프로세스
Linux Kernel
Process
Process
Process
Process
시스템 서비스 프로세스
VM
애플리케이션 프로세스
VM
Location 서비스
Carmera 서비스
응용 프로그램
VM
VM
시스템 서비스 프로세스 애플리케이션 프로세스
Process
Process
Process
Process
VM VM
시스템 서비스 프로세스 애플리케이션 프로세스
바인더 (Binder)
메쉬업 도구. 바인더 RPC! 같은 곳을 바라 보다..
B.Call(int value)
class B { void Call(int value) }
B* b = new B b->Call( 1004 )
0x01 : B 프로세스 / b
① 생성 - 등록 ② 조회 - 획득 『B프로세스의 b 에 1004 를 인자로
Call() 메소드호출』
③ RPC데이터
B.Call(int value)
class B { void Call(int value) }
B* b = new B b.Call( 1004 )
0x01 : B 프로세스 / b
Int arg = data.arg switch(code) { case “Call() 메소드호출” : b->Call(); break; … }
『B프로세스의 b 에 1004 를 인자로
Call() 메소드호출』
④ 룩업 ⑤ 해석
B.Call(int value)
class B { void Call(int value) }
B* b = new B b.Call( 1004 )
0x01 : B 프로세스 / b
Int arg = data.arg switch(code) { case “Call() 메소드호출” : b->Call(); break; … }
『B프로세스의 b 에 1004 를 인자로
Call() 메소드호출』
④ 룩업
⑤ 해석
① 생성 - 등록 ② 조회 - 획득
③ RPC데이터
Bridge
pack_data uppack_data forward_message transmit_message
calls
Server-side Proxy
pack_data uppack_data call_service send_response
Client-side Proxy
pack_data uppack_data send_request return
Broker
main_event_loop update_repository register_service acknowledgment find_server Find_client Forward_request Forward_response
Server
initialize enter_main_loop run_service use_Broker_API
Client
call_server start_task use_Broker_API
transfer message
calls
calls
uses API
transfer message
uses API
브로커 패턴
바인더 설비
커널 공간
프로세스 A 프로세스 B 사
용자
공간
int* a int b ?
IPC 설비
커널 공간
프로세스 A 프로세스 B
쓰레드#1
쓰레드#2
쓰레드#1
쓰레드#2
사용
자 공
간 Android IPC 솔루션
바인더 드라이버
커널 공간
프로세스 A 프로세스 B
쓰레드#1
쓰레드#2
쓰레드#1
쓰레드#2
사용
자 공
간 커널 공간은
모든 프로세스들이 공유한다.
프로세스 A 프로세스 B 가
상 메
모리
0x1000 ~ 0x2000
0x3000 ~ 0x4000
물리메모리
프로세스 A 프로세스 B
바인더 드라이버
사용자 Data 사용자 Data
수신 바인더 프로토콜 BR_TRANSACTION
송신 바인더 프로토콜 BC_TRANSACTION
커널 공간
프로세스 A 프로세스 B
사용자 Data 사용자 Data
수신 바인더 프로토콜 BR_TRANSACTION
송신 바인더 프로토콜 BC_TRANSACTION
“A 에서 B 로 데이터 송신”
ioctl() ioctl()
switch (바인더프로토콜) { case BC_TRANSACTION : {…} case BR_TRANSACTION : {…} }
BINDER_WRITE_READ BINDER_WRITE_READ
struct binder_transaction_data { size_t handle; unsigned int code; void *buffer; };
커널 공간
프로세스 A 프로세스 B
사용자 Data 사용자 Data
수신 바인더 프로토콜 BR_TRANSACTION
송신 바인더 프로토콜 BC_TRANSACTION
ioctl() ioctl()
switch (바인더프로토콜) { case BC_TRANSACTION : {…} case BR_TRANSACTION : {…} }
바인더 RPC
바인더 IPC
바인더 드라이버
BpServiceManager addService()
BpBinder transact()
BnServiceManager onTransact()
ServiceManager addService()
마무리 원 밖의 원.
정리
• Android 는 스마트포인터, 템플릿 상속, epoll 을 통한 이벤트 처리기를 구현하고 있다.
• Android 는 프로세스 단위의 컴포넌트 모델을 갖고 있고 서버 프로세스 형태로 시스템 기능을 제공하는데, 프로세스 간 기능 메쉬업(Mesh-up)을 위해 바인더 설비를 제공한다.
• Android 의 바인더(Binder) 는 커널 메모리 참조를 이용해 모바일 기기에 최적인 프로세스 간 통신을 지원한다.
참고자료
• Microsoft “Singularity OS”
• Google IO
• Wikipedia.org
• Kandroid.org
• Naver 웹툰
• 인사이드 안드로이드
감사합니다.