เขียนแอพ AVF

แอปที่เข้ากันได้กับ AVF มีสองส่วน: ส่วนของแอปที่ทำงานบนโฮสต์ Android OS และส่วนของแอปที่ทำงานบน 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 ตัวอย่างเช่น:

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 ของแอป คุณจะต้องลงทะเบียนการติดต่อกลับเพื่อรับการแจ้งเตือนเมื่อบริการ 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