Windows Hypervisor PlatformによるアクセラレーションでAVDを動かす

## 概要
Android SDKに含まれるAndroid Emulatorが、v27.3.1から**Windows Hypervisor Platform（WHPX）**によるアクセラレーションをサポートしたとのことで、従来の**HAXM**との動作を比較してみました。

実はv27.2.7から（密かに？）サポートされていたようですが、Googleの公式リリースに記されたのがv27.3.1からということのようです。なお、この機能を用いるには、Windows 10をバージョン1803にアップグレードする必要があります。

## 作業手順
まずは作業の手順を一通り記します。ベンチマークの内容と結果は次節にまとめます。

### 試験用PCのスペック
Intel Core i7-3770
Intel HD Graphics 4000
メインメモリー24GB (PC3-12800)
Windows 10 Pro バージョン1803

### Android Emulatorのアップデート
（このテストはv27.3のStable版がリリースされていない段階だったため、Canaryを用いています。現在はStable版がリリースされているので、実運用にはそちらを用いましょう。）

まずはAndroid StudioでSettingsを選択して設定を開き、図1の画面でアップデートチャネルをCanary Channelに切り替えます。Check Nowをクリックしてリストを更新しますが、このときAndroid Studio本体のCanary版へのアップデートを問うダイアログが出ます。ここではEmulatorのみアップデートしますので、Ignore This Updateをクリックしてパスします。

|![](https://qiita-image-store.s3.amazonaws.com/0/53988/faa80919-b18c-9f31-252d-2e74191576a6.png)|
|:--|
|図1|

次にSDK Managerを開いて、Android Emulatorのみをアップデートします。更新によってv27.3.3になっていましたので、このバージョンで比較を行います。なお、HAXM（v6.2.1）はインストール済みの状態です。

|![](https://qiita-image-store.s3.amazonaws.com/0/53988/35a74bca-6dd9-d23c-2482-0fbfd170ced0.png)|
|:--|
|図2|

### AVDの作成
試験用のAVDを新規に作成します。DeviceはNexus 5X、System ImageはAPI 26のGoogle APIs x86_64を選択しました。ベンチマークアプリのインストール以外は、一切設定を変更せずに用いました。

### HAXMによるテスト
まずはHAXMによるアクセラレーションでAVDを起動してベンチマークテストを行います。コマンドプロンプトから起動すると、`HAX is working and emulator runs in fast virt mode.`という表示が出力されるので、HAXMが機能していることを確認できます。

|![](https://qiita-image-store.s3.amazonaws.com/0/53988/6ff7c62d-9851-d886-8e44-bb6bfacbf532.png)|
|:--|
|図3|

### Windows Hypervisor Platformのインストール
次に、HAXMをアンインストールしてから、Windows Hypervisor Platformをインストールします。

コントロールパネルを開いて「ソフトウェア」→「Windowsの機能の有効化または無効化」と選択します。開かれたダイアログのリストの中から、「Windowsハイパーバイザープラットフォーム」にチェックを入れてインストールします（要再起動）。なお、資料によってはHyper-V関連のコンポーネントのインストールも必要とするものもありますが、入れなくても影響はないようです。

|![](https://qiita-image-store.s3.amazonaws.com/0/53988/9db96e40-a351-8776-ca74-7427ae98dfc9.png)|
|:--|
|図4|

### Windows Hypervisor Platformによるテスト
再起動したら、Windows Hypervisor PlatformによるアクセラレーションでAVDを起動して同じベンチマークテストを行います。こちらは、起動したときに`Windows Hypervisor Platform accelerator in operational`と表示されます。

|![](https://qiita-image-store.s3.amazonaws.com/0/53988/6e288f3d-c356-3037-f93f-125e74ccad50.png)|
|:--|
|図5|

## ベンチマーク
### ソフトウェアと試験項目
AVD上でAntutuなど重量級のベンチマークを動かすのは難しいと思われるので、かなり古いものですが[0xbench](https://github.com/josephcc/0xbench)を用いました。また、試験項目も2D描画に絞りました。

|![](https://qiita-image-store.s3.amazonaws.com/0/53988/9882b118-19ed-e612-1439-dc19e5dc78cd.png)|
|:--|
|図6|

### 試験結果
単位はfpsです。Windows Hypervisor Platformの方が若干悪い結果になっています。

|Test|HAXM|WHPX|
|:--|:--|:--|
|Draw Canvas|18.102293|15.211219|
|Draw Circle|21.753263|18.533384|
|Draw Circle2|33.67966|31.697042|
|Draw Rect|25.103811|23.606863|
|Draw Arc|30.099747|26.686575|
|Draw Image|26.73352|24.638912|
|Draw Text|36.914715|32.54401|

## 考察
ベンチマークの結果としては、従来のHAXMの方が若干成績が良く、実際の使用感でもその傾向は感じられました。ただ、これまではHAXMを利用するにCPUがIntel製でなければならず、AMD製CPUでWindowsを運用している人にとっては、AVDを高速化する手段がありませんでした。それが、Windows Hypervisor Platformのサポートによってその可能性が拓けたことは朗報です。また、Hyper-Vユーザーにとっても、HAXMとの併用ができずに不便を強いられていた状況が改善されることになります。一方で、これでHAXMが終息に向かうわけではないようなので、当座のところはユーザーの利用形態の幅を広げるものとして併存していくことになるのでしょう。

## 資料
[Emulator 27.3.1 Canary, 27.2.9 Beta | Release Updates | Android Developers](https://androidstudio.googleblog.com/2018/05/emulator-2731-canary-2729-beta.html)
[Windows Hypervisor Platform | Microsoft Docs](https://docs.microsoft.com/en-us/virtualization/api/)
[Intel® Hardware Accelerated Execution Manager (Intel® HAXM) | Intel® Software](https://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager-intel-haxm)
[Android Emulator - AMD Processor & Hyper-V Support | Android Developers Blog](https://android-developers.googleblog.com/2018/07/android-emulator-amd-processor-hyper-v.html)