Die Android Interface Definition Language (AIDL) ist ein Tool, mit dem Benutzer IPC abstrahieren können. Bei einer gegebenen Schnittstelle (angegeben in einer .aidl
-Datei) verwenden verschiedene Build-Systeme die aidl
Binärdatei, um C++- oder Java-Bindungen zu erstellen, sodass diese Schnittstelle prozessübergreifend verwendet werden kann, unabhängig von der Laufzeit oder Bitzahl dort.
AIDL kann zwischen jedem Prozess in Android verwendet werden: zwischen Plattformkomponenten oder zwischen Apps. Es wird jedoch nie als API für Apps verwendet. AIDL kann zum Beispiel verwendet werden, um eine SDK-API in der Plattform zu implementieren, aber die SDK-API-Oberfläche enthält niemals direkt AIDL-APIs. 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, wie z. B. APEXes (ab Android 10) oder HALs (ab Android 11), muss das als Stable AIDL bekannte Versionierungssystem 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 stellt Aufrufe an sie bereit, und ein Clientprozess führt Aufrufe an diese Schnittstellen durch. In vielen Fällen fungiert ein Prozess sowohl als Client als auch als Server, da er möglicherweise auf mehrere Schnittstellen verweist. Weitere Einzelheiten zur AIDL-Sprache finden Sie unter AIDL-Sprache . Weitere Einzelheiten zu den verschiedenen Laufzeiten, die zur Verwendung dieser Schnittstellen verfügbar sind, finden Sie unter AIDL-Backends . Diese Typdeklarationen sind genau wie eine Klassendeklaration in einer bestimmten Sprache, aber sie funktionieren prozessübergreifend.
Wie es funktioniert
AIDL verwendet den Binder-Kernel-Treiber, um Anrufe zu tätigen. Wenn Sie einen Aufruf tätigen, werden ein Methodenbezeichner und alle Objekte in einen Puffer gepackt und in einen entfernten Prozess kopiert, wo ein Binde-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, und 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 Backend erfolgen, sind keine Proxy-Objekte vorhanden, sodass Aufrufe direkt ohne Packen oder Entpacken erfolgen.
Interaktion mit Diensten auf dem Gerät
Android verfügt über einige Befehle, die die Interaktion mit Diensten auf dem Gerät ermöglichen. Versuchen:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing