AVF-Anwendung schreiben

Eine AVF-kompatible App besteht aus zwei Teilen: dem Teil der App, der auf dem Android-Hostbetriebssystem ausgeführt wird, und dem Teil der App, der auf Microdroid innerhalb einer pVM ausgeführt wird.

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

Der Teil der App, der auf Microdroid in 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 Anwendung zu starten und mit ihm zu kommunizieren, erstellt Ihre Hostanwendung eine pVM und führt eine native freigegebene Bibliothek innerhalb der pVM aus. Diese Bibliothek implementiert einen Binder-Dienst, mit dem der Hostteil der App mit dem Teil der App in einer pVM kommunizieren kann. Abbildung 1 zeigt die beiden Teile der Anwendung und den Binder-Kommunikationskanal:

Laden und Kommunikation der AVF-App

Abbildung 1. Laden und Kommunikation von AVF-Apps

Konfigurationsdatei einrichten

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

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

Binder-Dienst implementieren

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

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

App-Code erstellen

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

// Prepare the configuration file
VirtualMachineConfig config = new VirtualMachineConfig
  .Builder(getApplication(), "assets/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();

Kommunikation mit dem VM-Teil Ihrer App

Für die Kommunikation mit dem VM-Teil Ihrer Anwendung registrieren Sie zuerst einen Callback, der benachrichtigt wird, wenn der Binder-Dienst auf der VM bereit ist. Wenn Sie benachrichtigt werden, stellen Sie eine Verbindung zum Binder-Server her und kommunizieren dann über die benutzerdefinierte AIDL-Schnittstelle mit dem Server. 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();

Den Quellcode für eine Demo-App, die die Schritte in diesem Dokument veranschaulicht, finden Sie unter MicrodroidDemo.