Une application compatible avec AVF se compose de deux parties: la partie de l'application s'exécutant sur l'OS Android hôte et la partie s'exécutant sur Microdroid dans une pVM.
La partie de l'application qui s'exécute sur Android implémente l'interface utilisateur et la logique métier non confidentielle, et crée et gère le cycle de vie d'une VM préemptive.
La partie de l'application qui s'exécute sur Microdroid au sein d'une pVM est chargée d'effectuer toutes les tâches qui doivent être effectuées de manière sécurisée.
Pour lancer la partie VM préemptive de votre application et communiquer avec elle, votre application hôte crée une VM préemptive et y exécute une bibliothèque partagée native. Cette bibliothèque implémente un service de liaison que la partie hôte de l'application utilise pour communiquer avec la partie de l'application au sein d'une VM préemptive. La figure 1 montre les deux parties de l'application et le canal de communication de liaison:
Créer le fichier de configuration
Votre fichier vm_config.json
doit contenir une entrée pour le système d'exploitation et la bibliothèque partagée de la pVM. Le fichier assets/vm_config.json
suivant affiche les entrées du fichier de configuration pour Microdroid et une bibliothèque native partagée:
{
"os": {
"name": "microdroid"
},
"task": {
"type": "microdroid_launcher",
"command": MicrodroidTestNativeLib.so",
}
}
Implémenter le service de liaison
Dans votre bibliothèque partagée, implémentez un service de liaison. Par exemple :
extern "C"
int android_native_main(int, char**) {
// Implement your binder service here
}
Créer le code de l'application
Dans la partie hôte de votre application, créez du code qui prépare le fichier de configuration, charge (ou crée) un handle vers la VM et l'exécute. Par exemple :
// 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();
Communiquer avec la partie VM de votre application
Pour communiquer avec la partie VM de votre application, vous devez d'abord enregistrer un rappel afin d'être averti lorsque le service de liaison de la VM est prêt. Lorsque vous recevez une notification, vous vous connectez au serveur de liaison, puis vous parlez avec le serveur à l'aide de l'interface AIDL personnalisée. Par exemple :
// 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();
Pour télécharger le code source d'une application de démonstration illustrant les étapes décrites dans ce document, consultez MicrodroidDemo.