AIDL-Übersicht

Die Android Interface Definition Language (AIDL) ist ein Tool, mit dem Benutzer IPC abstrahieren können. Gegeben eine Schnittstelle (angegeben in einer .aidl - Datei), verwenden verschiedene Build - Systeme die aidl binären C ++ oder Java - Bindungen so zu konstruieren, dass diese Schnittstelle über Prozesse verwendet werden kann, unabhängig von der Laufzeit oder Bitness dort.

AIDL kann zwischen jedem Prozess in Android verwendet werden: zwischen Plattformkomponenten oder zwischen Apps. Es wird jedoch nie als API für Apps verwendet. AIDL kann beispielsweise verwendet werden, um eine SDK-API in der Plattform zu implementieren, aber die SDK-API-Oberfläche enthält niemals direkt AIDL-APIs. Für die Dokumentation darüber , wie direkt AIDL zwischen Anwendungen zu verwenden, finden Sie entsprechende Entwickler - Dokumentation Android . Wenn AIDL zwischen Plattformkomponenten verwendet wird , die separat wie Scheitel aktualisiert werden (in Android beginnend 10) oder HALS (ab Android 11), die das Versionssystem , wie bekannt Stable AIDL verwendet werden.

Beispiel

Hier ist ein Beispiel für eine AIDL-Schnittstelle:

    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 und höher unterstützen paketierbare Erklärungen. Zum Beispiel:

    package my.package;

    import my.package.Boo;

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

Android 11 und höher unterstützen Enum-Deklarationen. Zum Beispiel:

    package my.package;

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

Android 12 und höher unterstützen Gewerkschaftserklärungen. Zum Beispiel:

    package my.package;

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

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

Android T (AOSP experimentell) und höher unterstützen verschachtelte Typdeklarationen. Zum Beispiel:

    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.
    }

Ein Server - Prozess registriert eine Schnittstelle und dient Anrufe es, und ein Client - Prozess macht Anrufe an diese Schnittstellen. In vielen Fällen fungiert ein Prozess sowohl als Client als auch als Server, da er auf mehrere Schnittstellen verweisen kann. Für weitere Informationen über die verschiedenen Laufzeiten zur Verfügung , diese Schnittstellen zu verwenden, finden Sie AIDL Backends . Diese Typdeklarationen sind genau wie eine Klassendeklaration in einer bestimmten Sprache, funktionieren jedoch prozessübergreifend.

Wie es funktioniert

AIDL verwendet den Binder-Kernel-Treiber, um Aufrufe zu tätigen. Wenn Sie einen Aufruf durchführen, werden ein Methodenbezeichner und alle Objekte in einen Puffer gepackt und in einen Remoteprozess kopiert, wo ein Binder-Thread darauf wartet, die Daten zu lesen. Sobald ein Binder-Thread Daten für eine Transaktion empfängt, sucht der Thread ein natives Stub-Objekt im lokalen Prozess, und diese Klasse entpackt die Daten und ruft ein lokales Schnittstellenobjekt auf. Dieses lokale Schnittstellenobjekt ist dasjenige, das ein Serverprozess erstellt und registriert. Wenn Aufrufe im selben Prozess und im selben Backend erfolgen, existieren keine Proxy-Objekte, sodass Aufrufe direkt ohne Packen oder Entpacken erfolgen.

Interaktion mit Diensten auf dem Gerät

Android wird mit einigen Befehlen geliefert, um die Interaktion mit Diensten auf dem Gerät zu ermöglichen. Versuchen:

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