Windows の Hyper-V を無効化して Android 開発用に HAXM へ切り替える

## はじめに

これまで Hyper-V で仮想マシンを利用していた Windows PC で Android アプリ開発を行うため、折角なので HAXM (Intel Hardware Accelerated Execution Manager) を利用して、Android エミュレータを高速化することにしました。

いろいろと調べてみると、下記制約などがあるとのこと。

1. CPU が Intel 製であること（ Ryzen などの AMD 製 CPU では利用できない）

    → Intel Core i5 なので OK

2. CPU が仮想化支援機能 (VT-x) をサポートしていること

    → こちらも Intel Core i5 なので OK

3. BIOS や UEFI で仮想化支援機能 (VT-x) が有効化されていること

    → Hyper-V を利用していたからOK

4. Windows が仮想化支援機能 (VT-x) を認識していること

    → こちらも Hyper-V を利用していたからOK

5. Microsoft Hyper-V が有効化されていないこと

    → なんですと！

Microsoft の情報を見てみると、下記文章がありました。

[エミュレーターのパフォーマンスのためのハードウェア高速化 (Hyper-V と HAXM)](https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/hardware-acceleration?pivots=windows)

> Windows で最適なエクスペリエンスを実現するには、HAXM を使用して Android エミュレーターを高速化することをお勧めします。 コンピューターで HAXM を使用できない場合は、Windows ハイパーバイザー プラットフォーム (WHPX) を使用できます。

[Android Emulator のトラブルシューティング](https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/troubleshooting?pivots=windows)
> Intel HAXM および Microsoft HYPER-V の両方を同時にアクティブ化することはできません。 残念ながら、コンピューターを再起動せずに Hyper-V と HAXM を切り替える方法はありません。

> Windows 10 April 2018 Update (ビルド 1803) 以降を使用している場合は、Android Emulator のバージョン 27.2.7 以降で (HAXM ではなく) Hyper-V を使用してハードウェアを高速化できるため、Hyper-V を無効にする必要はありません。

ざっくり整理してみました。

* Windows 10 April 2018 Update (ビルド 1803) 以降を使用している場合は、
Hyper-V と Windows Hypervisor Platform (WHPX) で高速化できる。
* ただし HAXM には劣るため、Hyper-V を無効化して HAXM での高速化がおススメ。

というわけで、Hyper-V を無効化し、HAXM を有効化していきます。

ちなみに、Hyper-V を無効化せずに HAXM をインストールすると下記のようなエラーが発生します。

```text
This computer does not support Intel Virtualization Technology (VT-x) or it is being exclusively used by Hyper-V. HAXM cannot be installed. 
Please ensure Hyper-V is disabled in Windows Features, or refer to the Intel HAXM documentation for more information.
```

## 環境

* Windows 10 Pro x64 1903
* Android Studio 3.5.3

## Hyper-V を無効化する

1. 「コントロール パネル」 → 「プログラムと機能」 → 「Windowsの機能の有効化または無効化」で、「Hyper-V」のチェックボックスをはずして「OK」をクリックします。
    ![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283306/281115b3-4bc4-9191-dd16-1eee0c0d706b.jpeg)

2. 念のために「Windowsの機能の有効化または無効化」で「Windows ハイパーバイザープラットフォーム」のチェックボックスもはずれていることを確認しておきます。
    ![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283306/f3596190-8bb8-ec00-7422-053294e0f130.jpeg)

3. Windows を再起動します。

    > この再起動を必ず行わないと無効化が完了しないので注意すること。

4. 下記コマンドの実行でも無効化できます。

``` powershell
> Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor
```

## Hyper-V を無効化できない場合は Device Guard と Credential Guard を無効化する

> Hyper-V の無効化が失敗する場合は、下記手順で Device Guard を無効化します。

1. ファイル名を指定して実行で「gpedit.msc」を実行し、「ローカルグループポリシーエディター」を実行します。

2. 「ローカルグループポリシーエディター」で、コンピューターの構成 → 管理用テンプレート → システム → Device Guard の「仮想化ベースのセキュリティを有効にする」を、無効または未構成に設定します。
    ![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283306/ef56b008-6cb4-741a-04ae-72fcbba7ca97.jpeg)

## どうしても同居させておきたい場合

1. 必要に応じてHyper-Vの有効と無効を切り替えます。

2. 有効化（必ず再起動する）

```powershell
> bcdedit /set hypervisorlaunchtype auto
```

3. 無効化（必ず再起動する）

```powershell
> bcdedit /set hypervisorlaunchtype off
```

## HAXM をインストールして有効化する

1. Android Studio を利用している場合は、SDK Manager の SDK Tools タブで「Intel x86 Emulator Accelerator (HAXM installer)」を選択してインストールを行います。

2. Intel の Web サイト([intel/haxm](https://github.com/intel/haxm))から Windows 版の最新のインストーラーをダウンロードしてインストールを行うことも可能です。

3. メモリーサイズの割り当てでは、無理なく余裕のあるメモリーサイズを設定しておきます。

4. エミュレーターで動作させるシステムイメージを、SDK Manager の SDK Platform タブで選択してダウンロードします。

    > ARM ベースのシステムイメージは高速化されないため、必ず x86 ベースのシステムイメージを選択する必要があります。  

## HAXM のインストール状況を確認する

HAXM がインストールされている場合は、下記コマンドでHAXMプロセスの状態を確認できます。

```powershell
> sc query intelhaxm
```

## AVD を作成する

1. Android Studio の AVD Manager を起動し、「Create Virtual Device」をクリックして、必要な構成のデバイスを選択します。

2. システムイメージの選択では、x86 Images タブでシステムイメージを選択し、名前などを設定して Android 仮想デバイスを作成します。

    > CPU/ABI が x86 ベースであることを確認します。

    ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283306/8b1acf6e-4fae-dbd5-218d-e07cc2b393c3.png)

## AVD を起動して設定する

1. 作成した Android 仮想デバイスの「▶」をクリックして起動します。

2. しばらく待つと Android が起動するので、いくつか設定を行っておきます。

3. Settingsアプリ → System → Languages & input → Languages → Add a language → 「日本語」を追加し、「日本語」を1番上に移動

4. 設定アプリ → システム → 言語と入力 → 仮想キーボード → GBoard → 言語 → 「日本語」を追加し、「QWERTY」を選択

5. 設定アプリ → システム → 日付と時刻 → タイムゾーンの選択 → タイムゾーンの自動設定 = OFF → タイムゾーンの選択 → タイムゾーン → 「東京」を選択