Język definiowania interfejsu Androida (AIDL) to narzędzie, które umożliwia użytkownikom abstrahowanie od IPC. Na podstawie interfejsu (określonego w .aidlpliku) różne systemy kompilacji używają pliku binarnego aidl do tworzenia powiązań C++ lub Java, dzięki czemu interfejs ten może być używany w różnych procesach, niezależnie od środowiska wykonawczego czy liczby bitów.
AIDL można używać między dowolnymi procesami na Androidzie: między komponentami platformy lub między aplikacjami. Nie jest on jednak nigdy używany jako interfejs API w przypadku aplikacji. AIDL może być używany np. do implementowania interfejsu API pakietu SDK na platformie, ale powierzchnia interfejsu API pakietu SDK nigdy nie zawiera bezpośrednio interfejsów API AIDL. Dokumentację dotyczącą bezpośredniego korzystania z AIDL w aplikacjach znajdziesz w odpowiedniej dokumentacji dla programistów Androida. Gdy interfejs AIDL jest używany między komponentami platformy, które są aktualizowane oddzielnie, np. pakietami APEX (od Androida 10) lub warstwami HAL (od Androida 11), musi być używany system obsługi wersji znany jako stabilny interfejs AIDL.
Przykład
Oto przykład interfejsu AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
Proces serwera rejestruje interfejs i obsługuje wywołania do niego, a proces klienta wywołuje te interfejsy. W wielu przypadkach proces działa zarówno jako klient, jak i serwer, ponieważ może odwoływać się do wielu interfejsów. Więcej informacji o języku AIDL znajdziesz w artykule Język AIDL. Więcej informacji o różnych środowiskach wykonawczych, w których można używać tych interfejsów, znajdziesz w sekcji Backendy AIDL. Te deklaracje typu są dokładnie takie same jak deklaracja klasy w danym języku, ale działają w różnych procesach.
Jak to działa
AIDL używa sterownika jądra bindera do wykonywania połączeń. Gdy nawiązujesz połączenie, identyfikator metody i wszystkie obiekty są pakowane do bufora i kopiowane do procesu zdalnego, w którym wątek powiązania oczekuje na odczytanie danych. Gdy wątek powiązania otrzyma dane transakcji, wyszuka w procesie lokalnym natywny obiekt zastępczy. Ta klasa rozpakuje dane i wywoła obiekt interfejsu lokalnego. Ten lokalny obiekt interfejsu jest tworzony i rejestrowany przez proces serwera. Gdy połączenia są wykonywane w tym samym procesie i na tym samym backendzie, nie ma obiektów proxy, więc połączenia są bezpośrednie i nie wymagają pakowania ani rozpakowywania. Więcej informacji znajdziesz w omówieniu Binder.
korzystać z usług na urządzeniu,
Android ma kilka poleceń, które umożliwiają interakcję z usługami na urządzeniu. Co możesz zrobić:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing