AIDL – Übersicht

Die Android Interface Definition Language (AIDL) ist ein Tool, mit dem Nutzer IPC abstrahieren können. Bei einer Schnittstelle (in einer .aidl-Datei angegeben) verwenden verschiedene Build-Systeme die Binärdatei aidl, um C++- oder Java-Bindungen zu erstellen, sodass diese Schnittstelle unabhängig von der dortigen Laufzeit oder Bitzahl prozessübergreifend verwendet werden kann.

AIDL kann zwischen beliebigen Prozessen in Android verwendet werden: zwischen Plattformkomponenten oder zwischen Apps. Sie wird jedoch nie als API für Apps verwendet. AIDL kann beispielsweise verwendet werden, um eine SDK API auf der Plattform zu implementieren, aber die SDK API-Oberfläche enthält nie direkt AIDL APIs. Informationen zur direkten Verwendung von AIDL zwischen Apps finden Sie in der entsprechenden Dokumentation für Android-Entwickler. Wenn AIDL zwischen Plattformkomponenten verwendet wird, die separat aktualisiert werden, wie APEXes (ab Android 10) oder HALs (ab Android 11), muss das als Stable AIDL bekannte Versionsverwaltungssystem 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);
    }

Ein Serverprozess registriert eine Schnittstelle und liefert Aufrufe an diese und ein Clientprozess ruft diese Schnittstellen auf. In vielen Fällen fungiert ein Prozess sowohl als Client als auch als Server, da er auf mehrere Schnittstellen verweisen kann. Weitere Informationen zur AIDL-Sprache finden Sie unter AIDL-Sprache. Weitere Informationen zu den verschiedenen Laufzeiten, die zur Verwendung dieser Schnittstellen verfügbar sind, finden Sie unter AIDL-Back-Ends. Diese Typdeklarationen ähneln einer Klassendeklaration in einer bestimmten Sprache, funktionieren jedoch prozessübergreifend.

Funktionsweise

AIDL verwendet den Binder-Kernel-Treiber für Aufrufe. Wenn Sie einen Aufruf ausführen, werden eine Methodenkennung und alle Objekte in einem Zwischenspeicher gepackt und in einen Remoteprozess kopiert, in dem ein Binder-Thread auf das Lesen der Daten wartet. Sobald ein Binder-Thread Daten für eine Transaktion empfängt, sucht der Thread im lokalen Prozess nach einem nativen Stub-Objekt. Diese Klasse entpackt die Daten und ruft ein lokales Schnittstellenobjekt auf. Dieses lokale Schnittstellenobjekt wird von einem Serverprozess erstellt und registriert. Wenn Aufrufe im selben Prozess und im selben Back-End erfolgen, sind keine Proxy-Objekte vorhanden. Daher werden Aufrufe ohne Verpacken oder Entpacken direkt ausgeführt.

Mit Diensten auf dem Gerät interagieren

Android enthält einige Befehle, die die Interaktion mit Diensten auf dem Gerät ermöglichen. Hier sind ein paar Vorschläge:

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