Scrivi un'app AVF

Un'app compatibile con AVF è composta da due parti: la parte dell'app in esecuzione sul sistema operativo Android host e la parte dell'app in esecuzione su Microdroid all'interno di un pVM.

La parte dell'app in esecuzione su Android implementa l'interfaccia utente, la logica aziendale non riservata e crea e gestisce il ciclo di vita di una pVM.

La parte dell'app in esecuzione su Microdroid, all'interno di un pVM, è responsabile dell'esecuzione di tutte le attività che devono essere eseguite in sicurezza.

Per avviare e comunicare con la parte pVM della tua app, l'applicazione host crea una pVM ed esegue una libreria condivisa nativa nella tua libreria all'interno di pVM. Questa libreria implementa un servizio di associazione che la parte host dell'app utilizza per comunicare con la parte dell'app all'interno di una pVM. La Figura 1 mostra le due parti dell'applicazione e il canale di comunicazione del raccoglitore:

Caricamento e comunicazione dell'app AVF

Figura 1. Caricamento e comunicazione dell'app AVF

Imposta il file di configurazione

Il tuo file vm_config.json dovrebbe avere una voce per il sistema operativo e la libreria condivisa di pVM. Il seguente file assets/vm_config.json mostra le voci del file di configurazione per Microdroid e una libreria nativa condivisa:

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

Implementare il servizio raccoglitore

All'interno della tua libreria condivisa, implementa un servizio raccoglitore. Per esempio:

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

Crea il codice dell'app

Nella parte host della tua app, crea il codice che prepara il file di configurazione, carica (o crea) un handle per la VM ed esegue la VM. Per esempio:

// 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();

Comunica con la parte VM della tua app

Per comunicare con la parte VM della tua app, devi prima registrare una richiamata per ricevere una notifica quando il servizio di associazione sulla VM. Quando ricevi la notifica, ti connetti al server del raccoglitore e quindi parli con il server utilizzando l'interfaccia AIDL personalizzata. Per esempio:

// 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();

Per scaricare il codice sorgente per un'app demo che illustra i passaggi descritti in questo documento, fare riferimento a MicrodroidDemo .