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

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

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

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

برای راه اندازی و برقراری ارتباط با بخش pVM برنامه خود، برنامه میزبان شما یک pVM ایجاد می کند و یک کتابخانه مشترک بومی را در کتابخانه شما در داخل pVM اجرا می کند. این کتابخانه یک سرویس binder را پیاده سازی می کند که بخش میزبان برنامه از آن برای برقراری ارتباط با بخشی از برنامه در یک 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
}

کد برنامه ایجاد کنید

در بخش میزبان برنامه خود، کدی ایجاد کنید که فایل پیکربندی را آماده می‌کند، یک دسته را در VM بارگیری می‌کند (یا ایجاد می‌کند) و VM را اجرا می‌کند. مثلا:

// Prepare the configuration file
VirtualMachineConfig config = new VirtualMachineConfig
  .Builder(getApplication(), "asssets/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 برنامه خود ارتباط برقرار کنید

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