یک برنامه AVF بنویسید

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

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

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

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

بارگیری و ارتباط برنامه 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();

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

برای ارتباط با بخش ماشین مجازی برنامه‌تان، ابتدا یک فراخوانی (callback) ثبت می‌کنید تا وقتی سرویس اتصال‌دهنده (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 مراجعه کنید.