אפליקציה שתואמת ל-AVF מורכבת משני חלקים: החלק של האפליקציה שפועל במערכת ההפעלה Android של המארח, והחלק של האפליקציה שפועל ב-Microdroid בתוך pVM.
החלק של האפליקציה שפועל ב-Android מטמיע את ממשק המשתמש, את הלוגיקה העסקית הלא סודית, ויוצר ומנהל את מחזור החיים של ה-pVM.
החלק של האפליקציה שפועל ב-Microdroid, ב-pVM, אחראי לביצוע משימות שצריכות לבצע באופן מאובטח.
כדי להפעיל את ה-pVM של האפליקציה ולתקשר איתו, האפליקציה המארחת יוצרת pVM ומריצה ספרייה משותפת בתוך ה-pVM. הספרייה הזו מיישמת שירות קישור (binder) שחלק המארח של האפליקציה משתמש בו כדי לתקשר עם החלק של האפליקציה ב-pVM. באיור 1 מוצגים שני החלקים של האפליקציה וערוץ התקשורת של ה-binder:
הגדרת קובץ התצורה
בקובץ vm_config.json
צריכה להיות רשומה למערכת ההפעלה ולספרייה המשותפת של ה-pVM. בקובץ assets/vm_config.json
הבא מוצגות רשומות בקובץ התצורה של Microdroid ושל ספרייה ילידית משותפת:
{
"os": {
"name": "microdroid"
},
"task": {
"type": "microdroid_launcher",
"command": MicrodroidTestNativeLib.so",
}
}
הטמעת שירות ה-binder
מטמיעים שירות 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();
תקשורת עם החלק של המכונה הווירטואלית באפליקציה
כדי לתקשר עם החלק של ה-VM באפליקציה, קודם צריך לרשום קריאה חוזרת כדי לקבל הודעה כששירות הקישור במכונה הווירטואלית יהיה מוכן. כשמתקבלת התראה, מתחברים לשרת ה-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.