アンドロイドの開発環境には、PC(WindowsやLinux)上で動作する「エミュレーター」が付属しています(写真01)。これは、ソフトウェアの動作チェックに使うものです。以前は、ARMコードのエミュレーターでしたが、現在では、インテルの開発したHAXM(Hardware Accelerated Execution Manager)が利用されており、高速にPC上でアンドロイドの環境をエミュレーションします。今回は、開発に使うアンドロイドのエミュレーター環境についてのお話です。
アンドロイドの開発環境は、現在ではAndroid Studioと一緒にダウンロードするようになっているため、ここではこれを「Android Studio版エミュレーター」として略して「AS版」と表記します。
AS版に使われているHAXMでは、Intelプロセッサの仮想マシン支援機能(VT-x)が使われています。また、動作できるのは64bit環境のみで、XDビット(Execution Disable)ビット機能が必須です。
このHAXMは、VT-xを使う関係で、WindowsのHyper-Vと共存することができません。このため、AS版を使うには、Hyper-Vをオフにしなければなりません。しかし、ソフトウェアの開発では、仮想マシン環境を使うことも少なくありません。また、WindowsのInsider Previewなどを仮想環境でテスト用にしている開発者も少なくないと聞きます。このため、以前からHyper-VとHAXMの共存は問題でした。
1つの解決方法として、マイクロソフトが提供しているHyper-Vを使ったアンドロイドのエミュレーターがあります。これは、Visual Studioに付属しています(以下VS版とします)。純粋なHyper-Vの仮想マシンイメージなので、Hyper-Vとの共存問題は起きません。また、起動やイメージのダウンロードを行う専用のアプリが用意されていて、簡単に使うことができるものでした。
「ものでした」と過去形なのは、VS版は、Android 6.0(Marshmallow)で開発が止まってしまい、Android 7.0以降に関しては、AS版を使わざるを得ない状態なのです。
Hyper-Vをオンオフする
そういうわけで、Android 7.xや8.xをエミュレーターで使うには、どうしてもAS版が必要になります。Googleは、アプリに対して最新のAPIセットを使うことを要求しており、今年後半から適用が始まります。そういうわけで、アンドロイドアプリの開発では、ある程度広い範囲のAPIに対応しなければなりません。
たとえば、Android 6.0から最新の8.1まででは、稼働中のアンドロイドの57.7パーセントまでしかカバーできません。Android 5.0/5.1(Lollipop)までをカバーすると82.3パーセント、Android 4.4(Kitkat)なら94.30パーセントがカバーできます。
Android 4.4のAPIレベルは19、Android 5.0はAPIレベル21、最新のAndroid 8.1は27です。つまり、広くアプリを使ってもらうためには、APIレベル19あたりから27までをカバーしなければなりません。
そういうわけで、AS版の利用は必須で、このときには、Hyper-Vをオフにする必要があります。ただし、オフといっても、アンインストールする必要はありません。WindowsのコマンドラインからHyper-Vを停止させることができるのですが、再起動が必要です。
コマンドは、コマンドプロンプトウィンドウを「管理者権限」で起動し、以下のコマンド、
bcdedit /set hypervisorlaunchtype off
を実行し、その後Windowsを再起動します。
再開するには、同様に管理者権限で起動したコマンドプロンプトウィンドウから、
bcdedit /set hypervisorlaunchtype auto
を実行し、Windowsを再起動します。
Hyper-Vがオフになった状態では、AS版アンドロイドエミュレーターが動作します。これでとりあえず、アンドロイドの開発についてはなんとかなる状態です。
再起動が面倒
コマンド自体は簡単なのですが、やはり毎回再起動するのは面倒です。そこで、Hyper-V以外の「仮想マシン環境」を使うことにします。
Hyper-V以外の仮想マシン環境としては、VMWareかVirtualBoxということになるのでしょうが、今回は、VirtualBoxを選択しました。機能的にみるとVMWare(Workstation Player)のほうが高機能なようで、たとえば、Nested VM(仮想マシン環境で動くOSの中でさらに仮想マシン環境が起動できる。ただしNested VMに対応したCPUが必要)にも対応しています。逆にVirtualBoxはオープンソースで、本体はGPLv2、比較的手軽に利用できる仮想マシン環境です。
そういうわけで、とりあえず仮想マシン環境としてはVirtualBoxを使います。導入して試してみましたが、VirtualBoxで、Windows Insider Previewを動かすことは可能なようです(Build 17025で確認。写真02)。
インテルのHAXMは、VirtualBoxとは共存できるようになっているようです。ためしてみると、両方を同時に起動することが可能でした。
ついでに、PC上でAndroid環境を動作させることができるNoxPlayer(写真03)も導入してみました。これは、アプリケーションのような形態ですが、内部的にはVirtualBoxを使っていてアンドロイドの環境を実現しています。このためか、VirtualBoxやHAXMと同時に実行してもいまのところ特に問題は起きていません。
NoxPlayerは、開発用のソフトウェアではなく、アンドロイドのゲームアプリなどをPC上で動かすためのものです。このため、AS版のように過去からのすべてのアンドロイドのバージョンが実行できるわけではありませんが、Google Playストアが利用でき、実在のアプリとの連携を試すことも可能です。たとえば、AS版では、Webブラウザは、ChromeまたはInternetのどちらかのみ(アンドロイドバージョンによる)で、Playストアがないので、FireFoxやEdgeを使ってアプリをテストすることができません。もちろん、実機でテストすればいいのですが、限界があります。
これに対してNoxPlayerは、複数のインスタンスを同時実行でき、しかもコマンドラインからオプションを付けて起動することが可能です。アンドロイドのバージョンは4.4.2(Kitkat。NoxPlayer 6.0.5.2の場合)のみなので、複数のバージョンでのテストは無理にしても、複数解像度のテストとアプリの連携をテストすることができます。AS版でカバーできないアプリとの連携などを試すためにはあったほうが便利でしょう(もちろん、ゲームを楽しむというのもあります)。
Nox Playerは、「マルチインスタンスマネージャ」(ウィンドウ右のツールバーから起動可能。写真04)を使って、複数インスタンスデータ(起動イメージとなるファイル)を作っておけば、あとは、コマンドラインから、
nox.exe -clone:Nox_1
のようにしてインスタンスを起動できます。最後の「Nox_1」は、インスタンス名でNoxのインストールで作られたイメージが「Nox」、以後はマルチインスタンスマネージャーで作られた順に「Nox_1」、「Nox_2」と末尾の数字がふえていきます。
adbコマンドで使うポート番号ですが、筆者の環境で調べたところ、インスタンス「Nox」は62001、インスタンス「Nox_1」が62025、「Nox_2」が62026となっていて、ポート番号62025から順に割り当てられるようです。このため、adbコマンド(写真05)を使って、
adb.exe connect 127.0.0.1:ポート番号
とすれば、adb接続が行われ、Android Studioなどからアプリのインストール、起動が行えるようになります(写真06)。
Hyper-Vをオフにしても、VirtualBoxを使えば、Windows Insider Previewの評価をしながら、AS版アンドロイドエミュレーターやNoxPlayerを動かすことができました。