כתיבה של אפליקציית 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

מטמיעים שירות 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.