Escreva um aplicativo AVF

Um aplicativo compatível com AVF tem duas partes: a parte do aplicativo em execução no sistema operacional Android host e a parte do aplicativo em execução no Microdroid dentro de um pVM.

A parte do aplicativo executada 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 um pVM.

A parte do aplicativo executada no Microdroid, dentro de um pVM, é responsável por executar quaisquer tarefas que precisem ser executadas com segurança.

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

Carregamento e comunicação do aplicativo AVF

Figura 1. Carregamento e comunicação do aplicativo AVF

Configure o arquivo de configuração

Seu arquivo vm_config.json deve ter uma entrada para o sistema operacional e biblioteca compartilhada do pVM. O seguinte arquivo assets/vm_config.json mostra entradas do arquivo de configuração para Microdroid e uma biblioteca nativa compartilhada:

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

Implementar o serviço de fichário

Dentro da sua biblioteca compartilhada, implemente um serviço de fichário. Por exemplo:

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

Criar código do aplicativo

Na parte host do seu aplicativo, crie um código que prepare o arquivo de configuração, carregue (ou crie) um identificador para a VM e execute a VM. Por exemplo:

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

Comunique-se com a parte VM do seu aplicativo

Para se comunicar com a parte VM do seu aplicativo, primeiro registre um retorno de chamada para ser notificado quando o serviço de binder na VM. Quando notificado, você se conecta ao servidor binder e, em seguida, conversa com o servidor usando a interface AIDL customizada. Por 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 baixar o código-fonte de um aplicativo de demonstração que demonstra as etapas deste documento, consulte MicrodroidDemo .