Aplikacja zgodna z AVF składa się z 2 części: części aplikacji działającej w systemie operacyjnym Android na urządzeniu hosta i części aplikacji działającej w Microdroidzie w ramach pVM.
Część aplikacji działająca na Androidzie implementuje interfejs użytkownika, niepoufne reguły biznesowe oraz tworzy i zarządza cyklem życia pVM.
Część aplikacji działająca na Microdroidzie w ramach pVM odpowiada za wykonywanie wszystkich zadań, które muszą być realizowane w bezpieczny sposób.
Aby uruchomić część aplikacji pVM i się z nią komunikować, aplikacja hosta tworzy pVM i uruchamia w niej natywną bibliotekę współdzieloną. Ta biblioteka implementuje usługę Binder, której część aplikacji działająca na hoście używa do komunikacji z częścią aplikacji działającą w pVM. Rysunek 1 przedstawia 2 części aplikacji i kanał komunikacji za pomocą mechanizmu Binder:
Konfigurowanie pliku konfiguracji
Plik vm_config.json powinien zawierać wpis dotyczący systemu operacyjnego pVM i biblioteki współdzielonej. Poniższy assets/vm_config.json plik zawiera wpisy pliku konfiguracyjnego
dla Microdroida i wspólnej biblioteki natywnej:
{
  "os": {
    "name": "microdroid"
  },
  "task": {
    "type": "microdroid_launcher",
    "command": "MicrodroidTestNativeLib.so"
  }
}
Implementowanie usługi Binder
W bibliotece udostępnionej zaimplementuj usługę powiązań. Na przykład:
extern "C"
int android_native_main(int, char**) {
  // Implement your binder service here
}
Tworzenie kodu aplikacji
W części hosta aplikacji utwórz kod, który przygotowuje plik konfiguracyjny, wczytuje (lub tworzy) uchwyt do maszyny wirtualnej i uruchamia maszynę wirtualną. Na przykład:
// 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();
Komunikacja z częścią aplikacji działającą na maszynie wirtualnej
Aby komunikować się z częścią aplikacji działającą na maszynie wirtualnej, musisz najpierw zarejestrować wywołanie zwrotne, aby otrzymywać powiadomienia o gotowości usługi Binder na maszynie wirtualnej. Gdy otrzymasz powiadomienie, połączysz się z serwerem usługi Binder, a następnie będziesz się z nim komunikować za pomocą niestandardowego interfejsu AIDL. Na przykład:
// 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();
Aby pobrać kod źródłowy aplikacji demonstracyjnej, która pokazuje kroki opisane w tym dokumencie, zapoznaj się z MicrodroidDemo.