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 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 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 möglicherweise auf mehrere Schnittstellen verweist. 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 direkt und ohne Verpacken oder Entpacken 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