كتابة تطبيق AVF

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

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

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

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

تحميل تطبيق AVF والتواصل

الشكل 1. تحميل تطبيق "إطار عمل Android للأجهزة الافتراضية" والتواصل معه

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

يجب أن يتضمّن ملف 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.