เขียนแอป AVF

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

ส่วนของแอปที่ทำงานบน Android จะใช้ UI, ตรรกะทางธุรกิจที่ไม่เป็นความลับ และสร้างและจัดการวงจรการทำงานของ pVM

ส่วนของแอปที่ทำงานบน 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