Escribir una aplicación AVF

Una aplicación compatible con AVF tiene dos partes: la parte de la aplicación que se ejecuta en el sistema operativo Android del host y la parte de la aplicación que se ejecuta en Microdroid dentro de un pVM.

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

La parte de la aplicación que se ejecuta en Microdroid, dentro de un pVM, es responsable de realizar cualquier tarea que deba realizarse de forma segura.

Para iniciar y comunicarse con la parte pVM de su aplicación, su aplicación host crea un pVM y ejecuta una biblioteca compartida nativa en su biblioteca dentro del pVM. Esta biblioteca implementa un servicio de carpeta que la parte del host de la aplicación utiliza para comunicarse con la parte de la aplicación dentro de un pVM. La Figura 1 muestra las dos partes de la aplicación y el canal de comunicación de la carpeta:

Carga y comunicación de la aplicación AVF

Figura 1. Carga y comunicación de la aplicación AVF

Configurar el archivo de configuración

Su archivo vm_config.json debe tener una entrada para el sistema operativo y la biblioteca compartida de pVM. El siguiente archivo assets/vm_config.json muestra las entradas del archivo de configuración para Microdroid y una biblioteca nativa compartida:

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

Implementar el servicio de carpeta

Dentro de su biblioteca compartida, implemente un servicio de carpeta. Por ejemplo:

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

Crear código de aplicación

En la parte del host de su aplicación, cree 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(), "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();

Comunicarse con la parte VM de su aplicación

Para comunicarse con la parte de VM de su aplicación, primero registre una devolución de llamada para recibir una notificación cuando se inicie el servicio de carpeta en la VM. Cuando se le notifica, se conecta al servidor de carpeta y luego habla con el servidor utilizando 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 aplicación de demostración que muestra los pasos de este documento, consulte MicrodroidDemo .