Cómo escribir una app de AVF

Una app compatible con AVF tiene dos partes: la parte de la app que se ejecuta en el SO Android host y la parte de la app que se ejecuta en Microdroid dentro de una pVM.

La parte de la app que se ejecuta en Android implementa la interfaz de usuario, la lógica empresarial no confidencial y crea y administra el ciclo de vida de una pVM.

La parte de la app que se ejecuta en Microdroid, dentro de una pVM, es responsable de realizar cualquier tarea que deba realizarse de forma segura.

Para iniciar la parte de la pVM de tu app y comunicarte con ella, tu aplicación host crea una pVM y ejecuta una biblioteca compartida nativa dentro de la pVM. Esta biblioteca implementa un servicio de vinculador que la parte host de la app usa para comunicarse con la parte de la app dentro de una pVM. En la figura 1, se muestran las dos partes de la aplicación y el canal de comunicación del binder:

Carga y comunicación de la app de AVF

Figura 1: Carga y comunicación de la app de AVF

Configura el archivo de configuración

Tu archivo vm_config.json debe tener una entrada para el sistema operativo y la biblioteca compartida de la pVM. En el siguiente archivo assets/vm_config.json, se muestran entradas de archivos de configuración para Microdroid y una biblioteca nativa compartida:

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

Implementa el servicio de vinculación

Dentro de tu biblioteca compartida, implementa un servicio de vinculación. Por ejemplo:

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

Crea el código de la app

En la parte del host de tu app, crea código que prepare el archivo de configuración, cargue (o cree) un identificador para la VM y ejecute la VM. Por ejemplo:

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

Comunícate con la parte de la VM de tu app

Para comunicarte con la parte de la VM de tu app, primero debes registrar una devolución de llamada para recibir una notificación cuando el servicio de Binder en la VM esté listo. Cuando recibes la notificación, te conectas al servidor de Binder y, luego, te comunicas con él a través de la interfaz AIDL personalizada. Por ejemplo:

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

Para descargar el código fuente de una app de demostración que muestre los pasos de este documento, consulta MicrodroidDemo.