본문 바로가기
Programming/Android Kernel,Native

3.1.1 안드로이드 서비스 클라이언트와 서비스 서버

by 개Foot/Dog발?! 2014. 10. 22.

URL : http://insideandroid.org/3-1-1-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%9C%EB%B2%84/



음악 애플케이션이 음악을 재생하는 동안에 오디오 플링어 서비스와 빈번히 바인더 IPC하므로, 이 상황을 설명하기 위한 용어들이 필요하다. 


.....


서비스 클라이언트에는 서비스 프록시가 있어 함수 호출 정보를 전달하고 서비스 서버에는 서비스가 있어 호출된 함수를 실행한다. 두 주체 사이에 위치한 화살표는 바인더 IPC를 의미하며, 바인더 드라이버가 이것을 처리한다.


.....


서비스 클라이언트와 서비스 서버의 구성요소


용어 및 설명

서비스 클라이언트(Service Client)

    : 시스템 서비스가 동작하는 프로세스와 바인더 IPC하는 프로세스이다. 그림 3-2의 왼쪽 사각형 영역이 서비스 클 라이이언트를 나타내며, 내부에 서비스 사용자, 서비스 프록시 등이 위치한다. 예를 들어, 음악 애플리케이션 프로세스가 서비스 클라이언트이다.


서비스 사용자(Service User)

    : 시스템 서비스를 이용하는 주체이며 서비스 클라이언트에 위치한다. 그림 3-2의 왼쪽 상단의 사각형이 서비스 사용자를 나타내며, 서비스 프록시의 foo() 함수를 호출한다. 예를 들어, 음악 애플리케이션이 오디오 플링어 서비스의 서비스 사용자이다.


서비스 프록시(Service Proxy)

    : 바인더 IPC를 이용하여 서비스의 foo() 함수를 호출하기 위해 함수 호출 정보를 생성하는 모듈이다. 그림 3-2의 왼쪽 하단의 사각형이 서비스 프록시를 나타낸다. 예를 들어, foo() 함수 호출을 바인더 IPC로 전달하기 위한 함수 정보(FOO)와 인자 값(“Hello”)을 Parcel7 객체에 담는다. 서비스 프록시를 통해 호출 가능한 함수 목록은 서비스 인터페이스(IFoo)에 미리 선언되어 있다.


바인더 IPC(Binder IPC)

    : 고속의 경량 RPC(Remote Procedure Call)를 지원하기 위해 바인더 드라이버를 이용한 프로세스간 통신을 의미한다. 그림 3-2의 중앙에 위치한 화살표가 서비스 클라이언트와 서비스 서버 사이의 바인더 IPC를 표현한다.


서비스 인터페이스(Service Interface)

    : 서비스가 제공하는 기능을 함수 형태로 선언한다. 그림 3-2에서 IFoo 서비스 인터페이스에는 foo() 함수가 선언되어 있다. 서비스 인터페이스는 바인더 IPC 화살표 내부에 이름을 표시 하였다.


서비스 서버(Service Server)

    : 시스템 서비스가 실행 중인 프로세스이다. 그림 3-2의 오른쪽 사각형 영역이 서비스 서버를 나타내며, 내부에 서비스, 서비스 스텁 등이 위치한다.


서비스 스텁(Service Stub)

    : 바인더 IPC를 통해 수신받은 함수 정보와 인자값을 이용하여 서비스의 해당 함수를 호출하는 모듈이다. 그림 3-2의 오른쪽 하단 사각형이 서비스 스텁을 나타내며, 함수 정보(FOO)와 인자 값(“Hello”)을 이용하여 서비스의 foo() 함수를 호출한다.


서비스(Service)

    : 서비스 인터페이스에 정의된 함수를 구현한 모듈이며 서비스 서버에 위치한다. 그림 3-2의 오른쪽 상단 사각형이 서비스를 나타내며, 여기서 foo() 함수를 구현하고 있다.


* 파셀에 관한 설명은 http://developer.android.com/reference/android/os/Parcel.html를 참고하자.



TIP – 서비스 프록시와 서비스 인터페이스

본서에서는 서비스 인터페이스를 서비스 프록시로 주로 표현하고 있다. 그 이유는 서비스 클라이언트에서 사용하는 서비스 인터페이스의 실체가 주로 서비스 프록시이기 때문이다. 서비스 인터페이스는 자식으로 서비스 프록시(BpFooService)와 서비스 스텁(BnFooService)을 가지는데, 서비스 클라이언트에서는 그 중 서비스 프록시가 생성된다. 예를 들어, IFoo 서비스 인터페이스에 선언된 foo() 함수를 서비스 클라이언트에서 호출하면 서비스 프록시(BpFooService)가 호출된다. 서비스 인터페이스가 서비스 스텁이 되는 것은 서비스 서버에서 IFoo의 foo() 함수를 호출 할 때이다.