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 aidl Binärdatei, um C++- oder Java
Bindungen zu erstellen, damit diese Schnittstelle prozessübergreifend verwendet werden kann, unabhängig von der
Laufzeit oder Bitanzahl.
AIDL kann zwischen beliebigen Prozessen 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 nie direkt AIDL-APIs. Eine Dokumentation zur direkten Verwendung von AIDL zwischen Apps finden Sie in der entsprechenden Android-Entwickler dokumentation. Wenn AIDL zwischen Plattformkomponenten verwendet wird, die separat aktualisiert werden, z. B. APEX (ab Android 10) oder HALs (ab Android 11), muss das Versionsverwaltungssystem Stable AIDL verwendet werden.
Beispiel
Hier 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 verarbeitet Aufrufe an sie. Ein Clientprozess 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 Laufzeiten, die für die Verwendung dieser Schnittstellen zur Verfügung stehen, finden Sie unter AIDL-Back-Ends. Diese Typdeklarationen sind genau wie eine Klassendeklaration in einer bestimmten Sprache, funktionieren aber prozessübergreifend.
Funktionsweise
AIDL verwendet den Binder-Kernel-Treiber, um Aufrufe auszuführen. Wenn Sie einen Aufruf ausführen, werden eine Methoden-ID und alle Objekte in einen Puffer gepackt und an 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 ein natives Stub-Objekt im lokalen Prozess. Diese Klasse entpackt die Daten und führt einen Aufruf an ein lokales Schnittstellenobjekt aus. Dieses lokale Schnittstellenobjekt wird von einem Serverprozess erstellt und registriert. Wenn Aufrufe im selben Prozess und im selben Back-End ausgeführt werden, sind keine Proxyobjekte vorhanden. Aufrufe erfolgen daher direkt, ohne dass Daten gepackt oder entpackt werden müssen. Weitere Informationen finden Sie unter Binder.
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