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