Criar um app AVF

Um app compatível com AVF tem duas partes: a parte do app em execução no SO Android host e a parte do app em execução no Microdroid em uma pVM.

A parte do app executado no Android implementa a interface do usuário, a lógica de negócios não confidencial e cria e gerencia o ciclo de vida de uma pVM.

A parte do app em execução no Microdroid, em uma pVM, é responsável por executar qualquer tarefa que precise ser realizada com segurança.

Para iniciar e se comunicar com a parte de pVM do app, o aplicativo host cria uma pVM e executa uma biblioteca compartilhada nativa dentro dela. Essa biblioteca implementa um serviço de vinculação que a parte host do app usa para se comunicar com a parte do app em uma pVM. A Figura 1 mostra as duas partes do aplicativo e o canal de comunicação do binder:

Carregamento e comunicação de apps AVF

Figura 1. Carregamento e comunicação de apps da AVF

Configurar o arquivo de configuração

O arquivo vm_config.json precisa ter uma entrada para o sistema operacional e a biblioteca compartilhada da pVM. O arquivo assets/vm_config.json a seguir mostra entradas de arquivos de configuração para o Microdroid e uma biblioteca nativa compartilhada:

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

Implementar o serviço de vinculação

Implemente um serviço de vinculação na biblioteca compartilhada. Exemplo:

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

Criar código do app

Na parte do host do app, crie um código que prepare o arquivo de configuração, carregue (ou crie) uma handle para a VM e execute a VM. Exemplo:

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

Comunicar-se com a parte da VM do seu app

Para se comunicar com a parte da VM do app, primeiro registre um callback para receber uma notificação quando o serviço de vinculação na VM estiver pronto. Ao receber a notificação, você se conecta ao servidor do binder e, em seguida, se comunica com ele usando a interface AIDL personalizada. Exemplo:

// 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 fazer o download do código-fonte de um app de demonstração que demonstra as etapas neste documento, consulte MicrodroidDemo.