Обзор брошюратора

Binder – это система межпроцессного взаимодействия, которая позволяет двум процессам на устройстве Android обмениваться данными. Binder позволяет выполнять вызовы функций в другом процессе, и это полностью прозрачно для вызывающего процесса.

В терминологии Binder вызывающий процесс считается клиентом, а его конечная точка называется прокси-сервером Binder или прокси-сервером. И наоборот, процесс, который вызывается, – это сервер, а его конечная точка называется узлом связывания или узлом.

Каждый узел может предоставлять и реализовывать собственный интерфейс. Используя прокси, клиент может выполнять методы в интерфейсе узла так, как если бы вызов был локальным вызовом функции. В следующем примере показан вызов метода:

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

Предположим, что клиент, вызывающий foo(), работает в процессе A, а сервер, реализующий foo(), – в процессе Б. На рисунке 1 показано, как выполняется этот вызов:

Выполнение вызова Binder.

Рисунок 1. Выполнение вызова Binder.

Чтобы выполнить метод в другом процессе, как показано на рисунке 1, происходит следующее:

  1. Клиентский код в процессе A вызывает код прокси в процессе A. Прокси-код в процессе А создает транзакцию, содержащую следующие элементы:
    • Идентификатор узла.
    • Идентификатор метода foo() на узле.
    • Буфер, содержащий копию аргументов a и b.
  2. Транзакция отправляется в драйвер ядра Binder.
  3. Драйвер ядра Binder определяет, что узел размещен в процессе B.
  4. Ядро копирует всю транзакцию в адресное пространство процесса B.
  5. Ядро находит поток в процессе B для обработки транзакции и передает ему транзакцию.
  6. Поток распаковывает транзакцию, находит узел и отправляет транзакцию объекту узла.
  7. Объект узла получает идентификатор функции из транзакции, распаковывает a и b из буфера транзакции и сохраняет a и b в локальных переменных.
  8. Объект узла вызывает foo(a, b) в коде сервера в процессе B.
  9. Результат вызова возвращается в транзакции ответа, которая передается драйверу ядра, а затем обратно вызывающему прокси в процессе А.
  10. Прокси-сервер возвращает этот результат вызывающей стороне в процессе A.

Примеры использования Binder

Binder можно использовать в различных сценариях, когда необходимо обеспечить связь между программным обеспечением в разных процессах. Пример:

  • Приложение камеры использует binder для связи с сервером камеры в другом процессе. Затем сервер камеры использует Binder для связи с HAL камеры в другом процессе.

  • Приложение использует Binder для связи с системным сервером в другом процессе. Системный сервер использует Binder для связи с HAL в других процессах.

  • Приложение в одном процессе использует Binder для связи с другим приложением в другом процессе.

  • Системный демон, отвечающий за установку, обновление и удаление приложений (installd), использует binder для связи с демоном среды выполнения Android (artd), чтобы компилировать приложения.

AIDL и binder

Используйте язык описания интерфейсов Android (AIDL), чтобы определять программные интерфейсы, которые используют связыватель для межпроцессного взаимодействия. Дополнительную информацию можно найти в обзоре AIDL.