כתוב אפליקציית AVF

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

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

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

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

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

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

הגדר את קובץ התצורה

לקובץ 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(), "asssets/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 .