Android/Android 기초

[Android] 안드로이드의 바인더(IPC)란?

태크민 2025. 2. 25. 18:16

바인더

Android System 디자인의 가장 큰 특징 중 하나는 모든 앱은 서로 다른 앱의 컴포넌트를 실행시킬 수 있다는 것이며 그래서 각 컴포넌트들은 모두 각 앱의 진입점(EntryPoint)이 될 수 있다는 것입니다. 따라서 안드로이드에서는 컴포넌트 간 통신시 Intent를 자주 사용하게 됩니다.

 

안드로이드 플랫폼은 리눅스 커널 영역을 기반으로 하며, 카메라를 사용하거나 소리를 출력 및 조절하는 등의 기능을 이용하려면, 시스템 콜을 통해 커널에 요청을 해야 합니다

안드로이드에서는 모든 시스템 서비스가 서버 프로세스 형태로 제공되기 때문에, 다른 프로세스와의 요청 및 응답을 위해 메시지 패싱 기법을 활용한 IPC 방식이 필요합니다.

 

안드로이드에서 이런 IPC 메커니즘을 담당하는 것이 바로 Binder입니다. Binder는 원래 IPC 도구이지만 안드로이드에서는 다른 프로세스에 있는 함수를 마치 현재 프로세스에 존재하는 함수처럼 사용할 수 있게 해주는 RPC(Remote Procedure Call)를 지원하는 데 주로 이용됩니다.

 


리눅스 메모리 공간과 바인더 드라이버

바인더 이해에 앞서 안드로이드 기반 커널인 리눅스 커널의 메모리 공간을 이해해야합니다.

안드로이드의 프로세스는 리눅스와 마찬가지로 프로세스만의 고유한 가상 주소 공간 에서 실행이 됩니다.

가상 주소 공간은 사용자 공간  커널 공간 으로 나뉩니다.

 

 

 

프로세스는 각자 독립된 주소 공간을 가지고 별개로 동작합니다. 하지만 프로세스가 다른 프로세스에게 데이터를 전달할 때는, 프로세스 간 공유가 가능한 커널 공간을 이용하게 됩니다.

 

예를들어, 안드로이드를 탑재한 휴대폰에서 카메라로 찍은 사진을 화면에 보여주는 경우, 커널 공간을 통해 카메라를 동작시키는 프로세스가 화면 출력 프로세스에게 화면 출력 요청 메시지를 전달하게 됩니다. 

즉, 두 프로세스 사이의 메시지를 주고 받는 IPC를 수행하는 것이지요.

 

바인더는 프로세스들이 사용자 공간을 공유하지 않는다는 제약 조건상에서 프로세스 간 통신을 제공하기 위해 커널 공간에서 동작하는 Binder(IPC) Driver(바인더 드라이버) 라는 추상화 된 드라이버를 이용합니다.

 

안드로이드에서 바인더 드라이버를 추가해서 프로세스 간 통신을 수행하는 이유

  • 바인더는 리눅스의 뛰어난 메모리 관리 기법을 그대로 채용함으로써 커널 공간을 통한 데이터 전달 시 데이터의 신뢰성 확보 가능.
  • 사용자 공간에서 접근할 수 없는 공간인 커널 공간을 이용해 데이터를 주고 받기 떄문에 IPC 간의 보안 문제 해결.

안드로이드 바인더 모델

서비스 클라이언트가 바인더를 통해 서비스 서버의 foo() 함수를 호출하는 과정으로부터 바인더 드라이버의 역할을 확인해 보면,

 

  • 서비스 클라이언트는 바인더 IPC를 통해 서비스 서버의 foo() 함수를 호출하는 것과 같은 효과를 내기 위해 바인더 IPC 데이터(혹은 IPC 데이터)를 서비스 서버로 전달.
  • 바인더 드라이버  foo() 함수를 호출하기 위한 바인더 IPC 데이터를 서비스 클라이언트에서 서비스 서버로 전달하는 역할. 즉, 프로세스 간 통신의 중재자 역할.
  • 바인더 IPC 데이터는 상대편 프로세스의 함수 호출 정보들. 바인더 드라이버가 수행하는 IPC의 데이터 단위.

 

IPC 데이터 는 사용하고자 하는 서비스에 해당하는 번호와 호출할 함수명, 바인더 프로토콜(BINDER PROTOCOL)로 구성. 이러한 구성 요소는 IPC 데이터의 각 변수로 저장,

  • 서비스 번호 : 안드로이드에서 동작 중인 여러 서비스를 구분하기 위한 것.
  • 함수명 : 서비스 서버에서 동작하는 여러 서비스 가운데 서비스 클라이언트가 호출할 함수를 찾기 위한 것.
  • 바인더 프로토콜 : 바인더 드라이버와 바인더를 이용하는 프로세스 간의 IPC 데이터를 처리하는 규약.


IPC 데이터의 포맷

 

 

  • 핸들: 서비스를 구별하는 번호로, 바인더 드라이버에서 이 값을 통해 어떤 서비스에 바인더 IPC 데이터를 전달해야 하는지 결정.
  • RPC 코드: 서비스의 포함된 함수 중 어느 함수에 데이터를 전달해야 하는지 나타냄.
  • RPC 데이터: RPC 코드가 가리키는 함수에 전달할 인자 값.
  • 바인더 프로토콜: IPC 데이터의 처리 방법.


바인더 IPC 데이터의 흐름

서비스 클라이언트에서 서비스 서버에 존재하는 서비스의 함수를 호출하는 과정을 보여주는 그림은 아래와 같습니다.

 

  • 서비스 클라이언트에서 서비스 서버의 foo() 함수를 호출하기 위해 RPC를 시도함. 하위 계층에서 제공하는 동작을 통해 서비스 계층에서 RPC 수행.
  • 서비스 계층 아래에 있는 계층에서는 서비스 계층의 RPC를 지원하기 위한 바인더 IPC 데이터 생성.
  • 서비스 계층: 특정 기능을 수행하는 서비스의 함수가 존재하는 계층. 서비스 클라이언트는 이 계층에서 사용하고자 하는 서비스의 함수를 가상으로 호출하고, 서비스 서버는 서비스 클라이언트가 요청한 서비스의 함수를 실제로 호출.
  • RPC 계층: 서비스 클라이언트는 이 계층에서 서비스의 함수를 호출하기 위한 RPC 코드와 RPC 데이터 생성. 서비스 서버는 전달받은 RPC 코드를 토대로 함수를 찾고 RPC 데이터 전달.
  • IPC 계층: RPC 계층에서 만든 RPC 코드와 RPC 데이터를 바인더 드라이버에 전달하기 위한 바인더 IPC 데이터로 캡슐화. 
  • 바인더 드라이버 계층: IPC 계층으로부터 전달받은 바인더 IPC 데이터를 통해 서비스를 가진 서버를 찾은 후 IPC 데이터를 전달. 이 때, 서버로의 데이터 전달 여부는 바인더 IPC 데이터의 바인더 프로토콜을 파악하여 결정.


 RPC 코드와 RPC 데이터

바인더를 통해 상대방의 함수를 호출할 때, 상대방의 함수 이름과 전달 될 인자를 전달해야 합니다.

서비스 클라이언트는 서비스 서버에 존재하는 서비스의 함수를 사용하기 위해 각 함수에 해당하는 식별자를 바인더 IPC 데이터에 담아 전달하며, 이를 RPC 코드라고합니다. 함수의 인자 역시 IPC 데이터에 담아 전달되며, 이를 RPC 데이터라고 합니다.

서비스 서버가 가진 서비스의 함수를 호출하려면 서비스 클라이언트에서는 반드시 서비스 서버가 가진 RPC 코드를 알아야 합니다.

 


바인더 어드레싱

안드로이드에는 다양한 서비스를 모두 목록화해서 관리하는 컨텍스트 매니저(Context Manager) 라는 프로세스가 있는데, 이는 서비스마다 핸들(바인더 IPC의 목적지 주소로 사용)이라는 번호 값을 할당하고, 서비스의 추가/검색 등의 관리 기능을 수행합니다.  컨텍스트 매니저의 핸들값은 0으로 이미 지정되어 있습니다.

바인더 드라이버는 IPC 데이터의 핸들을 가지고 서비스 서버를 찾는데, 이러한 과정을 바인더 어드레싱(Binder Addressing) 이라고 합니다.

 

바인더 어드레싱을 위해서 먼저, 서비스 서버는 자신이 가진 서비스에 대한 접근 정보를 컨텍스트 매니저에 등록하며,

서비스 서버가 ADD_SERVICE 라는 RPC 코드와 등록할 서비스 이름(RPC 데이터), 핸들을 0으로 지정한 IPC 데이터를 바인더 드라이버에게 전달합니다.


참고자료

https://noobcodeing.tistory.com/49

 

Android RPC, Binder IPC

Android RPC, Binder IPC RPC RPC에 대해서는 이전 글에서 다루었습니다. IPC가 무엇이고 왜 필요한지에 대해서도 알아보았습니다. 이제 Android에서 IPC가 어떻게 이루어지는지 알아보기 위해, 우선적으로

noobcodeing.tistory.com

https://ddageung2.github.io/study/9th-post/

 

07 안드로이드 바인더 IPC (1)

스터디 6주차 / 7.1 ~ 7.2

ddageung2.github.io

https://dev-ahn.tistory.com/89

 

안드로이드 - 바인더

바인더? : 원래 IPC(Inter Process Communication) 도구이지만 안드로이드에서는 다른 프로세스에 있는 함수를 마치 현재 프로세스에 존재하는 함수처럼 사용할 수 있게 해주는 RPC(Remote Procedure Call)를 지

dev-ahn.tistory.com