바인더 관련

바인더

원래 IPC(Inter Process Communication) 도구이지만 안드로이드에서는 다른 프로세스에 있는 함수를 마치 현재 프로세스에 존재하는 함수처럼 사용할 수 있게 해주는 RPC(Remote Procedure Call)를 지원하는 데 주로 이용

안드로이드에서 바인더 드라이버를 추가해서 프로세스 간 통신을 수행하는 이유?

리눅스의 뛰어난 메모리 관리 기법을 그대로 채용함으로써 커널 공간을 통한 데이터 전달시 데이터의 신뢰성을 확보

사용자 공간에서 접근할 수 없는 공간인 커널 공간을 이용해 데이터를 주고 받기 때문에 IPC 간의 보안 문제도 동시에 해결

d

카메라앱의 바인더호출

Camera 서비스의 내부 동작

Camera.cpp는 Camera::getCameraService()를 통해서 ICameraService 를 호출한다.

실제는 BpCameraService가 호출될 때 이루어진다. BpCameraService는 binder를 통해서 두 프로세스 사이의 BnCameraService 통신채널을 생성한다. BpCamera Service의 connect()함수에서는 다음과 같이 BnCamera Service를 연결시키는 부분이 있다.

remote()->transact(BnCameraService::CONNECT, data, &reply);

Camera server로의 서비스 요청

카메라 서비스로의 접속은 서비스 매니저로부터 Camera Service를 담당하는 binder class인 ICamera Service를 get함으로써 이루어진다. 물론, 그 전에 ICameraClient 형의 Camera class를 생성함으로써 Camera client로부터 Camera server(카메라 서비스)로의 Binder 연결이 이루어진다.

CONNECT command를 통해서 카메라 서비스로 접속을 하게 되면 카메라 서비스 쪽에서는 server에서 client로 접속되는 ICamera 형의 client class를 생성해서 Camera client 쪽으로 할당해 준다. ICameraService를 이용한 Binder interface는 CONNECT command외에 다른 command는 존재하지 않는다. 이 Class는 오직 connect를 받아서 새로운 Binder를 생성(server에서 client로의 data 통로를 여는)하기만 할 뿐이다.

위의 메커니즘 설명은 이러한 부분에 대한 기술적인 설명을 하는 부분이 된다. IPC인 Binder 부분은 실제 호출되는 부분과 실행되는 부분이 감추어져 있기 때문에 코드에 대한 추적이 어렵다.

즉, ICameraService.cpp의 BpCameraService의 connect()를 통해, CameraService.cpp의 Camera

Service::onTransact() 로 아래의 내용을

status_t err = BnCameraService::onTransact(code, data, reply, flags);

호출함으로써 두 개의 프로세스간 BnCameraService()통신채널을 구성하게 된다. 실제 BpCameraService의 구현은 CameraServicce에서 이루어진다고 보면 된다. Camera.cpp는 다른 프로세스로 동작 하지만, 그 인터페이스는 ICameraService의 connect()를 호출함으로써 CameraService의 ICamera class인 CameraService:: Client를 획득할 수 있게 된다. Camera에 관련된 함수들은 CameraService:: Client 가 생성되면서 실제로 구현된다.

출처 : 테크월드(http://www.epnc.co.kr)