Một ứng dụng tương thích với AVF có hai phần: Phần của ứng dụng chạy trên hệ điều hành Android trên máy chủ và phần của ứng dụng chạy trên Microdroid trong pVM.
Phần ứng dụng chạy trên Android triển khai giao diện người dùng, logic nghiệp vụ không bảo mật, đồng thời tạo và quản lý vòng đời của pVM.
Phần ứng dụng chạy trên Microdroid trong một pVM có trách nhiệm thực hiện mọi tác vụ cần được thực hiện một cách an toàn.
Để khởi chạy và giao tiếp với phần pVM của ứng dụng, ứng dụng lưu trữ sẽ tạo một pVM và chạy một thư viện dùng chung gốc trong pVM. Thư viện này triển khai dịch vụ liên kết mà phần máy chủ lưu trữ của ứng dụng dùng để giao tiếp với phần ứng dụng trong pVM. Hình 1 cho thấy hai phần của ứng dụng và kênh giao tiếp liên kết:
Thiết lập tệp cấu hình
Tệp vm_config.json
phải có mục nhập cho hệ điều hành và thư viện dùng chung của pVM. Tệp assets/vm_config.json
sau đây cho thấy các mục nhập tệp cấu hình cho Microdroid và thư viện gốc dùng chung:
{
"os": {
"name": "microdroid"
},
"task": {
"type": "microdroid_launcher",
"command": MicrodroidTestNativeLib.so",
}
}
Triển khai dịch vụ liên kết
Trong thư viện dùng chung, hãy triển khai dịch vụ liên kết. Ví dụ:
extern "C"
int android_native_main(int, char**) {
// Implement your binder service here
}
Tạo mã ứng dụng
Trong phần máy chủ của ứng dụng, hãy tạo mã chuẩn bị tệp cấu hình, tải (hoặc tạo) một tay điều khiển đến máy ảo và chạy máy ảo. Ví dụ:
// 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();
Kết nối với phần máy ảo trong ứng dụng
Để giao tiếp với phần máy ảo của ứng dụng, trước tiên, bạn cần đăng ký một lệnh gọi lại để nhận thông báo khi dịch vụ liên kết trên máy ảo đã sẵn sàng. Khi được thông báo, bạn sẽ kết nối với máy chủ liên kết, sau đó trò chuyện với máy chủ bằng giao diện AIDL tuỳ chỉnh. Ví dụ:
// 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();
Để tải mã nguồn cho một ứng dụng minh hoạ các bước trong tài liệu này, hãy tham khảo MicrodroidDemo.