AIDL – Übersicht

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

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 in der Plattform zu implementieren. Die SDK-API-Oberfläche enthält jedoch nie AIDL-APIs direkt. Eine Dokumentation zur direkten Verwendung von AIDL zwischen Apps finden Sie in der entsprechenden Android-Entwicklerdokumentation. Wenn AIDL zwischen Plattformkomponenten verwendet wird, die separat aktualisiert werden, z. B. APEX-Dateien (ab Android 10) oder HALs (ab Android 11), muss das Versionsverwaltungssystem 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);
    }

Ein Server-Prozess registriert eine Schnittstelle und verarbeitet Aufrufe an diese Schnittstelle. Ein Client-Prozess führt Aufrufe an diese Schnittstellen aus. In vielen Fällen fungiert ein Prozess sowohl als Client als auch als Server, da er möglicherweise auf mehrere Schnittstellen verweist. Weitere Informationen zur AIDL-Sprache finden Sie unter AIDL-Sprache. Weitere Informationen zu den verschiedenen Runtimes, die für die Verwendung dieser Schnittstellen verfügbar sind, finden Sie unter AIDL-Back-Ends. Diese Typdeklarationen entsprechen genau einer Klassendeklaration in einer bestimmten Sprache, funktionieren aber prozessübergreifend.

Funktionsweise

AIDL verwendet den Binder-Kernel-Treiber für Aufrufe. Wenn Sie einen Aufruf tätigen, werden eine Methoden-ID und alle Objekte in einen Puffer gepackt und in einen Remote-Prozess kopiert, in dem ein Binder-Thread darauf wartet, die Daten zu lesen. Sobald ein Binder-Thread Daten für eine Transaktion empfängt, sucht der Thread nach einem nativen Stub-Objekt im lokalen Prozess. Diese Klasse entpackt die Daten und ruft ein lokales Schnittstellenobjekt auf. Dieses lokale Schnittstellenobjekt wird von einem Serverprozess erstellt und registriert. Wenn Anrufe im selben Prozess und im selben Backend erfolgen, sind keine Proxy-Objekte vorhanden. Anrufe erfolgen also direkt, ohne dass Daten gepackt oder entpackt werden müssen. Weitere Informationen finden Sie in der Binder-Übersicht.

Mit Diensten auf dem Gerät interagieren

Android bietet einige Befehle, mit denen Sie mit Diensten auf dem Gerät interagieren können. Hier ein paar Vorschläge:

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