แอปที่เข้ากันได้กับ AVF มี 2 ส่วน ได้แก่ ส่วนของแอปที่ทำงานบนระบบปฏิบัติการ Android ของโฮสต์ และส่วนของแอปที่ทำงานบน Microdroid ภายใน pVM
ส่วนของแอปที่ทำงานบน Android จะใช้ส่วนติดต่อผู้ใช้ ตรรกะทางธุรกิจที่ไม่เป็นความลับ รวมถึงสร้างและจัดการวงจรของ pVM
ส่วนของแอปที่ทำงานบน Microdroid ภายใน pVM มีหน้าที่รับผิดชอบในการ ดำเนินงานใดๆ ที่ต้องดำเนินการอย่างปลอดภัย
หากต้องการเปิดตัวและสื่อสารกับส่วน pVM ของแอปพลิเคชันโฮสต์ ของคุณจะสร้าง pVM และเรียกใช้ไลบรารีที่ใช้ร่วมกันแบบเนทีฟ ภายใน pVM ไลบรารีนี้ใช้บริการ Binder ที่ส่วนโฮสต์ ของแอปใช้เพื่อสื่อสารกับส่วนของแอปภายใน pVM รูปที่ 1 แสดงส่วนทั้ง 2 ของแอปพลิเคชันและช่องทางการสื่อสาร 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
}
สร้างรหัสแอป
ในส่วนโฮสต์ของแอป ให้สร้างโค้ดที่เตรียมไฟล์กำหนดค่า โหลด (หรือสร้าง) แฮนเดิลไปยัง VM และเรียกใช้ VM เช่น
// 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 ของแอป
หากต้องการสื่อสารกับส่วน VM ของแอป คุณต้องลงทะเบียนการเรียกกลับก่อน เพื่อรับการแจ้งเตือนเมื่อบริการ Binder ใน 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
