インテル® アーキテクチャー上の Android* エミュレーターを高速化する

同カテゴリーの次の記事

インテル® Atom™ プロセッサー・ベースのプラットフォーム上の Android* メディア・アプリケーションでインテル® SSE 命令を使用する利点

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Speeding Up the Android* Emulator on Intel® Architecture」の日本語参考訳です。


概要

もし皆さんが Android* エミュレーターの性能に不満を感じているなら、この記事をぜひお読みください。これまで、多くの Android* 開発者が「エミュレーターの動作は遅すぎて作業がはかどらないという」と洩らすのを耳にしてきましたが、今後この問題はなくなるでしょう。インテル® バーチャライゼーション・テクノロジー (インテル® VT) を備えるインテル® プロセッサーを搭載する最新のコンピューターで、Microsoft* Windows* や Apple* Mac OS* 実行している場合、インテル® Hardware Accelerated Execution Manager (インテル® HAXM) や Linux* 向けの KVM を利用して、Android エミュレーターを大幅に高速化し、Android アプリケーションのテストとデバッグをスピードアップすることができます。この記事では、エミュレーターの高速化に必要な手順と操作を紹介します。その後、NDK を使用して x86 ネイティブコードをコンパイルし、x86 ネイティブ・ライブラリーを含む APK を Google Play Store で公開する方法を説明します。インテル® HAXM は Tizen* エミュレーターを高速化するためにも利用されますが、この記事では触れていません。詳細については、tizen.org の SDK セクションを参照してください。

目次

1. はじめに
2. インストール
2.1. 必要条件
2.2. Windows* 上でインストールする
2.3. Linux* 上でインストールする
2.3.1. KVM をインストールする
2.4. AVD (Android* Virtual Device) の作成
3. 最も一般的な手法
3.1. Eclipse* からエミュレーターでアプリケーションをテストする
3.2. ABI 別マルチ APK と fat バイナリー
3.3. x86 向けに NDK をコンパイルする
3.3.1. NDK のパスを環境変数に追加する
3.3.2. NDK をコンパイルする
3.3.3. NDK をコンパイルするほかの方法

1. はじめに

この記事では、インテル® Hardware Accelerated Execution Manager (インテル® HAXM) をインストールする方法を説明します。インテル® HAXM は、インテル® バーチャライゼーション・テクノロジー (インテル® VT) を使用して Windows* 上で Android* 開発を高速化する、ハードウェア支援による仮想エンジン (ハイパーバイザー) です。また、Linux* 上でハードウェア支援による KVM をセットアップする方法に加えて、x86 ネイティブコードの最も一般的なコンパイル手法と Google Play Store でアプリを配信する方法についても説明します。

2. インストール

2.1. 必要条件

  • Android* SDK がインストールされている必要があります。
  • インテル® VT-x、EM64T、XD (Execute Disable) ビット対応のインテル® プロセッサーが必要です (これらの機能は BIOS で有効にできます)。

2.2. Windows* 上でインストールする

Android* SDK のインストールが完了したら、Android* SDK Manager を開きます。インテル® HAXM は [Extras] 以下にあります。

インテル® HAXM のチェックボックスをオンにして [Install packages…] ボタンをクリックします。パッケージのインストールが完了すると、ステータスが [Installed] になりますが、実際にはまだインストールされていません。Android* SDK Manager はインテル® HAXM 実行ファイルをマシンにコピーするだけで、そのファイルを使って開発者がインストールを行わなければいけません。

インテル® HAXM 実行ファイルをインストールするには、ハードドライブで「IntelHaxm.exe」(OS X* の場合は 「IntelHAXM.dmg」) を検索します。デフォルトでは、C:\Program Files\Android\android-sdk\extras\Intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exe にあります。

インテル® HAXM は、Android 2.3.3 (API 10)、4.0.3 (API 15)、4.1.2 (API 16)、4.2.2 (API 17) のいずれかのインテル® Atom™ プロセッサー x86 システムイメージでのみ動作します。これらのシステムイメージは、Android* SDK Manager から ARM ベースのイメージと同じ方法でインストールできます。

IntelHaxm 実行ファイルをクリックすると、次のような画面が表示されます。

この画面でインテル® HAXM に割り当てる RAM メモリーの量を調整することができます。メモリーの量を指定したら [Next] をクリックし、次の画面でメモリー割り当てを確認します。問題がなければ、[Install] をクリックします。

インテル® HAXM をインストールするには、BIOS でインテル® VT-x を有効にしておく必要があります。そうしないと、インストール中に次のようなエラーが表示されます。

このエラーが表示された場合は、BIOS でこの機能を有効にしてください。BIOS メニューはベンダーの実装によって異なります。

インテル® HAXM と x86 エミュレーター・システム・イメージをダウンロードする別の方法として、http://software.intel.com/en-us/android (英語) から必要なコンポーネントをダウンロードすることもできます。

2.3. Linux* 上でインストールする

Linux* で Android* エミュレーターを高速化する手順は、Windows* や OS X* とは異なります。インテル® HAXM は Linux* と互換性がないため、代わりに KVM (Kernel-based Virtual Machine) を使用する必要があります。以下の手順は、Ubuntu* 12.04 を使用しています。ほかの Linux* ディストリビューションでは手順がやや異なる場合があります。

Windows* (および OS X*) と同様に、まず Android* Developers サイトから Android* SDK をダウンロードします。Eclipse* IDE と Android* SDK が含まれた ADT (Android Developer Tools) バンドルをダウンロードし、Linux* マシンに展開します。お使いの Linux* ディストリビューションに応じて、32 ビットまたは 64 ビットのいずれかをダウンロードしてください。Linux* ディストリビューションが 32 ビットか 64 ビットかは、次のコマンドで簡単に確認できます。

$ file /sbin/init

KVM に必要なパッケージのインストールを開始する前に、次のコマンドでリポジトリーが最新であることを確認してください。

$ sudo apt-get update

2.3.1. KVM をインストールする

Linux* 向けの仮想ソリューションである KVM を x86 ハードウェア (つまり、インテル® VT) にインストールし実行するには、あらかじめ次のコマンドで CPU がハードウェアの仮想化をサポートしているかどうかを確認します。

$ egrep –c ‘(vmx|svm)’ /proc/cpuinfo

結果が 0 の場合は、CPU が KVM の実行に必要なハードウェアの仮想化をサポートしていません。1 以上の場合はサポートしていますが、BIOS で有効になっていることをチェックする必要があります (2.2 節を参照)。

次に、KVM がまだインストールされていない場合は KVM をインストールします。次のコマンドでプロセッサーが KVM をサポートしているかどうかを確認できます。

$ kvm-ok

KVM がすでにインストールされている場合は、次のようなメッセージが表示されます。

“INFO: Your CPU supports KVM extensions
INFO: /dev/kvm exists
KVM acceleration can be used”

次のようなメッセージが表示された場合は、BIOS でインテル® VT を有効にする必要があります。

“INFO: KVM is disabled by your BIOS
HINT: Enter your BIOS setup and enable Virtualization Technology (VT),
and then hard poweroff/poweron your system
KVM acceleration can NOT be used”

次に、KVM といくつかの必要なパッケージをインストールします。以下のコマンドを実行します。

$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

次のウィンドウで、設定を変更したくない場合は [No configuration] を選択します。

そして、KVM グループと libvirtd グループにユーザーを追加します。以下のコマンドを実行します。

$ sudo adduser your_user_name kvm
$ sudo adduser your_user_name libvirtd

インストールが完了したら、変更が反映されるように再度ログインします。次のコマンドで、正しくインストールされたかどうかを確認できます。

$ sudo virsh -c qemu:///system list

次に、AVD (Android* Virtual Device) を作成して実行します。この手順は Linux* とWindows* で同じです。

2.4. AVD (Android* Virtual Device) の作成

Android* SDK とインテル® HAXM (Linux* の場合は KVM) のインストールが完了したら、ハードウェアにより高速化されたエミュレーションを行う新しい仮想デバイスを Android* AVD Manager で作成します。[CPU/ABI] で必ず「Intel Atom (x86)」を選択してください。このオプションは、インテルの x86 システムイメージがインストールされている場合のみ表示されます。グラフィックスをさらに滑らかにするには、AVD を作成するときに GPU エミュレーションを有効にします。

[New] をクリックして x86 AVD を作成します。x86 システムイメージでサポートされている API が選択され、[CPU/ABI] が x86 に設定され、GPU (OpenGL* ES) エミュレーションが有効になっていることを確認したら、[Create AVD] をクリックして AVD を作成します。

x86 AVD を起動するには、[Start] をクリックし、次に [Launch] をクリックします。

正しくインストールされていれば、エミュレーターが起動するときに、インテル® HAXM が高速な仮想モードで実行していることを示すダイアログボックスが表示されます。

また、エミュレーター内の [About phone] でも x86 システムイメージを実行していることを確認できます。

インテル® HAXM または KVM によってもたらされるパフォーマンスの向上は、PC、ドライブ、メモリーなどに依存しますが、5 倍から 10 倍になるでしょう。次のスクリーンショットは、インテル® HAXM が有効な x86 AVD と ARM ベースの AVD を並べて比較したものです。x86 AVD は 15 秒でロック画面を起動しているのに対し、ARM ベースの AVD は 40 秒もかかっています。これは大きな違いと言えるでしょう。

(システムの構成に応じて、インテル® HAXM (または KVM) によりパフォーマンスが 5 倍から 10 倍向上するでしょう。性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。構成: このテストでは MacBook Pro* が使用されました。
さらに詳しい情報をお知りになりたい場合は、http://www.intel.com/performance/resources/benchmark_limitations.htm (英語) を参照してください。)

3. 最も一般的な手法

3.1. Eclipse* からエミュレーターでアプリケーションをテストする

NDK ベースのアプリケーションや Dalvik* アプリケーションでも、テストを行うときにインテル® HAXM を使ってエミュレーターを高速化できます。Eclipse* で開発を行っている場合は、エミュレーターの起動時に次の簡単な手順でインテル® HAXM を使用しているかどうかを確認できます。

最初に、前節の手順に従って AVD が作成されているかをチェックしてください。AVD を作成済みの場合は、次のように [Run As] > [Run Configurations…] を選択します。

次のようなページが表示されます。

ここで、確認する AVD のチェックボックスをオンにします。AVD の設定が完了したら、プロジェクトをコンパイルし、[Run As] > [Android Application] を選択してエミュレーターでデバッグします。すると、自動的にハードウェアにより高速化された AVD が起動されます。

AVD が起動されると、(画面のロックを解除した後に) アプリケーションのホームスクリーンが表示されます。

3.2. ABI 別マルチ APK と fat バイナリー

以前は、すべてのライブラリーと NDK ファイルを含むアプリケーションの fat バイナリーを提供しなければいけなかったため、アーキテクチャーごとに差別化を図ることができませんでした。そのため、ユーザーは使用しているアーキテクチャーには必要ないファイルを含め全 APK をダウンロードする必要がありました。つまり、x86 ユーザーは ARM コードもダウンロードしなければならず、ARM ユーザーは x86 コードもダウンロードしなければいけませんでした。これには、アプリケーションの fat バイナリーが大きい場合、ユーザーがデバイスに関係ない大量のデータをダウンロードするという欠点がありました。一般に、APK が 20MB 以下であればこれは問題になりません。

インテルと Google は、以下の推奨バージョンコードに従って、各アーキテクチャー固有の異なるライブラリーを含むマルチ APK の提供を可能にするため、CPU フィルターメカニズムを実装しました。

推奨バージョンコードの 1 桁目は ABI、2 ~ 3 桁目はターゲット API レベル、4 ~ 5 桁目は画面サイズ、6 ~ 8 桁目はアプリケーションのバージョン番号を示します。

バージョンコードは 8 桁以上になるようにし、1 桁目で x86 の値が最も大きくなるようにします。上記の例では、x86 には 6、ARMv7 には 2、ARMv5TE には 1 を使用しています。そうすることで、x86 デバイスでは x86 バージョンが選択され、ARM デバイスでは ARM バージョンが選択されるようになります。

このガイドラインに従うことで、ユーザーがデバイスで最高のパフォーマンスを得られるようにできます。さらに、コード変換に問題がある特定のデバイスで、ユーザーがアプリケーションを実行することを防ぎます。

詳細は、「Google Play* によるマルチ APK の CPU アーキテクチャー・フィルタリング・サポート」の記事を参照してください。

3.3. x86 向けに NDK をコンパイルする

この節では、アプリケーションの NDK 部分を x86 向けにコンパイルする方法を説明します。

NDK ベースのアプリケーションを x86 AVD 上で実行するには、NDK ライブラリーを x86 アーキテクチャー向けにコンパイルする必要があります。以下の簡単な操作を行います。

次のように、コマンドプロンプトを開き、NDK ファイルの場所に移動します。

ndk-build スクリプトをどこからでも使用できるように、環境変数パスが設定されていることを確認してください。

3.3.1. NDK のパスを環境変数に追加する

環境変数を追加するには、[コンピューター] を右クリックして [プロパティ] を選択します。[システムの詳細設定] を選択し、[環境変数] ボタンをクリックします。リストから Path を選択し [編集] ボタンをクリックします。[変数値] の文字列の最後に、ndk-build.cmd ファイルがある NDK のルートフォルダーへのパスを追加します (以下の画面を参照)。

3.3.2. NDK をコンパイルする

コマンドプロンプトで NDK フォルダーに移動したら、次のコマンドを実行します。

$ ndk-build APP_ABI:=all

このコマンドは、各アーキテクチャー (ARMv5TE、ARMv7、x86、および mips) 向けに NDK ファイルをコンパイルします。

特定のアーキテクチャー向けにコンパイルするには、‘all’ の代わりに特定のアーキテクチャーを指定します。次に例を示します。

$ ndk-build APP_ABI:=armeabi armeabi-v7a x86 mips

ndk-build スクリプトによって作成された最新のフォルダーが表示されるように Eclipse* でプロジェクトをリフレッシュします。プロジェクトの libs フォルダー以下に、各アーキテクチャーに対応した 4 つのサブフォルダーが表示されます。

これで、x86 AVD 上で NDK アプリケーションを使用できます。

3.3.3. NDK をコンパイルするほかの方法

x86 を含むすべてのアーキテクチャー向けにネイティブコードをコンパイルするほかの方法として、jni フォルダーにある Application.mk ファイルを変更することができます。(Application.mk ファイルがない場合は作成してから) 次のコマンドを追加します。

APP_ABI:=armeabi armeabi-v7a x86 mips

これにより、ndk-build スクリプトを実行すると、利用可能なすべてのアーキテクチャー向けにライブラリーがコンパイルされます。

あるいは、すべてのアーキテクチャーをリストする代わりに、‘all’ と記述することもできます。

APP_ABI:=all

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事