AVF アプリを作成する

AVF 対応アプリは、2 つの部分(ホストの Android OS 上で実行されるアプリ部分と pVM 内の Microdroid 上で実行されるアプリ部分)で構成されています。

Android 上で実行されるアプリ部分は、ユーザー インターフェース、機密性のないビジネス ロジックを実装し、pVM のライフサイクルを作成、管理します。

Microdroid 上で実行されるアプリ部分は、pVM 内で、安全に実行する必要があるすべてのタスクを実行します。

アプリの pVM 部分を起動して通信するために、ホストアプリは pVM を作成し、pVM 内のライブラリでネイティブ共有ライブラリを実行します。このライブラリは、アプリのホスト部分が pVM 内のアプリ部分との通信に使用するバインダー サービスを実装しています。図 1 は、アプリの 2 つの部分とバインダーの通信チャネルを示しています。

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 をご覧ください。