Écrire une application AVF

Une application compatible AVF comprend deux parties : la partie de l'application exécutée sur le système d'exploitation Android hôte et la partie de l'application exécutée sur Microdroid dans une pVM.

La partie de l'application exécutée sur Android implémente l'interface utilisateur, la logique métier non confidentielle, et crée et gère le cycle de vie d'une pVM.

La partie de l'application exécutée sur Microdroid, au sein d'une pVM, est responsable de l'exécution de toutes les tâches qui doivent être effectuées en toute sécurité.

Pour lancer et communiquer avec la partie pVM de votre application, votre application hôte crée une pVM et exécute une bibliothèque partagée native dans votre bibliothèque au sein de la pVM. 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 pVM. La figure 1 montre les deux parties de l'application et le canal de communication du classeur :

Chargement et communication de l'application AVF

Figure 1. Chargement et communication de l'application AVF

Configurer le fichier de configuration

Votre fichier vm_config.json doit avoir une entrée pour le système d'exploitation et la bibliothèque partagée du 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 classeur

Au sein de votre bibliothèque partagée, implémentez un service de classeur. 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 exécute la VM. Par exemple:

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

Communiquer avec la partie VM de votre application

Pour communiquer avec la partie VM de votre application, vous enregistrez d'abord un rappel pour être averti lorsque le service de reliure est activé sur la VM. Une fois averti, vous vous connectez au serveur de classeur, puis 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 qui illustre les étapes de ce document, reportez-vous à MicrodroidDemo .