نوشتن برنامه AVF

برنامه سازگار با AVF دو بخش دارد: بخشی از برنامه که در سیستم‌عامل میزبان Android اجرا می‌شود و بخشی از برنامه که در Microdroid در pVM اجرا می‌شود.

بخشی از برنامه که در Android اجرا می‌شود، میانای کاربر و منطق کسب‌وکار غیرمحرمانه را پیاده‌سازی می‌کند و چرخه حیات pVM را ایجاد و مدیریت می‌کند.

بخشی از برنامه که در Microdroid و در pVM اجرا می‌شود مسئول انجام هرگونه وظیفه‌ای است که باید به‌صورت ایمن انجام شود.

برای راه‌اندازی و برقراری ارتباط با بخش pVM برنامه، برنامه میزبان شما یک pVM ایجاد می‌کند و یک کتابخانه مشترک بومی را در pVM اجرا می‌کند. این کتابخانه سرویس اتصال‌دهنده‌ای را پیاده‌سازی می‌کند که بخش میزبان برنامه از آن برای برقراری ارتباط با بخش برنامه در pVM استفاده می‌کند. شکل ۱ دو بخش برنامه و کانال ارتباطی چسباننده را نشان می‌دهد:

بار کردن و ارتباط برنامه AVF

شکل ۱. بار کردن و ارتباط برنامه 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();

برقراری ارتباط با بخش ماشین مجازی برنامه شما

برای ارتباط با بخش ماشین مجازی برنامه‌تان، ابتدا یک پاسخ‌گویی ثبت می‌کنید تا وقتی سرویس چسبان در ماشین مجازی آماده شد به شما اطلاع داده شود. وقتی مطلع شدید، به سرور 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 مراجعه کنید.