Napisz aplikację AVF

Aplikacja kompatybilna z AVF składa się z dwóch części: części aplikacji działającej w systemie operacyjnym Android i części aplikacji działającej na platformie Microdroid w maszynie pVM.

Część aplikacji działająca na Androidzie implementuje interfejs użytkownika, niepoufną logikę biznesową oraz tworzy cykl życia pVM i zarządza nim.

Część aplikacji działająca na Microdroid w pVM jest odpowiedzialna za wykonywanie wszelkich zadań, które muszą być wykonane bezpiecznie.

Aby uruchomić część pVM aplikacji i komunikować się z nią, aplikacja hosta tworzy pVM i uruchamia natywną bibliotekę współdzieloną w Twojej bibliotece w pVM. Ta biblioteka implementuje usługę spoiwa, której część aplikacji używa do komunikacji z częścią aplikacji w maszynie pVM. Rysunek 1 przedstawia dwie części aplikacji i kanał komunikacyjny segregatora:

Ładowanie i komunikacja aplikacji AVF

Rysunek 1. Ładowanie i komunikacja aplikacji AVF

Skonfiguruj plik konfiguracyjny

Twój plik vm_config.json powinien zawierać wpis dotyczący systemu operacyjnego pVM i biblioteki współdzielonej. Poniższy plik assets/vm_config.json przedstawia wpisy pliku konfiguracyjnego dla Microdroid i współdzielonej biblioteki natywnej:

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

Zaimplementuj usługę segregatora

W swojej bibliotece udostępnionej zaimplementuj usługę segregatora. Na przykład:

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

Utwórz kod aplikacji

W części aplikacji hostującej utwórz kod, który przygotowuje plik konfiguracyjny, ładuje (lub tworzy) dojście do maszyny wirtualnej i uruchamia maszynę wirtualną. Na przykład:

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

Komunikuj się z częścią aplikacji dotyczącą maszyn wirtualnych

Aby komunikować się z częścią aplikacji dotyczącą maszyny wirtualnej, najpierw zarejestruj wywołanie zwrotne, aby otrzymać powiadomienie, gdy usługa powiązania zostanie uruchomiona na maszynie wirtualnej. Po powiadomieniu łączysz się z serwerem bindera, a następnie rozmawiasz z serwerem 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 demonstrującej kroki opisane w tym dokumencie, zapoznaj się z MicrodroidDemo .