본문 바로가기
Android

안드로이드 프레임워크

by OKOK 2021. 5. 3.

안드로이드 서비스 프레임워크 
- 자바 서비스 프레임워크

- 네이티브 서비스 프레임 워크

 

4자지 핵심 기능은 동일하나 시스템 내부에서 서비스가 동작하는 메커니즘이나서비스 작성 방법에 차이점이 있음.

 

서비스 생성의 경우, Binder클래스를 상속받아 개발하는 방식, Service 클래스를 상속받아 개발하는 방식의 차이가 있습니다. 그리고 바인더 IPC처리의 경우, 자바 서비스 프레임워크에서는 바인더 IPC를 지원하기 위해 JNI를 통해 연결된 네이티브 서비스 프레임워크의 구성요소를 재사용합니다.

 

자바 서비스 프레임워크의 계층별 구조

1. 서비스 레이어 : 시스템 서비스 개발자는 애플리케이션 개발자가 시스템 서비스를 이용할 수 있게 SDK에 래퍼 클래스를 포함시켜야 한다.

2. RPC 레이어 : 자바 서비스 프레임워크는 안드로이드 플랫폼에 포함된 AIDL언어와 컴파일러를 이용해 서비스 프록시와 서비스스텁을 자동으로 생성한다. 

3. IPC 레이어 : 자바 서비스 프레임워크를 이용해 개발한 서비스와 서비스 프록시가 상호작용 할 때도 바인더 IPC를 이용한다. 바인더 IPC를 위해 네이티브 서비스 프레임워크에서는 BpBinder와 BBinder 클래스를 제공하지만, 자바 서비스 프레임워크에서는 BinderPoroxy와 Binder 클래스가 이용된다. 자바 서비스 프레임워크에서는 JNI를 통해 네이티브 서비스 프레임워크의 바인더 IPC를 재사용 한다.

 

자바 서비스 프레임 워크의 클래스별 상호작용
자바 서비스 프레임워크는 바인더 RPC를 지원하기 위해 JNI를 통해 네이티브 서비스 프레임워크의 기능을 재사용하므로 서비스 클라이언트와 서비스 서버 내부의 구성요소 간에 수직 방향으로 이뤄지는 상호작용 역시 두 프레임워크 사이에 차이점이 있다.

 

1. 서비스 등록 요청(서비스)
네이티브 서비스 프레임워크에서 서비스를 시스템에 등록할 때는 네이티브 서비스 매니저인 BpServiceManager를 통해 서비스 등록 과정을 처리헀지만 자바 서비스 프레임워크는 자바 서비스 매니저인 ServiceManager를 이용해 처리한다.

2. 서비스 등록(서비스 매니저)

ServiceManagerProxy 서비스 프록시는 addService() 메서드 호출 정보를 RPC 데이터로 변환한다.

3. 서비스 검색 요청(서비스 사용자)
자바 서비스 사용자는 SDK에서 제공하는 getSystemService()메서드를 호출해서 서비스를 검색한다.

4. 서비스 검색(서비스 매니저) 
getSystemService()는 ServiceManager의 getService()메서드를 호출해서 시스템에서 FooService서비스를 검색한다. 

5. foo() 서비스 프록시 메서드 호출(서비스 사용자) 
서비스 사용자는 FooManage의 foo()메서드를 호출한다.

6. foo() 서비스 스텁 메서드 실행(서비스)
BBinder는 바인더 드라이버로부터 바인더 RPC데이터를 전달받아 JavaBBinder를 통해 Binder의 exexTransact() 메서드를 호출한다.

 

동작 메커니즘

각 클래스의 생성 과정과 JNI 네이티브 함수 설정을 바탕으로 자바 서비스 프레임워크가 네이티브 서비스 프레임워크를 재사용하는 매커니즘을 이해할 수 있다.

 

자바 서비스 프레임워크 초기화

app_process 프로세스가 실행되면 AndroidRuntime 클래스에서 starReg()함수를 호출해서 JNI 네이티브 함수를 달빅 가상 머신으로 로딩한다. 

 

자바 시스템 서비스 구현

개발자가 안드로이드 플랫폼에서 동작하는 자바 시스템 서비스를 개발하려면 기존 자바 시스템 서비스의 프로그램 구조를 파악하는 것이 가장 효과적이다. 

 

알람 매니저 서비스의 구조 분석

상단에는 자바 서비스 프레임워크의 구성요소인 IInterface와 Binder클래스가 위치하며, IAlarmManger 서비스 인터페이스와 서비스 스텁에서 이 클래스를 상속하고 있다. 다음으로 AIDL을 통해 자동으로 생성된 서비스 스텁 클래스와 서비스 프록시 클래스가 위치한다. 마지막으로 그림 하단에는 실질적인 알람 매니저 서비스를 구현하는 AlarmManagerService클래스와 AlarmManger래퍼 클래스가 있다. 

 

1. 알람 매니저 서비스 구현 방식 네이티브 시스템 서비스를 구현하려면 서비스 인터페이스, 서비스 프록시, 서비스 스텁, 서비스를 개발자가 모두 구현해야 하지만 자바 시스템 서비스를 구현할 때는 AIDL을 이용해 자동으로 생성할 수 있따.

2. 알람 매니저 서비스 사용 애플리케이션 개발자가 시스템 서비스를 사용하려면 SDK의 getSystemService()메소드를 이용해야 한다.

 

 

hyunaqueen.github.io/android/framework/9-post/

댓글