Napisz aplikację AVF

Aplikacja zgodna z AVF składa się z 2 części: części aplikacji działającej na hoście z systemem operacyjnym Android i tej części aplikacji uruchomionej na mikrodroidzie w pVM.

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

Część aplikacji uruchomionej w ramach mikrodroidu (w ramach pVM) odpowiada za wykonanie wszystkich zadań, które trzeba wykonać w bezpieczny sposób.

Aby uruchomić maszynę wirtualną typu pVM i się z nią komunikować, aplikacja hosta tworzy maszynę wirtualną i uruchamia w niej natywną bibliotekę współdzieloną. Ta biblioteka implementuje usługę tworzenia powiązań, której hostowana część aplikacji komunikuje się z częścią aplikacji w ramach maszyny wirtualnej. Rysunek 1 przedstawia 2 części aplikacji i kanał komunikacji z powiązaniem:

Ładowanie aplikacji i komunikacja przez AVF

Rysunek 1. Ładowanie aplikacji i komunikacja przez AVF

Ustawianie pliku konfiguracji

Plik vm_config.json powinien zawierać wpis systemu operacyjnego pVM i biblioteki współdzielonej. Ten plik assets/vm_config.json zawiera wpisy plików konfiguracyjnych mikrodroida i współdzielonej biblioteki natywnej:

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

Wdrażanie usługi powiązania

W zasobach wspólnych zaimplementuj usługę tworzenia powiązań. Na przykład:

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

Utwórz kod aplikacji

W części aplikacji utwórz kod, który przygotowuje plik konfiguracji, wczytuje (lub tworzy) nick dla maszyny wirtualnej i uruchamia ją. 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 maszyną wirtualną w części aplikacji

Aby komunikować się z maszyną wirtualną w aplikacji, najpierw zarejestruj wywołanie zwrotne, aby otrzymać powiadomienie, gdy usługa powiązania w maszynie wirtualnej będzie gotowa. Po otrzymaniu powiadomienia nawiązujesz połączenie z serwerem powiązania, a następnie komunikujesz się 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 w wersji demonstracyjnej ilustrującej kroki opisane w tym dokumencie, zapoznaj się z informacjami o MicrodroidDemo.