เขียนแอป AVF

แอปที่เข้ากันได้กับ AVF ประกอบด้วย 2 ส่วน ได้แก่ ส่วนที่แอปทำงานบนระบบปฏิบัติการ Android ของโฮสต์ และส่วนที่ทำงานบน Microdroid ภายใน pVM

ส่วนของแอปที่ทำงานบน Android จะใช้อินเทอร์เฟซผู้ใช้ ตรรกะทางธุรกิจที่ไม่เป็นความลับ และสร้างและจัดการวงจรชีวิตของ VM

ส่วนของแอปที่ทำงานบน Microdroid ภายใน pVM จะมีหน้าที่รับผิดชอบในการดําเนินการใดๆ ที่ต้องทําอย่างปลอดภัย

หากต้องการเปิดและสื่อสารกับส่วน pVM ของแอป แอปพลิเคชันโฮสต์จะสร้าง pVM และเรียกใช้ไลบรารีที่แชร์แบบเนทีฟภายใน pVM ไลบรารีนี้ใช้บริการ Binder ที่ส่วนโฮสต์ของแอปใช้เพื่อสื่อสารกับส่วนของแอปภายใน pVM รูปภาพ 1 แสดง 2 ส่วนของแอปพลิเคชันและช่องทางการสื่อสารของ 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
}

สร้างโค้ดแอป

ในส่วนโฮสต์ของแอป ให้สร้างโค้ดที่เตรียมไฟล์การกําหนดค่า โหลด (หรือสร้าง) แฮนเดิลไปยัง 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