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 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ć maszynę wirtualną typu pVM i się z nią komunikować, aplikacja hosta tworzy maszynę wirtualną i uruchamia w niej 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:
Konfigurowanie pliku konfiguracji
Plik vm_config.json
powinien zawierać wpis dotyczący systemu operacyjnego pVM i biblioteki współdzielonej. 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",
}
}
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 hosta aplikacji utwórz kod, który przygotuje plik konfiguracji, załaduje (lub utworzy) uchwyt maszyny wirtualnej i uruchomi 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();
Komunikowanie się z częścią aplikacji na maszynie wirtualnej
Aby komunikować się z częścią aplikacji na maszynie wirtualnej, najpierw zarejestruj 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. 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.