與 AVF 相容的應用程式有兩個部分:在主機 Android OS 上執行的應用程式部分,以及在 pVM 中透過 Microdroid 執行的應用程式部分。
在 Android 上執行的應用程式部分會實作使用者介面、非機密的商業邏輯,並建立及管理 pVM 的生命週期。
在 pVM 中執行 Microdroid 的應用程式部分,負責執行需要安全執行的任何工作。
如要啟動應用程式的 pVM 部分並與其通訊,主機應用程式會建立 pVM,並在 pVM 中執行原生共用程式庫。這個程式庫會實作繫結器服務,應用程式主機部分會使用這項服務,與 pVM 中的應用程式部分通訊。圖 1 顯示應用程式的兩個部分,以及繫結器通訊管道:
設定設定檔
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 部分通訊,您必須先註冊回呼,以便在 VM 上的繫結器服務就緒時收到通知。收到通知時,您可以連線至繫結器伺服器,然後使用自訂 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。