Приложение, совместимое с AVF, состоит из двух частей: одна работает в основной ОС Android, а другая – в Microdroid в pVM.
Часть приложения, работающая на Android, реализует пользовательский интерфейс, неконфиденциальную бизнес-логику, а также создает и управляет жизненным циклом pVM.
Часть приложения, которая работает на Microdroid в pVM, отвечает за выполнение задач, требующих повышенной безопасности.
Чтобы запустить pVM и взаимодействовать с ней, основное приложение создает pVM и запускает в ней нативную общую библиотеку. Эта библиотека реализует сервис Binder, который используется основной частью приложения для связи с частью приложения в pVM. На рисунке 1 показаны две части приложения и канал связи Binder:
Как настроить файл конфигурации
В файле vm_config.json должна быть запись об операционной системе и общей библиотеке виртуальной машины. В следующем файле assets/vm_config.json показаны записи файла конфигурации для Microdroid и общей нативной библиотеки:
{
"os": {
"name": "microdroid"
},
"task": {
"type": "microdroid_launcher",
"command": "MicrodroidTestNativeLib.so"
}
}
Реализуйте сервис связывания
Реализуйте сервис Binder в общей библиотеке. Пример:
extern "C"
int android_native_main(int, char**) {
// Implement your binder service here
}
Как создать код приложения
В основной части приложения создайте код, который подготавливает файл конфигурации, загружает (или создает) дескриптор виртуальной машины и запускает ее. Пример:
// 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();
Как взаимодействовать с частью приложения, работающей на ВМ
Чтобы взаимодействовать с частью приложения, работающей на виртуальной машине, сначала зарегистрируйте обратный вызов, который будет уведомлять вас о готовности сервиса связывания на виртуальной машине. Когда вы получаете уведомление, вы подключаетесь к серверу Binder и взаимодействуете с ним с помощью специального интерфейса AIDL. Пример:
// 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();
Чтобы скачать исходный код демонстрационного приложения, в котором показаны описанные в этом документе шаги, перейдите на страницу MicrodroidDemo.