본문 바로가기
Android

인사이드 안드로이드 08 안드로이드 서비스 프레임워크 (3)

by OKOK 2021. 5. 18.

8.4 네이티브 서비스 매니저

각 종 서비스의 정보와 목록을 컨텍스트 매니저가 관리함. 이러한 과정을 통해 서비스와 서비스 사용자 사이에 연결 고리가 만들어짐. 서비스와 서비스 사용자는 서로 다른 프로세스에서 각 독립된 메모리 공간을 사용하기 때문에 둘 사이의 정보 공유를 위해서 프로세스 간 통신이 필요함. 바인더 드라이버는 컨테스트 매니저에 서비스가 등록되는 과정에서 드라이버 내부에 서비스에 대한 연결 정보를 가진 바인더 노드를 생성함. 서비스 프레임워크에서 바인더 노드의 번호를 서비스 핸들 값으로 참조함. 바인더 RPC를 처리해주는 서비스 프록시를 제공함. 서비스 프록시는 서비스와 사용자 사이에서 바인더 알피씨데이터의 송수신을 제공함. 

 

서비스 프레임워크에서 서비스 매니저를 이용해 서비스를 등록하고 서비스의 정보를 획득하는 과정을 살펴봄. c/c++ 레이어에서의 서비스 매니저를 다루고 자바 레이어의 서비스 매너지는 '안드로이드 자바 서비스 프레임워크'에서 다룸. getStrongProxyForHandle() 멤버 함수의 인자로 서비스 핸들 값을 전달해서 호출함. 코드에서 사용된 핸들 값 0은 컨텍스트 매니저에 고정된 서비스 핸들임. 이 함수는 컨텍스트 매니저의 서비스 핸들을 가진 BpBinder의 인스턴스를 생성한 후 포인터를 반환함. 

 

서비스 프레임워크에서 바인더 드라이버에게 전송하는 바인더 IPC데이터는 바인더 프로토콜과 binder_trasaction_data 자료 구조이며, 컨텍스트 매니저를 위한 바인더 RPC 데이터는 송신 측 프로세스(서비스 매니저)의 사용자 메모리 공간에 위치한 data에 저장돼 있고, 바인더 드라이버가 수신 측 프로세스(컨텍스트 매니저)의 바인더 mmap 영역으로 복사함. 그리고 서비스 프레임워크에서 바인더 드라이버로부터 수신하는 바인더 IPC 데이터 역시 바인더 프로토콜과 binder_transaction_data 자료 구조이며 컨텍스트 매니저가 처리 결과로 전송한 바인더 RPC 데이터는 수신 측 프로세스 바인더 mmap영역에 저장되고, reply가 이를 참조함. 

 

8.6 정리

서비스 프레임워크가 제공하는 4가지 기능. 시스템 서비스를 컨텍스트 매니저에 등록해주는 네이티브 서비스 매니저도 포함됨.

댓글