Genymotionで開発作業効率化d(๑╹ω╹๑ )

Android Advent Calendar 2013の5日目です！！

簡単に実践できるちょっとした開発作業効率化について書きたいと思ったので
今回は効率化に繋がりそうなGenymotionというものを紹介します。
## はじめに(＞ヮ＜)
### Genymotionとは
VirtualBoxの仮想化技術を利用したAndroidデバイスエミュレータです。
### メリットは
#### 標準のAndroidエミュレータよりも動作が軽い
これは特に補足の必要はありませんね だって速いもん！
#### Playストアが利用できる
例えば端末内のストレージにアクセスして色々するアプリのデバッグ時にファイラーアプリをインストールしておけばADBを利用するよりも素早く動作検証することができるようになります！
### この記事の目標
既にGenymotionに関する日本語の解説が様々な技術ブログ等で提供されていますが、
Genymotion開発チームの活発な機能追加や不具合改善に伴い、既存の導入手順では最近の仕様に対応しきれないので現段階で最新のGenymotionの概要と導入手順の一元化を目標としています。
### 環境
MacBook Air Mid 2012 OS X 10.9

## (*＞ヮ・)Genymotionに登録しよう
Genymotion: [genymotion.com](http://www.genymotion.com)にてユーザー登録を行います
Sign upページの下記項目を入力

☆Username – ユーザー名
☆Password – パスワード
☆Password confirmation – 確認のためパスワードを再入力
・Allow Genymotion to send me emails about new releases – ニューリリース情報などをメールで購読
☆I accept terms of privacy statements – 利用規約に同意
・Enterprise size – 利用する組織の規模？
・Usage type – 利用目的

☆印は入力必須です＼(＞ヮ＜)／

Sign upボタンを押下すると登録したアドレス宛てに

```shell-session
welcome to Genymotion - User account activation
```

というメールアドレスが正当なものかを確認するメールが送られてくるので
Please use the link below to activate your account.辺りにある、
Click hereのリンクをクリックしてアカウントをアクティベーションは完了です。

※初回起動時にプランの選択を問われますが後から変更ができます。
今回はお試しということでFREEプランを選択しました。

## Genymotionのセットアップ(」・ワ・)」
#### Genymotionのインストール
先程のアカウントでログインした状態で[Download Genymotion](https://cloud.genymotion.com/page/launchpad/download/)から自分の環境に合ったGenymotion本体をダウンロードしましょう。

Windows版はインストーラー形式になっているようですがここではOSX環境での導入解説になるのでWindows環境をお使いの方は途中まで頑張ってください＞＜
OSX環境での導入はGenymotion.appをApplicationsディレクトリにコピーすれば完了です。

VirtualBoxが入っていない状態でGenymotion.appを起動すると下記のエラーが出て先に進めません。

```shell-session
Unable to load VirtualBox engine.
```

仮想環境ソフトウェアには数種類ありますが、VirtualBox環境でのみ動作するようです。
Parallels使えないのかよﾌｧｰｰｰｰｰｰｰｰｰｯｸ！！！！！！！！！！！！！！

ということで
#### VirtualBoxのインストール
ちなみに既にVirtualBox導入済みの方と、Windows 32/64 bits (with VirtualBox)を使ってGenymotionをインストールしたWindowsユーザーさんは恐らくVirtualBoxの導入は完了していると思われるのでこの手順は不要です。

導入手順は[Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)からVirtualBox本体をダウンロードしてインストールするだけです。
#### 仮想デバイスのインストール
準備が整ったところでいよいよGenymotion起動です(」・ワ・)」

初回起動の段階ではデバイス環境の構築が済んでいないので以下のダイアログが表示されます。

```shell-session
You have no virtual device available yet.

Do you want to add a new one?
```

「仮想デバイスがありません。新規作成しますか？」とのことなのでYesを選択します。

Create a new virtual devicesというタイトルの次画面では

```shell-session
login to discover all available virtual devices
```

ログインを求められているので画面右下のConnectボタンを押してログインします。

正常にログイン処理が完了するとインストール可能なデバイス環境一覧がリスト表示されるので、
任意の端末を選択してNextボタンを押すとデバイス環境の詳細画面に遷移します。
今回は以降の解説用にGalaxy NexusのAndroid 4.3を選択してみました！
Installボタンを押すと選択したデバイス環境のダウンロードからインストールまでが自動で行われます。
僕の環境で５分くらいかかったのでコーヒーでも飲んで待ちましょう
・・・
インストールが完了するとVirtual device created successfullyと表示されるのでFinishボタンを押して環境作成画面を終了します。

![ichigo.jpg](https://qiita-image-store.s3.amazonaws.com/0/20947/980c103a-4c4d-056e-ef69-a0aee5aef293.png)
仮想デバイス管理画面です。次回以降は直接この画面が起動時に表示されます。

リスト内に作成したデバイス環境が選択されている事を確認してPlayボタンを押しましょう。
仮想デバイスが起動します。また、初回起動時には

```shell-session
To use ADB connection, you should configure correctly the path to Android SDK.

Do you want to configure it now?
```

「ADBで仮想デバイスを操作するにはSDKのパスを設定する必要があります。直ちに設定しますか？」
といった内容ダイアログが表示されますが後で設定する事もできます。
設定しておくと仮想デバイスをeclipseやAndroid StudioのDDMSから操作できたり、デバッグ時に利用できるようになるので通常はYesを選択して表示されたダイアログでパスを設定しておきましょう。

別ウィンドウで仮想デバイスが起動したら導入完了です。
![ichigo.jpg](https://qiita-image-store.s3.amazonaws.com/0/20947/cb2a261a-5018-d936-cb23-93f421dd4689.png)
なんだこの壁紙ゎ
#### 仮想デバイスにGoogle Appsをインストール
Genymotion2.0系ではGoogle Appsが同梱されていないのでPlayストアが入っていません。
参考：[Genymotion2.0のGCMなどGoogle Apps周りの問題を解決する](http://qiita.com/y_matsuwitter/items/dd1f4846cf3e6b03edc6)

これではGenymotionを利用するメリットが半減してしまうためPlayストアをバンドルしているGoogle Apps Universal Packagesをインストールしましょう。

1. [wiki.rootzwiki.com](http://wiki.rootzwiki.com/)の[Google Apps Universal Packages Downloads](http://wiki.rootzwiki.com/Google_Apps#Universal_Packages_2)から作成した仮想デバイスのAndroidOSに対応するGoogle Apps Universal Packagesのzipファイルをダウンロード。
1. ダウンロードしたzipファイルを起動中の仮想デバイスのウィンドウにドラッグアンドドロップするとインストールするかを問うダイアログが表示されるのでYesを選択するとインストールが始まります。
1. インストールおわったよダイアログが表示されたら仮想デバイスを再起動して完了です！

## 導入に関してのハマりどころ(；ヮ；)

+ VirtualBoxがインストールされているにもかかわらず「Unable to load VirtualBox Engine」と表示されてGenymotionが起動しない場合は下記コマンドにてvboxdrvモジュールの読み込み操作を行ってください。

```shell-session
$sudo /etc/init.d/vboxdrv status
$sudo /etc/init.d/vboxdrv setup
$sudo /etc/init.d/vboxdrv status
```

+ 確認ダイアログ等が操作しているウィンドウの裏に表示される事が多かったので、操作しても反応がない場合はウィンドウの裏に何か隠れていないかを確認してみてください。
+ 最初のライセンス選択画面のFREEとTRIALボタンはdisenableっぽいけど押せます。

## ~(=^・ヮ・^)IDEの設定
### 設定する目的
メニューバーに ![genymotion.png](https://qiita-image-store.s3.amazonaws.com/0/20947/18027b59-7344-d2ae-1dcf-0968d88d5d0d.png) のようなアイコンが表示されてGenymotion.appを直接起動することなくAVD(Android Virtual Device)と同じように端末を管理することが出来るのですヾ(*╹◡╹)ﾉﾞ

※デバッグに利用できるデバイスが1台もadbで接続されていない状態でAndroidプロジェクトのデバッグを実行した場合にはADVが反応するのでその点は今後の機能対応に期待ですね
### eclipseの設定編
ヘルプ -> 新規ソフトウェアのインストール追加ボタンを押して表示されるダイアログに以下を入力
名前: （任意）
ロケーション: http://plugins.genymotion.com/eclipse
以降はいつも通りの流れでGenymotion Pluginをインストールしてください。

または、Genymotionにログインした状態で[Download Genymotion](https://cloud.genymotion.com/page/launchpad/download/)からeclipse用のプラグインファイルをダウンロードしてきてjarファイルをプラグインディレクトリに置くことで手動インストールも可能です。
後者の方法ではプラグインの更新が面倒なのでお勧めしません。
### Android Studioの設定編
File/Settingsのメニューから"Plugins" -> "Browse repositories..."を選択。
表示されるリストの中からGenymotionを選択して"Download and install"ボタンをﾎﾟﾁｰ
以降はいつも通りの流れで(ry
## 実機とのスコア比較ヾ(*╹◡╹)ﾉﾞ
### ベンチマーク
定番のベンチマークアプリ『AnTuTu Benchmark』にて計測しました。
##### 計測デバイスの紹介

+ Genymotion Galaxy Nexus Android 4.3 Genymotionデフォルト
+ Galaxy Nexus Android 4.3 Google純正

##### 結果
| 項目名 | Genymotion | 実機 |
|:-----------|------------:|-------------:|
| 総合 | 27253 | 10033 |
| Multitask | 6409 | 2003 |
| Dalvik | 3341 | 1033 |
| CPU Int | 3225 | 994 |
| CPU Float | 2590 | 690 |
| RAM Operation | 1673 | 766 |
| RAM Speed | 5082 | 633 |
| 2D | [720x1184] 1636 | [720x1184] 540 |
| 3D | 0 | [720x1184] 2362 |
| I/O Storage | 2567 | 637 |
| I/O Database | 730 | 375 |

なんと実機の3倍近い結果にｗ
GenymotionのGNはOpenGLの3D描画スコア計測中にアプリが強制終了しました。
何度かリトライしましたがその度に強制終了したので現時点でOpenGLを利用するアプリのデバッグは出来ない可能性があります。

ちなみに測定中はMBAのCPU使用率が測定前と比べると40%程度上昇し50%台をキープしていました。
### ファイル転送速度
デバッグする際のapkファイル転送を想定したadbコマンドのpushで転送速度を比較してみました。
計測デバイスはベンチマークの計測と同じで、転送するファイルは36.7MBです。
##### 結果
Genymotion

```shell-session
$adb push ~/Downloads/genymotion-2.0.1.dmg /sdcard/
3662 KB/s (36701555 bytes in 9.785s)
```

実機

```shell-session
$adb push ~/Downloads/genymotion-2.0.1.dmg /sdcard/
4267 KB/s (36701555 bytes in 8.398s)
```

何故か物理ケーブル接続の実機の方が転送速度が速いという結果になりました。
数回測定しましたが、やはり実機が0.4〜0.5秒程速い感じです。

## (*・ヮ・)使ってみてわかったこと
実際にデバッグに使用して気付いたことを書いていきます。
### 仮想デバイスウィンドウ
##### メニューバーでの端末操作
![genymotion.png](https://qiita-image-store.s3.amazonaws.com/0/20947/4f69897d-6ca6-c22b-5aa1-a041d72baeec.png)

各ボタン類の概要

+ バッテリー状態操作
+ GPS情報操作
+ ダミーカメラ・Webカメラ切り替え
+ 画面静止画・動画キャプチャ（プレミアム会員オプション）
+ リモートコントロール（プレミアム会員オプション）
+ 仮想デバイス音量操作
+ 仮想デバイス回転エミュレーション
+ その他仮想デバイスボタン操作

個人的に素晴らしいと感じたのはバッテリー状態とGPS情報の操作で、
adbコマンドで行うよりもグラフィカルに状態を反映させることが可能です。

![genymotion.png](https://qiita-image-store.s3.amazonaws.com/0/20947/034eaadc-c688-089f-96a3-c9e1a3c36fe3.png)
プレミアム会員オプションのリモートコントロールは実機から仮想デバイスを操作できる機能です。

![genymotion.png](https://qiita-image-store.s3.amazonaws.com/0/20947/18049653-0eba-1db2-99b8-d0de584d4f31.png)
項目内の……部分を引っ張ることでメニューバーを移動したり、
仮想デバイスウィンドウから切り離す事もできて自分好みの配置にカスタマイズできます。
##### ファイル転送が簡単
仮想デバイスウィンドウ内にファイルをドラッグアンドドロップすることで、
デバイスストレージのDownloadsディレクトリにファイルコピーされます。
##### デバイスウィンドウとしての操作感
Android標準のエミュレータと比較して、マウスでのスワイプ操作が快適です。
標準エミュレータではドラッグの動きに忠実でViewFlipper等のページ送りが難しかったのですが、
Genymotionの仮想デバイスでは慣性の動きを再現していて、なめらかに操作できます。

### その他
##### root権限
[Superuser](https://play.google.com/store/apps/details?id=com.koushikdutta.superuser)がプリインストールされているので要rootなアプリのデバッグも出来ます。
##### 日本語環境
Settingsアプリ->「Language & input」->「Language」->「日本語」の順に選択することで仮想デバイスの言語を日本語に設定できます。
ソフトウェアキーでの日本語入力は適当なIMEアプリをPlayストアから入手しましょう。
## まとめに(＞ヮ＜)
### 執筆時の導入構成
Genymotion Version 2.0.1
VirtualBox Version 4.3.4

### Thank you for reading …and
Genymotionを導入すると簡単な動作検証はとても捗ります。
しかし、仮想デバイスの環境では発見することのできない端末特有の問題もあるので本当に品質の良いアプリケーションを作成するならば最終的に実機で確認することを忘れないでください。