כתיבה של אפליקציית AVF

אפליקציה שתואמת ל-AVF מורכבת משני חלקים: החלק של האפליקציה שפועל במערכת ההפעלה Android של המארח, והחלק של האפליקציה שפועל ב-Microdroid בתוך pVM.

החלק של האפליקציה שפועל ב-Android מטמיע את ממשק המשתמש, את הלוגיקה העסקית הלא סודית, ויוצר ומנהל את מחזור החיים של ה-pVM.

החלק של האפליקציה שפועל ב-Microdroid, בתוך pVM, אחראי לביצוע כל המשימות שצריך לבצע באופן מאובטח.

כדי להפעיל את החלק של האפליקציה ב-pVM ולתקשר איתו, אפליקציית המארח יוצרת pVM ומריצה ספרייה משותפת מקורית בתוך ה-pVM. הספרייה הזו מיישמת שירות קישור (binder) שחלק המארח של האפליקציה משתמש בו כדי לתקשר עם החלק של האפליקציה ב-pVM. באיור 1 מוצגים שני החלקים של האפליקציה וערוץ התקשורת של ה-binder:

טעינה ותקשורת של אפליקציות AVF

איור 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();

תקשורת עם החלק של המכונה הווירטואלית באפליקציה

כדי לתקשר עם החלק של האפליקציה במכונה הווירטואלית, קודם צריך לרשום קריאה חוזרת (callback) כדי לקבל הודעה כששירות הקישור במכונה הווירטואלית יהיה מוכן. כשמתקבלת ההודעה, מתחברים לשרת ה-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.