본문 바로가기
Android

인사이드 안드로이드 10 자바 서비스 프레임워크 (2)

by OKOK 2021. 5. 19.

10.5 AIDL을 이용한 서비스 프록시와 스텁의 구현

안드로이드 자바 서비스 프레임워크에서 제공하는 자바 시스템 서비스는 대부분 AIDL을 이용해 서비스를 생성함. 서비스 인터페이스는 서비스 포록시와 서비스가 서로 동일한 인터페이스를 공유하기 위한 함수를 정의하고, 서비스 인터페이스와 IBinder 사이에 형 변환 기능을 구현해야 함. 또한 서비스 프록시는 바인더 RPC를 위한 바인더 RPC 코드와 데이터를 생성해야 함. 서로 다른 프로세스에서 동작하는 서비스를 구현한 경우 전달할 데이터를 마샬링 하는 과정은 자주 반복되는 코드를 만들어 냄. 이러한 경우에 AIDL 언어를 이용해 서비스의 인터페이스를 기술하면 서비스 인터페이스, 서비스 프록시, 서비스 스텁 클래스의 자바 코드를 자동으로 생성할 수 있음. 

 

AIDL 언어의 인터페이스 문법에는 자바 인터페이스 문법에 없는 내용이 있음. interface_header는 interface라는 문자열이나 oneway interface로 선언할 수 있다. oneway는 서비스 사용자가 해당 기능을 요청했을 떄 응답을 기다리지 않고 호출 즉시 반환하라는 의미임. 인터페이스 문 앞이나 메서드 선언문 앞에도 올 수 있으며 인터페이스 문 앞에 oneway를 선언하면 인터페이스에 선언된 모든 메서드가 oneway 방식임을 의미함. 두 번째로 getSize() 메서드 선언문을 살펴보면 매개변수에 in 키워드가 명시돼 있음. 방향 지시자는 총 3가지가 있으며 in, out, inout 으로 기술함. in 방향 지시자는 서비스의 메서드로 매개변수가 전송됨. Stub 클래스는 Binder 클래스를 상속하고 자동으로 생성된 IMyService 인ㅇ터페이스를 구현하고 있으므로 서비스임을 알 수 있음. 

 

MyService 클래스에서 구현한 메서드는 모두 RemoteException을 던짐. 바인더 원격 호출 시에 발생하는 예외로 부모 클래스로 정의하고 있음. 해당 메서드를 호출하는 측에서 try/catch 문으로 RemoteException을 처리한다면 바인더 IPC가 진행되는 동안 발생하는 통신 오류를 검출할 수 있음. 

 

10.6 정리

네이티브 서비스 프레임워크와 차이점은 서비스 사용자를 위한 매니저 클래스가 존재하고, AIDL을 이용해 서비스 인터페이스, Stub, 프록시 클래스를 자동으로 생성할 수 있으며, 자바 서비스 프레임워크의 BinderProxy, Binder, Parcel 등의 구성요소가 JNI를 통해 네이티브 서비스 프레임워크의 구성 요소와 연결돼 있음

댓글