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",
}
}
바인더 서비스 구현
공유 라이브러리 내에서 바인더 서비스를 구현합니다. 예:
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 부분과 통신하려면 먼저 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를 참고하세요.