• 서비스?
    : UI 없이 주기적으로 특정한 일을 수행하는 백그라운드 프로세스

    - 서비스 분류


  • 안드로이드 애플리케이션 서비스
    : 안드로이드 SDK의 Service 클래스를 확장한 클래스의 인스턴스로 UI 없이 주기적으로 특정한 일을 수행하는 백그라운드 프로세스
    : 애플리케이션단에서 서비스 시작, 종료, 바인딩을 통한 서비스 원격 제어 가능
     

    - 애플리케이션 서비스 분류


  • 안드로이드 시스템 서비스
    : init 프로세스에 의해 안드로이드의 부팅 과정에서 미리 실행
    : getSystemService()를 이용해서 바로 이용 가능
    : Media Server, System Server 두 시스템 프로세스에 의해 실행

    - 시스템 서비스 분류


     ■ 네이티브 서비스

      : C++로 작성
      : 여러 안드로이드 애플리케이션의 오디오 데이터를 믹싱해서 오디오 출력 장치로 내보내는 역할, 안드로이드 장치에서 모든 오디오 데이터는 Audio Flinger를 거쳐 출력.
      : Surface Flinger는 다양한 애플리케이션에서 사용중인 Surface를 조합해 프레임 버퍼 장치로 렌더링해주는 서비스 


     ■ 자바 시스템 서비스
      : 안드로이드 부팅 시 SystemServer라는 시스템 프로세스에 의해 일괄적으로 실행
      : 안드로이드 애플리케이션과 직접 상호작용은 하지 않지만 안드로이드 프레임워크가 동작하는 데 필수적인 코어 플랫폼 서비스
      : 저수준 하드웨어 제어를 위한 API를 제공하는 하드웨어 서비스

    - Layer Interaction
     : There are 3 main flavors of Android layer cake
     1. App -> Runtime Service -> lib
      
     2. App -> Runtime Service -> Native Service -> lib
      
     3. App -> 
    Runtime Service -> Native Deamon -> lib
      

    - Media Server / System Server

      ■ Media Server
      
      ■ System Server
      
      ■ Context Manager
        : 서비스 관련 요청을 수행하기 위해서는 IPC 데이터를 수신 대기하는 상태에 들어 있어야 하기 때문에 다른 서비스 서버나 서비스 클리이언트 이전에 미리 실행돼야한다.
        : init.rc 내용을 살펴보면 서비스 서버인 미디어 서버 프로세스나 시스템 서버 프로세스가 실행되기 이전에 실행(servicemanager) 됨


      

  • 안드로이드 시스템 전체 요약
    - 용어 정리
      ■ 서비스 서버 : 시스템 서비스를 실행하는 프로세스로서 앞에서 설명한 시스템 서버나 미디어 서버
      ■ 서비스 클라이언트 : 시스템 서비스를 사용하는 프로세스
      ■ 컨텍스트 매니저 : 시스템 서비스를 관리하는 안드로이드 시스템 프로세스로서 시스템에 설치돼 있는 각종 시스템 서비스의 위치 정보인 핸들을 관리. 이러한 핸들은 바인더 IPC의 목적지 주소를 지정하는 데 사용한다.
      ■ 서비스 프레임워크 : 앞에서 언급한 서비스 매니저를 포함해서 서비스 사용자와 시스템 서비스간의 RPC 동작에 필요한 공통적인 클래스가 정의
      ■ 서비스 인터페이스 : 서비스 사용자와 시스템 서비스 간에 미리 정해진 인터페이스로서 시스템 서비스는 해당 인터페이스에 맞게 스텁 함수를 구현해서 해당 서비스를 제공해야 하고, 반대로 서비스 사용자 역시 해당 인터페이스에 맞게 서비스를 호출해야 한다.
      ■ 서비스 사용자 : 서비스 클라이언트 프로세스 내에서 실제 서비스를 이용하는 모듈이다.
      ■ 서비스 : 서비스 인터페이스에 정의된 기능을 서비스 스텁 함수로 구현해서 실제 서비스의 기능을 제공하는 모듈을 의미한다.
      ■ 서비스 프록시 : RPC 수행 시 데이터 마샬링을 수행하는 객체이며 서비스 인터페이스별로 존재한다. 서비스 인터페이스에 정의된 함수별로 각각 데이터 마샬링을 수행하는 서비스 프록시 함수를 제공한다.
      ■ 서비스 스텁 : RPC 수행 시 데이터 언먀실링을 수행하는 객체이며, 이 객체 역시 서비스 인터페이스별로 존재한다. 수신된 데이터를 언마샬링해서 연관된 서비스 스텁 함수를 호출한다.
      ■ 바인더 드라이버 : 바인더는 안드로이드에서 IPC를 지원하는 데 사용되는 메커니즘으로 안드로이드 리눅스 커널의 디바이스 드라이버 형태로 포함돼 있다.
      ■ 바인더 IPC : 안드로이드에서 바인더 드라이버를 통한 프로세스간의 데이터 전달 방식을 말한다.
      ■ 바인더 IPC 데이터 : 서비스 프레임워크와 바인더 드라이버 사이에 사용되는 데이터 포맷
      ■ 바인더 RPC : 서비스 사용자가 서비스에서 제공하는 특정 서비스 인터페이스 기반의 함수를 마치 자신의 로컬 함수 호출하듯이 원격으로 처리하는 동작을 말한다. 바인더 RPC는 내부적으로는 바인더 IPC 메커니즘 기반으로 동작한다.
      ■ 바인더 RPC 데이터 : 서비스 사용자와 서비스 간의 바인더 RPC를 수행하는 데 사용되는 데이터

    - 서비스 동작 구조



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




'Programing > Android' 카테고리의 다른 글

안드로이드 - 네이티브 서비스 프레임워크  (0) 2016.01.13
안드로이드 - 바인더  (0) 2016.01.08
안드로이드 - Zygote  (0) 2016.01.06
안드로이드 - JNI  (0) 2015.12.23
안드로이드 - Init 프로세스  (0) 2015.12.21

+ Recent posts