본문 바로가기
Android

인사이드 안드로이드 06 서비스 개요

by OKOK 2021. 5. 15.

안드로이드 서비스 개요

서비스는 UI 없이 주기적으로 특정한 일을 수행하는 백그라운드 프로세스를 가리킴

사용자와 상호작용 없이 다양한 데이터를 백그라운드에서 처리하는 앱을 작성할 때 이러한 안드로이드 앱 서비스가 활용됨

 

6.1 안드로이드 서비스 동작 이해

API Demos의 AlarmService라는 샘플 예제를 통해 앱이 시스템 서비스와 앱 서비스가 어떻게 활용되는지 알아봄

 

6.3 안드로이드 앱 서비스

안드로이드 SDK의 Service 클래스를 확장한 클래스의 인스턴스로 UI없이 주기적으로 특정한 일을 수행하는 백그라운드 프로세스를 가리킴. 이러한 서비스는 액티비티나 브로드캐스트 리시버처럼 안드로이드 앱 컴포넌트의 일종임. 미디어 플레이어에서 음악을 실행하면 백그라운드로 음악 서비스를 시작시켜 음악을 재생하도록 프로그램을 설계해야 함. 다른 앱을 사용 중에 서비스를 원격 제어할 수 있게 서비스에 연결하는 것을 바인딩이라고 함. 서비스는 안드로이드 앱 컴포넌트 이므로 생명주기를 가짐. 

 

startService()나 bindService()로 시작된 서비스 모두 onCreate()와 onDestroy() 콜백 메서드가 호출됨. 인텐트에는 주로 실행할 서비스에 대한 정보가 포함됨. 인텐트로부터 넘어온 인자가 있다면 이를 처리하거나 실질적인 백그라운드 작업을 처리하는 스레드를 실행함. bindService()에 의해 시작된 서비스에는 onBinde()는 클라이언트가 서비스에 바인딩하려고 할 때 호출됨. 서비스의 onBinde() 콜백에서는 바인딩할 클라이언트를 위해 서비스와 연결 가능한 객체를 제공함. 따라서 바인딩이 끝나면 클라이언트는 이 객체를 통해 서비스를 원격에서 제어할 수 있음.

 

로컬 서비스와 달리 리모트 서비스는 자신을 생성한 액티비티와는 별개의 독립적인 프로세스 위에서 동작함. 잘못 구현된 리모트 서비스는 프로그램이 종료하더라도 시스템 자원을 비효율적으로 소모할 수 있기 때문에 설계에 신중을 기해야 함. 리모트 서비스 바인딩은 이런 바인더 IPC를 수행하기 위한 연결 설정을 의미함. 바인더 IPC 통신에서 서비스와 액티비티 사이에 데이터를 주고 받을 때 마샬링/언마샬링 과정 이를 위해 AIDL 안드로이드 인터페이스 정의 언어를 사용함. 

 

로컬 서비스 바인딩을 위한 액티비티와 서비스 동작 과정

1. LocalService 연결 요청

2. 서비스와 통신하기 위한 LocalBinder 객체 반환

3. LocalBinder 객체의 getService()를 호출 -> LocalService 객체의 레퍼런스 반환 

4. LocalSREvice 객체 연결

 

getPid() 실제 코드는 RemoteService 개발자가 직접 구현해야 함

리모트 서비스의 바인딩 과정

액티비티(Processe A), 리모트 서비스(Process B) 

1. RemoteService 연결 요청

2. Binder 객체 요청

3. Binder 객체 요청 서비스 프록시 객체 생성

4. getPid() 프록시 함수 호출

5. 바인더 IPC 데이터 (TRANSACITON_getPid 트랜잭션 코드) 

6. getPid() 스텁메서드 호출

 

실제 코드를 찾아볼 것인가. 여기에서 먼저 예제로 파악할 것인가. 예제 코드에서 흐름을 먼저 파악하고 실전에 찾는 것이 효율적이고 이해도가 빠를 것 같음. 기본적인 데모 앱을 실제 사용할 수 있도록 확인할 것.

 

6.4 안드로이드 시스템 서비스

코어 플랫폼 서비스

Activity Manager Service : 모든 액티비티에 대한 라이프 사이클 및 액티비티 스택 관리

하드웨어 서비스 

저수준 하드웨어 제어를 위한 API를 제공하는 서비스를 말함. 

Telephony Service : 전화기의 상태나 전화 서비스에 대한 정보를 제공함

안드로이드 앱에서 Location Manager를 이용해 Location Service에 접근하기 : getSystemService() 함수를 사용 Location Service에 대한 Local Manager 객체인 Location Manager 인스턴스를 생성함. 그런 다음 앱은 Location Manager를 이용해 Location Service에서 제공하는 다양한 함수 실행 가능함. 

 

6.5 시스템 서비스의 실행

시스템 서비스는 앱서비스와 달리 서비스를 직접 실행할 필요가 없이 getSystemService()를 이용해서 바로 이용가능 함. 시스템 서비스는 앞에서 언급한 init 프로세스에 의해 안드로이드 부팅 과정에서 미리 실행됨.

시스템 서비스는 프레임워크 내에서 다른 모듈과 통신할 떄 바인더 IPC를 사용함. 다음 장에서 바인더 IPC를 설명할 때 언급하겠지만 시스템 서비스와 같은 서비스 제공자는 안드로이드의 일반 앱과 같은 서비스 이용자가 자신의 서비스를 이용할 수 있게 해당 서비스 제공자의 정보를 컨텍스트 매니저에 등록해야 함

시스템 서버는 자바 프로세스이므로 Zygote로부터 생성됨.

 

6.6 안드로이드 서비스 프레임워크와 바인더 드라이버 개요 및 용어 정리

안드로이드 시스템 서비스의 작동 원리에 초점. 안드로이드 시스템 서비스의 작동 원리를 파악하기 위한 개념(바인더 드라이버와 서비스 프레임워크)과 실제 시스템 서비스(카메라 서비스, 액티비티 매니저 서비스)를 예로 들어 설명할 것임.

서비스 서버 : 시스템 서비스를 실행하는 프로세스로서 앞에서 설명한 시스템 서버나 미디어 서버가 여기에 해당함

서비스 클라이언트 : 시스템 서비스를 사용하는 프로세스

컨텍스트 매니저 : 시스템 서비스를 관리하는 안드로이드 시스템 프로세스로서 시스템에 설치 돼 있는 각종 시스템 서비스의 위치 정보인 핸들을 관리함. 이러한 핸들은 바인더 IPC의 목적지 주소를 지정하는 데 사용됨.

서비스 프레임워크 : 서비스 매니저를 포함해서 서비스 사용자와 시스템 서비스 간의 RPC 동작에 필요한 공통적인 클래스가 정의돼 있음 

서비스 인터페이스 : 서비스 사용자와 시스템 서비스 간에 미리 정해진 인터페이스로서 시스템 서비스는 해당 인터페이스에 맞게 스텁 함수를 구현해서 해당 서비스를 제공해야 하고, 반대로 서비스 사용자 역시 해당 인터페이스에 맞게 서비스를 호출해야 함.

서비스 사용자 : 서비스 클라이언트 프로세스 내에서 실제 서비스를 이용하는 모듈

서비스 : 서비스 인터페이스에 정의된 기능을 서비스 스텁ㅈ 함수로 구현해서 실제 서비스의 기능을 제공하는 모듈을 의미함

서비스 프록시 : RPC 수행 시 데이터 마샬링을 수행하는 객체이며 서비스 인터페이스별로 존재함. 서비스 인터페이스에 정의된 함수별로 각각 데이터 마샬링을 수행하는 서비스 프록시 함수를 제공함

서비스 스텁 : RPC 수행 시 데이터 언마샬링을 수행하는 객체이며, 이 객체 역시 서비스 인터페이스별로 존재함. 수신된 데이터를 언마샬링 해서 연관된 서비스 스텁 함수를 호출함

바인더 드라이버 : 바인더는 안드로이드에서 IPC를 지원하는 데 사용되는 메커니즘으로 안드로이드 리눅스 커널의 디바이스 드라이버 형태로 포함돼 있음

바인더 IPC : 안드로이드에서 바인더 드라이버를 통한 프로세스 간의 데이터 전달 방식을 말함

바인더 IPC 데이터 : 서비스 프레임워크와 바인더 드라이버 사이에 사용되는 데이터 포맷

바인더 RPC : 서비스 사용자가 서비스에서 제공하는 특정 서비스 인터페이스 기반의 함수 

 

서비스 사용자는 foo() 프록시 함수를 호출하여 Foo 서비스를 이용하기 위한 인자로 구성된 바인더 RPC 데이터를 전달함. 바인더 RPC 데이터는 마샬링을 거쳐 서비스 프레임워크를 통해 바인더 IPC 데이터로 생성된 다음, 바인더 드라이버를 통해 서비스 서버 측에 전송됨. 서비스 서버 측에서 수신된 바인더 IPC 데이터는 서비스 프레임워크를 거치면서 언마샬링된 다음 ,서비스 스텁의 onTranact() 함수에 전송됨. 마지막으로 서비스 스텁은 해당 바인더 IPC 데이터 안에 포함된 RPC 코드를 통해 Foo 서비스의 foo() 서비스 스텁 함수에 대한 바인더 RPC임을 판단함. 수신된 바인더 IPC 데이터에 포함된 바인더 RPC 데이터를 인자로 해서 Foo() 서비스 스텁 함수를 호출함. 

댓글