Написать приложение AVF

Приложение, совместимое с AVF, состоит из двух частей: часть приложения, работающая на хостовой ОС Android, и часть приложения, работающая на Microdroid в pVM.

Часть приложения, работающая на Android, реализует пользовательский интерфейс, неконфиденциальную бизнес-логику, а также создает и управляет жизненным циклом pVM.

Часть приложения, работающая на Microdroid в рамках pVM, отвечает за выполнение любых задач, которые должны выполняться безопасно.

Для запуска и взаимодействия с частью pVM вашего приложения ваше хост-приложение создает pVM и запускает собственную общую библиотеку в pVM. Эта библиотека реализует службу связующего, которую хост-часть приложения использует для взаимодействия с частью приложения в pVM. На рисунке 1 показаны две части приложения и канал связи связующего:

Загрузка и связь приложения AVF

Рисунок 1. Загрузка и связь приложения AVF

Настройте файл конфигурации

Ваш файл vm_config.json должен иметь запись для операционной системы pVM и общей библиотеки. Следующий файл assets/vm_config.json показывает записи файла конфигурации для Microdroid и общей собственной библиотеки:

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

Внедрить услугу переплета

В вашей общей библиотеке реализуйте службу подшивки. Например:

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

Взаимодействие с виртуальной машиной (ВМ) вашего приложения

Чтобы взаимодействовать с частью VM вашего приложения, вы сначала регистрируете обратный вызов, чтобы получать уведомления о готовности службы Binder на VM. Получив уведомление, вы подключаетесь к серверу 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 .