AVF 앱 작성

AVF 호환 앱은 호스트 Android OS에서 실행되는 앱 부분과 pVM 내의 Microdroid에서 실행되는 앱 부분, 이렇게 두 부분으로 구성됩니다.

Android에서 실행되는 앱의 일부는 사용자 인터페이스와 기밀이 아닌 비즈니스 로직을 구현하고 pVM의 수명 주기를 만들고 관리합니다.

pVM 내의 Microdroid에서 실행되는 앱 부분은 안전하게 실행해야 하는 모든 작업 실행을 담당합니다.

앱의 pVM 부분을 실행하고 이와 통신하기 위해 호스트 애플리케이션은 pVM을 만들고 pVM 내의 라이브러리에서 네이티브 공유 라이브러리를 실행합니다. 이 라이브러리는 앱의 호스트 부분이 pVM 내의 앱 부분과 통신하는 데 사용하는 바인더 서비스를 구현합니다. 그림 1은 애플리케이션과 바인더 통신 채널의 두 부분을 보여줍니다.

AVF 앱 로드 및 통신

그림 1. AVF 앱 로드 및 통신

구성 파일 설정

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를 참고하세요.