Binder to system komunikacji międzyprocesowej, który umożliwia komunikację między dwoma procesami na urządzeniu z Androidem. Binder umożliwia wykonywanie wywołań funkcji w innym procesie, co jest całkowicie niewidoczne dla wywołującego.
W terminologii bindera proces wywołania jest uważany za klienta, a jego punkt końcowy jest nazywany proxy bindera lub proxy. Z kolei wywoływany proces to serwer, a jego punkt końcowy to węzeł bindera lub węzeł.
Każdy węzeł może udostępniać i implementować własny interfejs. Za pomocą serwera proxy klient może wykonywać metody w interfejsie węzła tak, jakby wywołanie było lokalnym wywołaniem funkcji. Poniższy przykład pokazuje wywołanie metody:
int result = someNodeInterface.foo(a, b); // someNodeInterface is a proxy object
Załóżmy, że klient wywołujący foo()
działa w procesie A, a serwer implementujący foo()
działa w procesie B. Na rysunku 1 pokazano, jak to wywołanie jest wykonywane:
Rysunek 1. Wykonywanie wywołania Binder.
Aby wykonać metodę w innym procesie, jak pokazano na rysunku 1, wykonaj te czynności:
- Kod klienta w procesie A wywołuje kod proxy w procesie A. Kod serwera proxy w procesie A tworzy transakcję zawierającą te elementy:
- Identyfikator węzła.
- Identyfikator metody
foo()
na węźle. - Bufor zawierający kopię argumentów
a
ib
- Transakcja jest przesyłana do sterownika jądra bindera.
- Sterownik jądra Binder stwierdza, że proces B hostuje węzeł.
- Jądro kopiuje całą transakcję do przestrzeni adresowej procesu B.
- Jądro znajduje wątek w procesie B, który ma obsłużyć transakcję, i przekazuje mu ją.
- Wątek rozpakowuje transakcję, znajduje węzeł i wysyła transakcję do obiektu węzła.
- Obiekt węzła pobiera identyfikator funkcji z transakcji, rozpakowuje
a
ib
z bufora transakcji i zapisujea
ib
w zmiennych lokalnych. - Obiekt węzła wywołuje funkcję
foo(a, b)
w kodzie serwera w procesie B. - Wynik wywołania jest zwracany w transakcji odpowiedzi, która jest przekazywana do sterownika jądra, a następnie z powrotem do wywołującego serwera proxy w procesie A.
- Serwer proxy zwraca ten wynik do elementu wywołującego w procesie A.
Przypadki użycia Binder
Binder może być używany w różnych scenariuszach, w których musi dochodzić do komunikacji między oprogramowaniem w różnych procesach. Na przykład:
Aplikacja aparatu używa mechanizmu Binder do komunikacji z serwerem aparatu w innym procesie. Serwer aparatu używa następnie mechanizmu Binder do komunikacji z warstwą HAL aparatu w innym procesie.
Aplikacja używa mechanizmu Binder do komunikacji z serwerem systemowym w innym procesie. Serwer systemowy używa mechanizmu Binder do komunikacji z warstwami HAL w innych procesach.
Aplikacja w jednym procesie używa mechanizmu Binder do komunikowania się z inną aplikacją w innym procesie.
Demon systemowy odpowiedzialny za instalowanie, aktualizowanie i usuwanie aplikacji (
installd
) używa mechanizmu Binder do komunikacji z demonem środowiska wykonawczego Androida („artd”) w celu kompilowania aplikacji.