Android Interface Definition Language (AIDL) to narzędzie, które umożliwia użytkownikom abstrahowanie od IPC. Na podstawie interfejsu (określonego w .aidl
pliku) różne systemy kompilacji używają pliku binarnego aidl
do tworzenia powiązań w językach 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 dla 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 deweloperów Androida. Gdy AIDL jest używany między komponentami platformy, które są aktualizowane oddzielnie, takimi jak APEX-y (od Androida 10) lub HAL-e (od Androida 11), musi być używany system wersji znany jako Stable 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 deklaracje klas w danym języku, ale działają w różnych procesach.
Jak to działa
AIDL używa sterownika jądra bindera do wykonywania wywołań. Gdy wykonujesz 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 interfejsu Binder otrzyma dane transakcji, wyszuka w procesie lokalnym natywny obiekt stub. Ta klasa rozpakowuje dane i wywołuje obiekt interfejsu lokalnego. Ten lokalny obiekt interfejsu jest tworzony i rejestrowany przez proces serwera. Gdy wywołania są wykonywane w tym samym procesie i na tym samym backendzie, nie ma obiektów proxy, więc wywołania 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