Ứng dụng tương thích với AVF có 2 phần: Phần ứng dụng chạy trên hệ điều hành Android lưu trữ và phần ứ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 kinh doanh không bí 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 pVM, chịu 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 một dịch vụ binder mà phần 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 2 phần của ứng dụng và kênh giao tiếp binder:
Thiết lập tệp cấu hình
Tệp vm_config.json phải có một mục 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 trong tệp cấu hình cho Microdroid và một thư viện gốc dùng chung:
{
"os": {
"name": "microdroid"
},
"task": {
"type": "microdroid_launcher",
"command": "MicrodroidTestNativeLib.so"
}
}
Triển khai dịch vụ binder
Trong thư viện dùng chung, hãy triển khai một dịch vụ binder. Ví dụ:
extern "C"
int android_native_main(int, char**) {
// Implement your binder service here
}
Tạo mã ứng dụng
Trong phần lưu trữ 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 trình xử lý cho VM và chạy VM. 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();
Giao tiếp với phần VM của ứng dụng
Để giao tiếp với phần VM của ứng dụng, trước tiên, bạn phải đăng ký một lệnh gọi lại để được thông báo khi dịch vụ binder trên VM đã sẵn sàng. Khi được thông báo, bạn sẽ kết nối với máy chủ binder rồi giao tiếp 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.