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 una pVM.
La parte dell'app in esecuzione su Android implementa l'interfaccia utente, la logica di business non confidenziale e crea e gestisce il ciclo di vita di una VM privata.
La parte dell'app in esecuzione su Microdroid, all'interno di una pVM, è responsabile dell'esecuzione di tutte le attività che devono essere eseguite in sicurezza.
Per avviare e comunicare con la parte della tua app in pVM, l'applicazione host crea una pVM ed esegue una libreria condivisa nativa al suo interno. Questa libreria implementa un servizio di binder utilizzato dalla parte host dell'app 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 binder:
Impostare il file di configurazione
Il file vm_config.json
deve contenere una voce per il sistema operativo e la libreria condivisa della 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",
}
}
Implementa il servizio Binder
Implementa un servizio di rilegatura all'interno della libreria condivisa. Ad esempio:
extern "C"
int android_native_main(int, char**) {
// Implement your binder service here
}
Crea codice dell'app
Nella parte host dell'app, crea il codice che prepara il file di configurazione, carica (o crea) un handle per la VM ed esegue la VM. Ad esempio:
// 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();
Comunicare con la parte VM della tua app
Per comunicare con la parte della VM della tua app, devi prima registrare un callback per ricevere una notifica quando il servizio di associazione sulla VM è pronto. Quando ricevi una notifica, ti colleghi al server binder e poi interagisci con il server utilizzando l'interfaccia AIDL personalizzata. Ad 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 di un'app di dimostrazione che illustra i passaggi descritti in questo documento, consulta MicrodroidDemo.