Android/JAVA - Binder Source Analysis (바인더 소스 분석)

2014. 4. 7. 20:31Programing/Android / Java

Binder를 사용하는데 반드시 Binder의 동작에 대해 이해해야 하는 것은 아니다.

그러나 Binder에 대해 이해를 하고 있다면, 사용하는 것이나 디버깅을 하는 것에서 많은 도움이 될거라고 생각한다.

모든 소스 코드를 분석하지는 않겠지만, 대표적인 소스를 예로 어떤 역할을 하는지 살펴 보겠다.

기타 소스 부분은 필요할 때마다 뒤져보면 그만이니까~^^


Binder는 service_manager와 함께 시작된다. 

service_manager의 main함수를 살펴보자. 

binder_open()함수를 통해서 "/dev/binder"를 open하고 binder_loop()함수를 실행하는데, 

[ bs->fd = open("/dev/binder", O_RDWR); ]

이 때 인자로 binder_state 포인터 변수BINDER_SERVICE_MANAGER를 넘긴다. 

이것은 필요에 따라 실행되는 프로세스가 아닌, 안드로이드 부팅과 함께 실행되어 종료될때까지 동작한다.


<frameworks/base/cmds/servicemanager/service_manager.c>



 BINDER_SERVICE_MANAGER는 다음과 같이 정의되어있다.

<frameworks/base/cmds/servicemanager/binder.h>

 binder_loop()함수에서는 무한루프에서 ioctl()함수와 binder_parse()함수를 호출한다. 

뭐 ioctl()함수로 메시지를 가져오고 binder_parse()함수로 parsing한 후 적절한 동작을 수행할 것이다.

<frameworks/base/cmds/servicemanager/binder.c>



그럼 어떻게 메시지가 Binder device driver로 보내지는지, 그리고 parsing한 후 보내야할 프로세스로 메시지를 보내는지를 알아보자.

Binder 통신을 하기 전에 먼저 메시지를 수신할 프로세스는 자신을 service_manager에 등록해야한다

service_manager가 알지도 못하는 프로세스로 메시지를 보낼 순 없으니 말이다. 

service_manager에 등록하기 위해서 IServiceManager의 인스턴스를 얻어야 하는데, 이때 사용하는 함수가 defaultServiceManager()이다.

<frameworks/base/libs/binder/IServiceManager.cpp>



IServiceManager 인스턴스를 통해서 addService()함수를 이용하여 프로세스를 등록한다. 

이제 메시지를 수신할 프로세스를 service_manager에 등록했으니 메시지가 있으면 프로세스의 onTransact()함수를 호출할 것이다. 

그럼 메시지를 보내는 것은 어떻게 될까. 

addService()가 있으니 반대로 getService()함수가 있다. 

getService 함수로 메시지를 수신할 프로세스의 Binder 인스턴스를 획득하고 transact()함수를 호출한다.




Refer : http://marujj.tistory.com/10