Azure VM 上で Android エミュレータを動かせる開発環境を構築するまでの地獄の長い道のり

# やりたいこと
### ローカルマシンは汚したくない
ローカルマシンはメールやブラウズ、Qiitaの執筆など軽い機能に限定した使い方をして、あまりシステムを汚したくありません。上記だけの仕事ならお安いPCでもよいですし。
**でも私は開発者です！ 開発環境が欲しい！**
ローカルマシンに開発環境を構築すると、どうしてもシステムを汚してしまいます。最悪OSからの再インストール．．．
その間、PCが使えない。銀行振込とかしないといけないのに\(涙\)

そこで考えた、
**仮想マシン上に開発環境を構築しよう！
どうせならクラウドに！
そうしたらマシンや場所を選ばずに開発できるよね！
従量課金だから高性能PC買うより常に安くて速いかも！**

そう、ここから地獄の長い道のりが始まりました。(2020/2/吉日)

- 開発環境をクラウドのVM上に構築する
 - ローカルマシン環境を汚さなくてすむ
 - どこでも開発できる
 - リモートデスクトップで接続するのでローカルマシンは安くて(低性能)良い
 - 従量課金だから高性能PC買うより安いかも

![desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/5ec1527d-b7c0-acc9-8f16-fe7e82b84bc8.png)

# 環境
### クラウド
Windowsアプリやモバイルアプリの開発が主体のため、Windowsの生みの親のクラウド

- Azureを選択

### 仮想マシン
- サイズ:Standard D2 v3
- OS:Windows 10 Pro, Version 1809

### 開発環境
- Android Studio 3.6.1

### エミュレータ
- Microsoft Visual Studio Emulator for Android 1.1.622.2 (VS Emulator)

# 前提・制限
- Azure VM で nested Hyper-V を使うには v3シリーズでないといけない
- VM(Hyper-V) 上では Intel x86 Emulator Accelerator (HAXM) と同居はできない

# 構築手順
1. VMの作成  
Azure の VM は Hyper-v 上で実行されています。その上にAndroidエミュレータを起動するということは、仮想マシン(VM)上に仮想マシン(エミュレータ)を実行するということです。Microsoftでは、Hyper-V上でHyper-Vの仮想マシンを実行することができる `Nested Hyper-V`(入れ子になった仮想化) という機能をサポートしています。Azure でNested Hyper-Vを使用するには、サイズで v3 シリーズを選ぶ必要があります。また、OSはWindows Pro または、Windows Server 2016 以上を選びます。
今回は、D2v3、Windows Pro で作成しました。
![azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/9ae1cd98-9188-97e5-d63a-5dc312aa6a8a.png)
2. VMにソフトウェアをインストール
VM上に`Android Studio` と `VS Emulator` をインストールします。
Andoroid Studio では、Intel CPU を実行するコンピューターのためのハードウェアアクセラレーションである、`HAXM`(Intel Hardware Accelerated Execution Manager) をサポートしたエミュレータがインストールされますが、入れ子状態の仮想環境は未対応のため使用できません。代わりに Microsoft が提供している Hyper-V 対応の VS Emulator をインストールします。
 - [Android Studio のインストール](https://developer.android.com/studio/install?hl=ja)
 - [Visual Studio Emulator for Android](https://visualstudio.microsoft.com/ja/vs/msft-android-emulator/)

3. VM の Hyper-V を有効化する
VM 上の Windows Pro では、 Hyper-V がデフォルトで無効化されているので、別途 有効化します。
 1. コントロールパネルから `プログラムと機能` を選択
 2. `Windows機能の有効化または無効化` を選択
 ![プログラムと機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/881a2d25-12bc-eeab-2bc3-9dd7284eca3f.png)

 3. Hyper-V と WHPX を有効化
     - Hyper-V  
     - Windows Hypervisor Platform  
 ![機能の有効か.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/973a51d2-fc25-988b-3683-72acca4b6c87.png)
 4. レジストリの変更  
 Android Studio から VS Emulator が参照できるようにレジストリを変更します。  
     1. `コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\` に `Android SDK Tools` というキーを作成します  
     2. キーの中に `Path` を作成し、Android SDK のパスを指定します。
![regedit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/604a67cb-f2ac-046e-002d-3725c210d6eb.png)
 5. VS Emulatorの設定  
 エミュレータの開発設定からUSB接続を有効にします。これにより、Andoroid Studio からエミュレータへアクセスすることができます。  
     1. VS Emulator を起動し、エミュレータを実行  
     2. アプリの中から、`Dev Settings` を選択    
![mobile_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/eee63f6b-8563-c204-28e2-9593eb2b7467.png)  
     3. `USBデバッグ` にチェックをいれる    
![mobile_usb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/8b1cd1c6-f1ee-7103-dd17-45e1ec709a84.png)
 6. Google USB ドライバのインストール
     1. Android Studio を開く
     2. メニューから [Tools]-[SDK Manager] を選択  
     3. [Appearane & Behavior]-[System Settings]-[Android SDK]-[SDK Tools] を選択
     4. [Google USB Drive']にチェックをいれて [OK] ※HAXM は未チェックのまま（インストールしない）
![SDK_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/27cd8ce6-4b6a-ea38-2cb1-97e7c4718fab.png)

 7. Android Appの実行  
 これでやっと一通りの準備がととのいました。あとはエミュレータを起動したまま、Android Studio から App を実行してみてください。
エミュレータで実行できます。
![desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/1f84d73d-210e-a1d5-8cff-f1a52dc1c198.png)

この記事が、少しでも `「VM上でエミュレータが動かないために Android App 開発を断念されてきた方」`のお役に立てれば幸いです。
(2020/3/吉日)

# 参考
1. [Emulator for Azure VM](https://social.msdn.microsoft.com/Forums/en-US/6889945d-2d33-48e8-b0cc-4618c1a88e65/emulator-for-azure-vm)
2. [setting up android sdk for visual studio android emulator](https://www.youtube.com/watch?v=D6AElkDz9oM)
3. [入れ子になった仮想化の有効化](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization)
4. [エミュレーターのパフォーマンスのためのハードウェア高速化 (Hyper-V と HAXM)](https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/hardware-acceleration?pivots=windows)