본문 바로가기
Android

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

by OKOK 2021. 5. 18.

시스템 내부에서 서비스가 동작하는 메커니즘과 서비스 작성 방법에 있어 차이점 있음

 

10.1 자버 서비스 프레임워크

자바 시스템 서비스는 컨텍스트 매니저에 서비스를 등록한 후 서비스 매니저를 통해 서비스를 사용할 수 있음. 자바 앱 서비스는 컨텍스트 매니저가 아닌 액티비티 매니저 서비스에서 관리함

 

10.1.1 자바 서비스 프레임워크의 계층별 요소

앱 개발자들이 사용할 수 있게끔 시스템 서비스 개발자는 FooManager 래퍼 클래스를 만들고, ServiceManager를 사용해  FooService를 획득하여 반환하는 기능을 추가하여 SDK에 포함하면 됨. 자바 서비스 프레임워크를 이용해 개발한 서비스와 서비스 프록시가 상호작용 할 때도 바인더 IPC를 이용함. 바인더 IPC를 위해 네이티브 서비스 프레임워크에서는 BpBinder, BBinder 클래스를 제공하지만, 자바 서비스 프레임워크에서는 BinderProxy와 Binder 클래스가 이용됨. 일반적으로 Binder 클래스의 init()의 경우에 android.os 패키지에 포함되어 있으므로 android.os.Binder를 android_os_binder으로 변경한 후 init()을 붙여서 android.os.Binder_init()으로 JNI 네이티브 함수 이름을 작명함.

 

10.2.3 BinderProxy

BinderPorxy 클래스를 사용하려면 달빅 가상 머신에 BinderProxy의 네이티브 메서드를 위한 JNI네이티브 함수를 먼저 등록해줘야 함

 

10.2.4 Parcel

바인더 IPC가 진행되는 동안 송신측에서 수신 측으로 전달되는 데이터를 저장하는 데 사용함. Parcel은 내부 버퍼 안에 IBiner 객체 레퍼런스를 가지고 있어 프로세스를 가로질러 이동할 때도 레퍼런스 값을 유지해야 함. @hid 주석 표시가 있는 클래스와 메서드는 안드로이드 시스템 빌드 시 SDK에 포함되지 않음. 자바 서비스 스텁과 네이티브 서비스 스텁의 차이점은 asInterface(), asBinder() 형 변환 메서드가 모두 서비스 스텁에 포함돼 있다는 점임.

 

안드로이드 시스템에서 앱을 실행하면 일반적으로 새로운 프로세스가 생성됨. 새롭게 생성된 프로세스에서 서비스 이용 요청이 있으면, SErviceManager를 이용해 컨텍스트 매니저에게 필요한 서비스를 검색해 달라고 요청함. 이는 ActivityManagerService 시스템 서비스를 이용하려면 모든 프로세스가 생성될 때마다 반복적으로 ActivityManagerService의 서비스 사용자를 ServiceManager를 통해 검색해야 한다는 것을 의미함. 그러나 ActivityManagerServie 서비스는 항상 system_server 프로세스에서 동작하기 때문에 서비스 사용자가 하나만 있어도 이것을 각 프로세스에서 공유해서 사용하면 됨. 시스템에 동작하는 동안에 요청된 서비스 리스트를 캐시에 저장하고 있다가 새로운 프로세스가 생성될 때 이 리스트를 넘겨주기만 하면 ActivityManagerService를 이용하기 위해 매번 ServiceManager에 서비스 요청하지 않아도 됨. initServiceCahe() 메서드가 안드로이드 플랫폼에서 사용되고 있는 곳은 ActivityThread 클래스의 bindApplication() 메서드 내부이며, 여기서 initServiceCache() 메서드의 인자에 서비스 리스트를 넘겨줘 ServiceManager의 캐시에 저장함. 

 

getService() 메서드 호출을 의미하는 GET_SERVICE_TRANSACTION 트랜잭션 RPC 코드와 앞에서 생성한 Parcel 객체를 BinderProxy의 tracsact() 메서드로 인자로 넘긴다. 그러면 바인더 IPC를 통해 RPC 데이터가 컨텍스트 매니저에게 전달되어 해당 서비스를 바인더 객체로 반환함. 

댓글