바인더 개요

바인더는 Android 기반 기기에서 두 프로세스가 통신할 수 있도록 하는 프로세스 간 통신 시스템입니다. 바인더는 호출자에게 완전히 투명한 다른 프로세스에서 함수 호출을 실행하는 수단을 제공합니다.

바인더 용어로 호출 프로세스는 클라이언트로 간주되고 엔드포인트는 바인더 프록시 또는 프록시라고 합니다. 반대로 호출되는 프로세스는 서버이고 엔드포인트는 바인더 노드 또는 노드라고 합니다.

각 노드는 자체 인터페이스를 노출하고 구현할 수 있습니다. 또한 프록시를 사용하여 클라이언트는 호출이 로컬 함수 호출인 것처럼 노드 인터페이스에서 메서드를 실행할 수 있습니다. 다음 예에서는 메서드가 호출되는 것을 보여줍니다.

int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object

foo()를 호출하는 클라이언트는 프로세스 A에서 실행되고 foo()를 구현하는 서버는 프로세스 B에서 실행된다고 가정합니다. 그림 1은 이 호출이 실행되는 방식을 보여줍니다.

바인더 호출 실행

그림 1. 바인더 호출 실행

그림 1과 같이 다른 프로세스에서 메서드를 실행하려면 다음이 발생합니다.

  1. 프로세스 A의 클라이언트 코드가 프로세스 A의 프록시 코드를 호출합니다. 프로세스 A의 프록시 코드는 다음 항목을 포함하는 트랜잭션을 만듭니다.
    • 노드의 식별자
    • 노드의 foo() 메서드 식별자
    • ab 인수의 복사본이 포함된 버퍼
  2. 트랜잭션이 바인더 커널 드라이버에 제출됩니다.
  3. 바인더 커널 드라이버는 프로세스 B가 노드를 호스팅한다고 판단합니다.
  4. 커널은 전체 트랜잭션을 프로세스 B의 주소 공간에 복사합니다.
  5. 커널은 트랜잭션을 처리할 프로세스 B의 스레드를 찾아 트랜잭션을 전달합니다.
  6. 스레드는 트랜잭션을 압축 해제하고 노드를 찾아 노드 객체에 트랜잭션을 전송합니다.
  7. 노드 객체는 트랜잭션에서 함수 식별자를 가져오고, 트랜잭션 버퍼에서 ab를 압축 해제하고, ab를 로컬 변수에 저장합니다.
  8. 노드 객체는 프로세스 B의 서버 코드에서 foo(a, b)를 호출합니다.
  9. 호출 결과는 응답 트랜잭션으로 반환되며, 이 트랜잭션은 커널 드라이버로 전달된 후 프로세스 A의 호출 프록시로 다시 전달됩니다.
  10. 프록시는 프로세스 A의 호출자에게 결과를 반환합니다.

바인더 사용 사례

바인더는 서로 다른 프로세스의 소프트웨어 간에 통신이 발생해야 하는 다양한 시나리오에서 사용할 수 있습니다. 예를 들면 다음과 같습니다.

  • 카메라 앱은 바인더를 사용하여 다른 프로세스의 카메라 서버와 통신합니다. 그러면 카메라 서버는 바인더를 사용하여 다른 프로세스의 카메라 HAL과 통신합니다.

  • 앱은 바인더를 사용하여 다른 프로세스의 시스템 서버와 통신합니다. 시스템 서버는 바인더를 사용하여 다른 프로세스의 HAL과 통신합니다.

  • 한 프로세스의 앱이 바인더를 사용하여 다른 프로세스의 다른 앱과 통신합니다.

  • 앱을 설치, 업데이트, 삭제하는 시스템 데몬 (installd)은 바인더를 사용하여 Android 런타임 데몬 ('artd')과 통신하여 앱을 컴파일합니다.