كتابة تطبيق AVF

يتضمّن التطبيق المتوافق مع "إطار عمل Android الظاهري" جزأين: جزء التطبيق الذي يعمل على نظام التشغيل Android المضيف، وجزء التطبيق الذي يعمل على Microdroid داخل جهاز pVM.

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

يكون الجزء من التطبيق الذي يتم تشغيله على Microdroid، ضمن جهاز pVM، مسؤولاً عن تنفيذ أي مهام يجب تنفيذها بشكل آمن.

لبدء جزء pVM من تطبيقك والتواصل معه، ينشئ التطبيق المضيف جهاز pVM ويشغّل مكتبة برمجية أصلية مشترَكة داخل جهاز pVM. تنفّذ هذه المكتبة خدمة ربط يستخدمها جزء التطبيق المضيف للتواصل مع جزء التطبيق داخل جهاز pVM. يوضّح الشكل 1 جزأَي التطبيق وقناة الاتصال عبر Binder:

تحميل تطبيق "إطار الفيديو التلقائي" والتواصل

الشكل 1. تحميل تطبيق AVF والتواصل

إعداد ملف الضبط

يجب أن يتضمّن ملف vm_config.json إدخالاً لنظام تشغيل الجهاز الظاهري المحمي (pVM) والمكتبة المشتركة. يعرض ملف assets/vm_config.json التالي إدخالات ملف الإعدادات لـ Microdroid ومكتبة أصلية مشترَكة:

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

تنفيذ خدمة Binder

داخل المكتبة المشترَكة، نفِّذ خدمة ربط. مثلاً:

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 على الجهاز الافتراضي جاهزة. عند تلقّي الإشعار، يمكنك الاتصال بخادم 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.