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