يحتوي التطبيق المتوافق مع AVF على جزأين: جزء التطبيق الذي يعمل على الجهاز المضيف Android OS وجزء التطبيق الذي يتم تشغيله على Microdroid داخل جهاز افتراضي (pVM).
ينفِّذ الجزء الذي يعمل على نظام التشغيل Android واجهة المستخدم ومنطق الأعمال غير السري، وينشئ دورة حياة الأجهزة الافتراضية ويديرها.
الجزء من التطبيق الذي يتم تشغيله على Microdroid، داخل الجهاز الافتراضي، هو المسئول عن أداء أي مهام يجب إجراؤها بأمان.
لإطلاق الجزء المخصّص للجهاز الافتراضي (PVM) من التطبيق والتواصل معه، ينشئ التطبيق المضيف جهاز كمبيوتر افتراضي (pVM) ويشغِّل مكتبة مشتركة أصلية داخل الجهاز الافتراضي (pVM). وتنفذ هذه المكتبة خدمة الربط التي يستخدمها الجزء المضيف من التطبيق للاتصال بجزء التطبيق داخل جهاز افتراضي (pVM). يوضح الشكل 1 جزأين التطبيق وقناة اتصال المثبت:
إعداد ملف الضبط
يجب أن يحتوي ملف 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.