Napisz aplikację AVF

Aplikacja zgodna z AVF składa się z 2 części: części aplikacji działającej w systemie Android i części aplikacji działającej w Microdroidzie w ramach pVM.

Część aplikacji działająca na Androidzie wdraża interfejs użytkownika, niepoufalną logikę biznesową 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ć wykonywane w bezpiecznym środowisku.

Aby uruchomić część pVM aplikacji i komunikować się z nią, aplikacja hosta tworzy pVM i uruchamia w nim natywną bibliotekę współdzieloną. Biblioteka ta implementuje usługę binder, której część hosta aplikacji używa do komunikacji z częścią aplikacji w pVM. Rysunek 1 przedstawia 2 części aplikacji i kanał komunikacji bindera:

Ładowanie aplikacji AVF i komunikacja

Rysunek 1. Ładowanie aplikacji AVF i komunikacja

Konfigurowanie pliku konfiguracji

Plik vm_config.json powinien zawierać wpis dotyczący systemu operacyjnego pVM i współdzielonej biblioteki. Plik assets/vm_config.json zawiera wpisy pliku konfiguracyjnego Microdroida i wspólnej natywnej biblioteki:

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

Implementacja usługi binder

W bibliotece udostępnionej wprowadź usługę tworzenia skoroszytów. 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 przygotuje plik konfiguracji, załaduje (lub utworzy) uchwyt maszyny wirtualnej i uruchomi maszynę wirtualną. 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();

Komunikowanie się z częścią aplikacji na maszynie wirtualnej

Aby komunikować się z częścią aplikacji na maszynie wirtualnej, musisz najpierw zarejestrować wywołanie zwrotne, aby otrzymywać powiadomienia, gdy usługa binder na maszynie wirtualnej będzie gotowa. Gdy otrzymasz powiadomienie, połącz się z serwerem bindera, a następnie nawiązuj z nim połączenie za pomocą niestandardowego interfejsu AIDL. 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 demonstruje czynności opisane w tym dokumencie, skorzystaj z pliku MicrodroidDemo.