Przegląd AIDL

Język definicji interfejsu Androida (AIDL) to narzędzie, które pozwala użytkownikom abstrahować od IPC. Biorąc pod uwagę interfejs (określone w .aidl pliku), różne systemy kompilacji użyć aidl binarny skonstruować C ++ lub Java powiązania tak, że interfejs ten może być stosowany w całej procesów, niezależnie od there starcie lub bitness.

AIDL może być używany między dowolnym procesem w systemie Android: między komponentami platformy lub między aplikacjami. Jednak nigdy nie jest używany jako interfejs API dla aplikacji. AIDL może być używany na przykład do implementacji interfejsu API SDK na platformie, ale powierzchnia interfejsu API SDK nigdy nie zawiera bezpośrednio interfejsów API AIDL. Dokumentacji na temat korzystania z AIDL między aplikacjami bezpośrednio, patrz odpowiedni Android dokumentację deweloperów . Gdy AIDL stosuje się między elementami platform aktualizowanych oddzielnie, jak wierzchołki (od Android 10) lub HALS (aminowe począwszy Androida 11), znany jako system wersji Stable AIDL muszą być stosowane.

Przykład

Oto przykładowy interfejs AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 i nowsze obsługują deklaracje parcelable. Na przykład:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 i nowsze obsługują deklaracje wyliczenia. Na przykład:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 i nowsze obsługują deklaracje związkowe. Na przykład:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (eksperymentalny AOSP) i nowsze obsługują deklaracje typu zagnieżdżonego. Na przykład:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

Proces serwera rejestruje interfejs i obsługuje połączenia do niego, a proces klient dzwoni 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 na temat różnych środowisk wykonawczych dostępnych do korzystania z tych interfejsów, zobacz backendów AIDL . Te deklaracje typu są dokładnie takie jak deklaracje klasy w danym języku, ale działają między procesami.

Jak to działa

AIDL używa sterownika jądra bindera do wykonywania wywołań. Podczas wykonywania wywołania identyfikator metody i wszystkie obiekty są pakowane do bufora i kopiowane do zdalnego procesu, w którym wątek wiążący czeka na odczyt danych. Gdy wątek spinacza otrzyma dane dla transakcji, wyszukuje natywny obiekt pośredniczący w procesie lokalnym, a ta klasa rozpakowuje dane i wykonuje wywołanie obiektu interfejsu lokalnego. Ten lokalny obiekt interfejsu jest obiektem, który tworzy i rejestruje proces serwera. Gdy wywołania są wykonywane w tym samym procesie i tym samym zapleczu, nie istnieją żadne obiekty proxy, a zatem wywołania są bezpośrednie, bez pakowania lub rozpakowywania.

Interakcja z usługami na urządzeniu

Android zawiera kilka poleceń umożliwiających interakcję z usługami na urządzeniu. Próbować:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing