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