Omówienie AIDL

Język definiowania interfejsu Androida (AIDL) to narzędzie, które pozwala użytkownikom abstrakcyjnie obsługiwać IPC. W przypadku interfejsu (określonego w pliku .aidl) różne systemy kompilacji używają binarnego pliku aidl do tworzenia połączeń C++ lub Java, aby można było używać tego interfejsu w różnych procesach, niezależnie od środowiska uruchomieniowego i liczby bitów.

AIDL może być używany w dowolnym procesie na Androidzie: między komponentami platformy lub między aplikacjami. Nie jest on jednak używany jako interfejs API dla aplikacji. Plik AIDL może służyć do implementacji interfejsu API pakietu SDK na platformie, ale interfejs API pakietu SDK nigdy nie zawiera bezpośrednio interfejsów AIDL. Informacje o używaniu interfejsu AIDL do bezpośredniej komunikacji między aplikacjami znajdziesz w odpowiedniej dokumentacji dla deweloperów Androida. Gdy interfejs AIDL jest używany między komponentami platformy aktualizowanymi oddzielnie, takimi jak APEX (od Androida 10) lub HAL (od Androida 11), należy używać systemu wersji znanego jako stabilny 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 wykonuje wywołania do tych interfejsów. 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 uruchomieniowych dostępnych do korzystania z tych interfejsów znajdziesz w artykule Usługa AIDL. Te deklaracje typu są dokładnie takie same jak deklaracje klasy w danym języku, ale działają w różnych procesach.

Jak to działa

AIDL do wywoływania funkcji używa sterownika jądra binder. Gdy wykonasz wywołanie, identyfikator metody i wszystkie obiekty są umieszczane w buforze i kopiowane do procesu zdalnego, gdzie wątek binder czeka na odczytanie danych. Gdy wątek bindera otrzyma dane transakcji, odszuka w lokalnym procesie obiekt typu native stub, a ta klasa rozpakuje dane i wywoła lokalny obiekt interfejsu. Ten lokalny obiekt interfejsu jest tworzony i rejestrowany przez proces serwera. Gdy wywołania są wykonywane w ramach tego samego procesu i tego samego backendu, nie istnieją żadne obiekty zastępcze, więc wywołania są bezpośrednie bez pakowania ani rozpakowywania.

Interakcja z usługami 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