[Flutter開発]AndroidエミュレータをAMDのCPUで動作させる

# はじめに
AndroidとiOSの両方で動作するアプリを一つのコードから生成できるFlutter、いいですよね！
<img width="500" alt="Flutter.png" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/54eeb414-ea7f-8fd4-52ae-332dbbcc13ce.png">

私は以下の書籍を参考に環境構築や学習を進めたのですが、しょっぱなの環境構築で使用するPCのCPUに絡むハマりポイントがありましたので、これからFlutterでのスマホアプリ開発を始める方の参考になればと思います。

<img width="250" alt="Flutter入門.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/44e72b2d-0b13-1184-ecf7-6309c24921ed.jpeg">
[Android/iOSクロス開発 フレームワークFlutter入門](https://www.shuwasystem.co.jp/book/9784798055831.html)

# 何が問題になったか
## 環境
* Windows 10 Home
* AMD Ryzen5 2500U
* Android Studio 3.4.2

## 問題の概要
Flutterの開発はAndroid Studio（もしくはVisual Studio）を使って進めるのですが、Androidでの動作確認は実機接続もしくはPC上で動作するAndroidエミュレータで行います。
ところがこのAndroidエミュレータ、デフォルトではIntelのCPUを搭載したPCでしか動作しません。

というのも、Androidエミュレータを動作させるには、セットでIntelのIntel Hardware Accelerated Execution Manager(HAXM)というものも使っており、そのままではAMDのCPUを搭載したPCでは動作しないのです。

「Flutter入門」の書籍を参考に、AVD Managerを使てAndroidエミュレータで仮想デバイスを作成するところまではできますが、仮想デバイスを起動しようとすると搭載しているCPUに対してHAXMがサポート対象外というエラーが発生して起動できません。
<img width="500" alt="vda.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/ab0aa92a-3afe-bdbe-2a4e-55cc2714cd61.png">

## PCのCPUは何だったのか？
CPUは今流行り（？）のAMD Ryzenです。
IntelのCPU搭載機に対して同程度の性能で安価に購入できるし、今時CPUの種類によって動作の違いが出るなんて思いもよらなかったので、PCを購入したときはそれほど気にも留めなかったのですが、こんなところで問題になるとは。。。

自宅の開発で使用しているPCはHPのENVY360というノートPCなのですが、IntelのCPUを搭載している機種とAMD Ryzenを搭載している機種があり、AMD Ryzenを搭載している機種の方が割安なのです。（当然というか、こっちのほうが人気）
<img width="500" alt="envy.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/d93ef573-119a-7cd8-44c4-baa09ef74610.jpeg">

# どう対処したか
## まずは調査
ネットで調べたところ、以下のような記事を発見しました。
[「Android Emulator」がAMD製CPUをサポート、「Hyper-V」での利用も可能に](https://forest.watch.impress.co.jp/docs/news/1132197.html)

この記事によると、AndroidのエミュレータがAMDのCPUもサポートしたと書かれています。ですが、私のRyzenのPCではエミュレータが動作しません。
何故だ。。。

記事をよく読んでみると以下のように書かれています。
> Intel製CPUを搭載した環境では、これまで通り「HAXM」が既定の仮想化ソリューションとなるが、「Android Emulator」を「Hyper-V」で動作させることも可能。

つまり、Androidエミュレータを動作させる仮想化ツールについて、IntelのCPUを搭載した環境ではHAXMを使用し、AMDを搭載したCPUではMicrosoftのHyper-Vを使用することができるようになったようです。
ありがたやありがたや。。。

## Hyper-Vを有効にする
スタートメニューで「プログラムとファイルの検索」に「機能の有効化」と入力すると「Windows の機能の有効化または無効化」が候補に出るので、それを選択します。
<img width="400" alt="start.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/d987ae2f-bd00-ee77-fd70-f648213ef5b5.png">

「Windows の機能の有効化または無効化」画面が表示されるので、「Windows ハイパーバイザー プラットフォーム」にチェックをつけてOKボタンを押します。
<img width="500" alt="setting1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/56bb2484-4cd2-bf89-6f62-a72d4767e5d8.png">

コマンドプロンプトを立ち上げて、systeminfoというコマンドを実行してHyper-Vが有効になっているかを確認します。
「ハイパーバイザーが検出されました。」と表示されていれば、Hyper-Vは有効になっています。

```
> systeminfo
Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```

## 上記の手順でHyper-Vが有効にならない場合
コマンドプロンプトでsysteminfoというコマンドを入れたときに以下のような表示になった場合は、PCのBIOSレベルで仮想化が有効になっていないので、BIOSの設定を変更する必要があります。

```
> systeminfo
Hyper-V の要件:         ファームウェアで仮想化が有効になっています: いいえ
```

BIOSの設定変更はPCのメーカー（自作PCの場合はマザーボードのメーカー）によって異なるのですが、大体はググれば情報が出てくるはずです。
HPの場合も丁寧に画像付きで仮想化を有効にする手順を紹介してくれています。
[Notebook PC シリーズ - BIOS で [Virtualization Technology] を有効にするには](https://support.hp.com/jp-ja/document/c03836690)

BIOSで仮想化を有効にして、コマンドプロンプトでsysteminfoコマンドを入力して「ハイパーバイザーが検出されました。」と表示されれば準備はOKです！

```
> systeminfo
Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```

# Androidエミュレータによる仮想デバイスの起動確認
Android Studioの「Android Virtual Device Manager」を起動し、Androidエミュレータで仮想デバイスを起動できればOKです。
<img width="250" alt="emulator.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329353/6c4b818d-1ab9-138d-1102-674d882b15ea.png">