Binder — это система для межпроцессного взаимодействия, позволяющая двум процессам на устройстве под управлением Android обмениваться данными. Binder предоставляет средства для выполнения вызовов функций в другом процессе, которые полностью прозрачны для вызывающей стороны.
В терминологии Binder вызывающий процесс считается клиентом , а его конечная точка называется прокси-сервером Binder или просто прокси . И наоборот, вызываемый процесс является сервером , а его конечная точка называется узлом Binder или просто узлом .
Каждый узел может предоставлять и реализовывать собственный интерфейс. Используя прокси, клиент может выполнять методы интерфейса узла так, как если бы это был вызов локальной функции. Следующий пример демонстрирует вызов метода:
int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object
Предположим, что клиент, вызывающий функцию foo() , работает в процессе A, а сервер, реализующий функцию foo() , работает в процессе B. На рисунке 1 показано, как выполняется этот вызов:

Рисунок 1. Выполнение вызова Binder.
Для выполнения метода в другом процессе, как показано на рисунке 1, происходит следующее:
- Клиентский код в процессе A вызывает прокси-код в процессе A. Прокси-код в процессе A создает транзакцию, содержащую следующие элементы:
- Идентификатор узла
- Идентификатор метода
foo()узла - Буфер, содержащий копию аргументов
aиb
- Транзакция передается драйверу ядра binder.
- Драйвер ядра binder определяет, что процесс B является хостом узла.
- Ядро копирует всю транзакцию в адресное пространство процесса B.
- Ядро находит поток в процессе B, который может обработать транзакцию, и передает ему транзакцию.
- Поток распаковывает транзакцию, находит узел и отправляет транзакцию объекту узла.
- Объект узла получает идентификатор функции из транзакции, извлекает
aиbиз буфера транзакции и сохраняетaиbв локальных переменных. - В процессе B объект узла вызывает функцию
foo(a, b)в серверном коде. - Результат вызова возвращается в ответной транзакции, которая передается драйверу ядра, а затем обратно вызывающему прокси-серверу в процессе A.
- Прокси-объект возвращает этот результат вызывающей стороне в процессе A.
Варианты использования Binder
Binder можно использовать в самых разных сценариях, где необходимо обеспечить взаимодействие между программным обеспечением в различных процессах. Например:
Приложение камеры использует Binder для связи с сервером камеры в другом процессе. Затем сервер камеры использует Binder для связи с HAL камеры в другом процессе.
Приложение использует Binder для связи с системным сервером в другом процессе. Системный сервер использует Binder для взаимодействия с HAL в других процессах.
Приложение в одном процессе использует Binder для связи с другим приложением в другом процессе.
Системный демон, отвечающий за установку, обновление и удаление приложений (
installd), использует binder для связи с демоном среды выполнения Android ('artd') для компиляции приложений.
AIDL и переплетчик
Используйте язык проектирования интерфейсов Android (AIDL) для определения программных интерфейсов, использующих binder для межпроцессного взаимодействия. Для получения дополнительной информации см. обзор AIDL .