Schreiben Sie eine AVF-App

Eine AVF-kompatible App besteht aus zwei Teilen: dem Teil der App, der auf dem Host-Android-Betriebssystem läuft, und dem Teil der App, der auf Microdroid innerhalb einer pVM läuft.

Der Teil der App, der auf Android läuft, implementiert die Benutzeroberfläche, nicht vertrauliche Geschäftslogik und erstellt und verwaltet den Lebenszyklus einer pVM.

Der Teil der App, der auf Microdroid innerhalb einer pVM ausgeführt wird, ist für die Ausführung aller Aufgaben verantwortlich, die sicher ausgeführt werden müssen.

Um den pVM-Teil Ihrer App zu starten und mit ihm zu kommunizieren, erstellt Ihre Hostanwendung eine pVM und führt eine native gemeinsam genutzte Bibliothek in Ihrer Bibliothek innerhalb der pVM aus. Diese Bibliothek implementiert einen Binder-Dienst, den der Host-Teil der App verwendet, um mit dem Teil der App innerhalb einer pVM zu kommunizieren. Abbildung 1 zeigt die beiden Teile der Anwendung und den Binder-Kommunikationskanal:

Laden und Kommunikation der AVF-App

Abbildung 1. Laden und Kommunikation der AVF-App

Richten Sie die Konfigurationsdatei ein

Ihre vm_config.json Datei sollte einen Eintrag für das Betriebssystem und die gemeinsam genutzte Bibliothek der pVM enthalten. Die folgende Datei assets/vm_config.json zeigt Konfigurationsdateieinträge für Microdroid und eine gemeinsam genutzte native Bibliothek:

{
  "os": {
    "name": "microdroid"
  },
  "task": {
    "type": "microdroid_launcher",
    "command": MicrodroidTestNativeLib.so",
  }
}

Implementieren Sie den Binder-Service

Implementieren Sie in Ihrer gemeinsam genutzten Bibliothek einen Binder-Dienst. Zum Beispiel:

extern "C"
int android_native_main(int, char**) {
  // Implement your binder service here
}

App-Code erstellen

Erstellen Sie im Hostteil Ihrer App Code, der die Konfigurationsdatei vorbereitet, ein Handle für die VM lädt (oder erstellt) und die VM ausführt. Zum Beispiel:

// Prepare the configuration file
VirtualMachineConfig config = new VirtualMachineConfig
  .Builder(getApplication(), "asssets/vm_config.json")
  .build();

// Load (or create) the handle to a VM
VirtualMachine vm = VirtualMachineManager
  .getInstance(getApplication())
  .getOrCreate("my_vm", config);

// Run the VM
vm.run();

Kommunizieren Sie mit dem VM-Teil Ihrer App

Um mit dem VM-Teil Ihrer App zu kommunizieren, registrieren Sie zunächst einen Rückruf, um benachrichtigt zu werden, wenn der Binder-Dienst auf der VM ausgeführt wird. Wenn Sie benachrichtigt werden, stellen Sie eine Verbindung zum Binder-Server her und kommunizieren dann über die benutzerdefinierte AIDL-Schnittstelle mit dem Server. Zum Beispiel:

// Register the callback
vm.setCallback(Executors.newSingleThreadExecutor(),
  new VirtualmachineCallback() {
  @Override
  public void onPayloadReady(VirtualMachine vm) {
    // Connect to the binder server
    IBinder binder = vm.connectToVsockServer(PORT).get();
    IMyService svc = IMyService.Stub.asInterface(binder);
    // Talk with server using custom AIDL interface
    Result res = svc.doSomething();
  }
}); //exception handling & proper threading omitted
vm.run();

Informationen zum Herunterladen des Quellcodes für eine Demo-App, die die Schritte in diesem Dokument demonstriert, finden Sie unter MicrodroidDemo .