Genymotion (旧 AndroVM) を Titanium Mobile で使ってみる
Androidエミュレータが爆速で動くと話題の Genymotion (旧 AndroVM )。せっかくそんなに速いなら、Titanium Mobile から使えるようにしたい!と思いたち、試行錯誤をした結果なんとか使えるようになったのでメモ。
Genymotionって?
とっても動作が遅いと評判の Android Emulator を代替するプロダクト Genymotion 。
x86アーキテクチャのVM上で、Android Emulator を動かそう!ということ らしい。 細かいことは実はよく知らない。ちょっと前まで AndroidVM という名前だったことは知っている。商用プロダクトになったように読めるんだけど、今のところFreeで使えている。今後はどうなるか不明。
詳しくはこちらを。
この記事の前提
自分の使い方は少し特殊かもしれないけど、用途は満たしている。Genymotion を知ってしまったいま、今までの開発にはもう戻れないよ。すごい快適だよ。
- Mac OS 10.8.4
- Titanium Mobile SDK (3.1.1) と Andorid SDK は正しくインストールされ使えている
- Android は 4.1 以降のみをターゲットにして開発
- Titanium Alloy のみ利用
- Titanium Stuido は使っていない。テキストエディタ + コマンドライン
- Studioを使ってないのでブレークポイントなどを使った今どきのデバッグはしない
- Vagrantを使っているので、すでに Host Only Network のアダプタが一つ登録されている
VirtualBoxのインストール
Macの場合は必要なのでインストールする。手順は割愛
Genymotionのインストール
- Genymotion にアクセスして、まずはユーザー登録を行う
- Mac OS X 64 bits用のインストーラー(dmgファイル)をダウンロード&実行して、
Genymotion.app
とGenymotion Shell.app
をインストールする -
Genymotion.app
を実行 - 「なにもイメージがないけど登録するかい?」っぽいメッセージが表示される。迷わず「YES!!!」
- 登録したユーザーIDとパスワードでログイン
- 使いたい Virtual Device を選択して、ダウンロードとインストールと登録を行う。今回試したのは、「Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720 * 1280」
- Genymotion 上に登録された仮想デバイスを Play する。初回は Android SDK のパスを聞かれるので設定する
VirtualBoxの設定
自分の環境では、すでに VirtualBox 上の仮想マシンが存在したからかもしれないけど、上記手順までやって Play しても、IPアドレスがほげほげと言われて動かなかった(´・ω・`)。きっと VirtualBox Host-Only Ethernet Adapter の vboxnet0
が使用済みだったからだと思う。
-
VirtualBox (Oracle VM Virtual Box Manager)を起動して、VirtualBox自身の設定(各VMの設定では ない)を表示する
-
[Network]を表示して[Host-only Networks]を追加する。
vboxnet1
が追加された -
どうも Genymotion で動くVMは、 192.168.56.X/24 の Host-only Network を使うっぽい。
vboxnet1
に以下のように設定を行ったAdapter
IPv4 Address:192.168.56.1
IPv4 Network Mask:255.255.255.0DHCP Server
Enable Server:チェックを入れる
Server Address:192.168.56.1
Lower Address Bound:192.168.56.100
Upper Address Bound:192.168.56.119 -
Genymotion によって VirtualBox 上に登録された、Android VM の [Settings]を開き、[Network]の[Adapter1]に、先に追加した
vboxnet1
を指定する。[Attached to]は、[Host-only Adapter]を指定 -
[Adapter2]には、[NAT]を指定した
-
Genymotion に戻り、[Play] で実行できるはず
いまはどんな状態?
無事に Mac 上で動いた Genymotion。確かにサクサク動作する。それで今はどんな状態なんだろう。
adb devices
を実行すると、Genymotion の VM は device
と表示される。ただし adb -d shell
はエラーになり、adb -e shell
にしないと入れない。つまり Genymotion はエミュレータ扱い。
$ adb devices
List of devices attached
192.168.56.100:5555 device
$ adb -d shell
error: device not found
$ adb -e shell
shell@android:/ $
コマンドラインから Titanium アプリをインストール
Titanium コマンドラインからAndroid 向けビルドを行なえば、adb コマンドでインストールできるはず。ということでやってみる。この辺りは、Titanium なみなさんに色々と教えてもらった。ありがとうございます。
-
Genymotion で Android の VM が動いていることを確認
-
Titanium プロジェクトのディレクトリへ移動する
$ cd Project-Directory
-
Titanium で Android 向けにビルド。エミュレータへのインストールや実行などは行わないフラグをつける
$ titanium build --platform=android --build-only
-
build/android/bin/app.apk
にアプリがビルドされている。-s
でデバイスを指定してインストール$ adb -s 192.168.56.100:5555 install -r build/android/bin/app.apk
-
Genymotion にアプリがインストールされている。実行。サクサク。感激!
-
もちろん、こうやってコマンドをつなげてもOK
$ titanium build --platform=android --build-only && adb -s 192.168.56.100:5555 install -r build/android/bin/app.apk
-
Cleanをしたほうがいいとの情報も有り。僕は不要なんだけど、ちょっと分からない。
$ titanium clean && titanium build --platform=android --build-only && adb -s 192.168.56.100:5555 install -r build/android/bin/app.apk
-
これで思う存分 Android の開発ができるね!
もう一歩前へ
!!!!ここから先は、Titanium に慣れてない人、オススメできないです!!!!
ここまでで Titanium 製のアプリを Genymotion へインストールするところまで出来た。ただ自動でアプリを起動しないところが気に入らない。Titanium Mobile SDK を改造して、通常のエミュレータと同じように動くようにしてみる。
Titanium Mobile SDK の編集
この手順は自分で試行錯誤したというより、ほとんど「開発系もろもろ」さんを参考にさせて頂いた。ありがとうございます。
Titanium コマンドが、「オマエはエミュレータだな?」と判断する基準は、adb devices
コマンドで表示されるデバイスの名前が、「emulator-
」ではじまっていること。
Genymotionは「192.168.56.100:5555
」みたいな名前になるので、Titanium コマンドからはエミュレータ扱いされない。
そのため、Titanium Mobile SDK 内部の Python と Node.js スクリプトをイジって、強制的にエミュレータとして認識されるようにした。正直IPベタ書きで気に入らないけど、とりあえず動くからOKにしてる。いい方法があったら是非教えて下さい...。
# 300行目付近
for line in out.splitlines():
line = line.strip()
if line.startswith("List of devices"): continue
elif line.startswith("emulator-"):
(name, status) = line.split()
port = int(name[name.index("-")+1:])
offline = False
if status == "offline":
offline = True
devices.append(Device(name, port, True, offline))
# ↓↓↓↓ 追加 ここから ↓↓↓↓
elif line.startswith("192.168.56."):
(name, status) = line.split()
port = int(name[name.index(":")+1:])
offline = False
if status == "offline":
offline = True
devices.append(Device(name, port, True, offline))
# ↑↑↑↑ 追加 ここまで ↑↑↑↑
elif "device" in line:
name = line.split()[0]
devices.append(Device(name))
// 465行目付近
devicesProcess.on('exit', function (code, status) {
if (results.indexOf('emulator') != -1) {
logger.info(__('Emulator is running') + '\n');
// ↓↓↓↓ 追加 ここから ↓↓↓↓
} else if (results.indexOf('192.168.56.') != -1) {
logger.info(__('AndroVM Emulator is running') + '\n');
// ↑↑↑↑ 追加 ここまで ↑↑↑↑
} else {
emulatorRunning = false;
logger.info(__('Emulator process exited successfully') + '\n');
logcatProcess && logcatProcess.kill('SIGKILL');
adbProcess && adbProcess.kill('SIGKILL');
buildProcess && buildProcess.kill('SIGKILL');
emulatorProcess = buildProcess = logcatProcess = adbProcess = null;
}
});
実行
-
Genymotion で Android の VM が動いていることを確認
-
以下のコマンドを発行
$ cd Project-Directory $ titanium build -p android
-
Androidエミュレータが起動してしまうので 素早く終了する 。終了しないと「エミュレータが2つ以上います」って感じのエラーになる
-
Android の VM 上でアプリが実行される
起動してくる Androidエミュレータ を素早く終了するのは面倒なので、またまた Titanium Mobile SDK を編集する。
ただし以下の修正を行うと、(たぶん) Titanium Studio などから普通の Androidデバッグ をやろうとしても、エミュレータが起動しないと思うので注意。
// 448行目付近
// これをコメントアウト
// emulatorProcess = spawn('python', emulatorCmd, { detached: true, stdio: 'ignore' });
// 動かしたくないからこうする
emulatorProcess = spawn('python', ['--version'], { detached: true, stdio: 'ignore' });
以上!!
Code Strong!!