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 die aidl-Binärdatei, um C++- oder Java-Bindungen zu erstellen, damit diese Schnittstelle unabhängig von der Laufzeit oder Bitanzahl 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 in der Plattform zu implementieren. Die SDK API-Oberfläche enthält jedoch niemals 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, z. B. APEXes (ab Android 10) oder HALs (ab Android 11), muss das Versionierungssystem Stable AIDL verwendet werden.

Verwendungsbeispiele

Hier ist eine Beispiel-AIDL-Schnittstelle:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

Ein Serverprozess registriert eine Schnittstelle und führt Aufrufe an sie aus. Ein Clientprozess ruft diese Schnittstellen auf. 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 Laufzeiten, die für die Verwendung dieser Schnittstellen verfügbar sind, finden Sie unter AIDL-Backends. Diese Typdeklarationen ähneln genau einer Klassendeklaration in einer bestimmten Sprache, funktionieren aber prozessübergreifend.

Funktionsweise

AIDL verwendet den Binder-Kerneltreiber für Aufrufe. Wenn Sie einen Aufruf ausführen, werden eine Methoden-ID und alle Objekte in einen Puffer verpackt 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 er im lokalen Prozess nach einem nativen Stub-Objekt. Diese Klasse entpackt die Daten und ruft ein lokales Interface-Objekt auf. Dieses lokale Schnittstellenobjekt wird von einem Serverprozess erstellt und registriert. Wenn Aufrufe im selben Prozess und im selben Backend erfolgen, gibt es keine Proxyobjekte. Daher sind Aufrufe direkt, ohne Ein- oder Auspacken.

Mit Diensten auf dem Gerät interagieren

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

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