كتابة تطبيق AVF

يحتوي التطبيق المتوافق مع AVF على جزأين: جزء التطبيق الذي يعمل على الجهاز المضيف Android OS وجزء التطبيق الذي يتم تشغيله على Microdroid داخل جهاز افتراضي (pVM).

ينفِّذ الجزء الذي يعمل على نظام التشغيل Android واجهة المستخدم ومنطق الأعمال غير السري، وينشئ دورة حياة الأجهزة الافتراضية ويديرها.

الجزء من التطبيق الذي يتم تشغيله على Microdroid، داخل الجهاز الافتراضي، هو المسئول عن أداء أي مهام يجب إجراؤها بأمان.

لإطلاق الجزء المخصّص للجهاز الافتراضي (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
}

إنشاء رمز التطبيق

في جزء المضيف من تطبيقك، أنشِئ رمزًا لإعداد ملف الضبط، وتحميل (أو إنشاء) معرّف للجهاز الافتراضي (VM)، ثم تشغيل الجهاز الافتراضي (VM). على سبيل المثال:

// 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) في تطبيقك

للتواصل مع جزء الجهاز الافتراضي (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.