안드로이드 서비스 프레임웍은 디바이스 제어, 위치정보 제공, 알람설정 등 시스템의 가장 기본적인 핵심 기능을 구현하기 위한 것이다. 서비스 개발을 위한 클래스들의 집합으로, 기본적으로 제공되는 서비스 등록, 바인더 IPC 등을 이용하여 서비스를 개발하게 해준다.
C++과 자바로 이루어져 있으며 다음 그림처럼 자바 서비스 프레임워크와 네이티브 서비스 프레임워크는 JNI 호출을 통해서 재활용된다. 다음의 그림으로 구성된다.
서비스 프레임워크는 4가지 기능을 제공한다.
1) 서비스 인터페이스 : 서비스가 제공하는 기능을 함수 형태로 선언, Proxy와 Stub에서 동일한 I/F 로 서비스를 제공하고 사용하는 구조 제공
2) 서비스 생성 : 서비스와 서비스 프록시 생성을 지원
3) 바인더 IPC 지원 : 바인더 IPC 데이터를 생성하고 바인더 드라이버와 통신할수 있는 기능 제공
4) 서비스 매니저 : 시스테에 서비스를 등록하고 검색할 수 있는 기능 제공
기본적으로 다음의 구조로 클라이언트에서 서비스서버의 함수를 이용하게 된다.
다음은 상기 그림을 좀더 상세화 한 것이다.
예를 들어 AudioFlinger의 setMasterVolume() 함수를 호출할 경우 서비스 클라이언트에서는 다음과 같이 동작한다.
IPCThreadState는 여기에 바인더 프로토콜(BC_TRANSACTION)을 붙여서 바인더 드라이버를 호출한다.
BpBinder의 획득은 BpAudioFlinger에서 getService() 를 통해서 획득한다.
바인더 드라이버에서는 해당 핸들의 서버를 찾아서 다음과 같이 메시지를 전달한다.
IPCThreadDState는 바인더 드라이버와 상호 작용을 통해 바인더 IPC 데이터를 송수신한다. 이때 Parcel이라는 IPC 데이터를 담는 컨테이너를 사용한다.
서비스 프레임워크에서는 서비스 사용자가 특정 서비스의 기능을 이용할 수 있게 해주는 Service Proxy를 제공한다. 서비스 사용자는 서비스 프록시를 통해 해당 서비스 기능을 이용하게 되여 서비스 프록시를 서비스라고 생각하게 된다.
컨텍스트 매니저는 서비스를 이용하기 위한 서비스 등록, 검색 기능을 제공하는데 이 컨택스트 매니저에 대한 서비스 프록시가 바로 서비스 매니저이다. (컨텍스트 매니저의 실행 프로세스가 service_manager 인데 이름을 헷갈리지 말아야 한다. 컨텍스트 매니저의 서비스 프록시를 제공하는 것이 서비스 매니저인 것이다.)
서비스 매니저는 Java와 C++ 서비스 등록을 위해서 제공되며 addService 같은 함수를 제공한다.
서비스 매니저의 BpServiceManager (프록시)의 수신처는 컨텍스트 매니저가 된다. 서비스 획득은 getService 이 인자를 전달해서 획득하게 되는데, 예를 들어 audioflinger 서비스를 획득하려고 할때 BpBinder를 생성하고 BpBInder가 가르키는 핸들이 바인더 드라이버에 등록된 AudioFlinger 노드를 가르키도록 한다.
그리고 이 BpBinder를 가르키는 BpAudioFlinger 를 생성한다. 이 과정으로 AudioFlinger에 대한 Proxy가 생성되는 것이다.
자바서비스프레임워크는 JNI를 통해서 네이티브 서비스 프레임워크와 매칭된다. 네아티브 서비스 프레임워크와 유사하지만, 서비스 레이어 계층에 매니저가 존재한다. (다음 그림의 FooManager)
네이티브 서비스 프레임워크는 서비스매니저를 통해 서비스를 등록, 검색할 수 있도록 하였으나, 자바 서비스 프레임워크에서는 getSystemService() 를 통해서 해당 서비스매니저를 통해서 Proxy를 참조하도록 되어 있다. SDK에 ServiceManager 클래스가 포함되어 있지 않아서 ServiceManager 클래스를 이용하여 시스템 서비스를 등록하거나 시스템 서비스를 검색할 수 없다.
그 대신 어플리케이션 개발자가 특정 서비스를 이용할 수 있도록 매니저 래퍼 클래스를 만들고 ServiceManager를 사용해 해당 매니저 래퍼 클래스를 통해서 시스템 서비스를 이용하도록 한다.
RPC 레이어는 AIDL 로 서비스 프록시와 스텁을 자동으로 생성할 수 있다.
IPC 레이어는 BinderProxy 와 Binder 클래스를 제공한다.
자바 서비스 프레임워크는 BinderProxy 와 Binder가 JNI를 통해서 네이티브 서비스 프레임워크의 기능을 활용한다.
네이티브 서비스 프레임워크에서 ServiceProxy 를 검색하고 생성하는 것과 유사하게, getSystemService를 통해서 IFooService.Stub.proxy 를 참조하는 서비스 매니저를 전달하고 이를 사용해서 호출한다.