Windows7にRubotoをセットアップして、RubyによるAndroidアプリの作成を試してみた

前回はRhoMobileの開発環境を構築してみましたが、同じようにRubyで書けるRubotoというフレームワークもあったため、こちらの開発環境も構築してみました。
そんな中、Windows環境で構築する時にいろいろとあったため、メモを残しておきます。

構築する環境

インストール手順

以下を参考に、Windows環境を構築しました。

 

Ruby

今回はRubyをインストールする必要があったため、RubyInstallerを利用しました。

インストール時の設定は以下の通りです。

項目
インストール先 C:\Ruby200
Rubyの実行ファイルへ環境変数PATHを設定する チェックする
■.rbと.rbwファイルをRubyに関連づける チェックする

 

rakeの上書き

上記のgithubページにrakeを再度インストールすると書かれていたため、同じようにインストールしました。

gem install rake --no-ri --no-rdoc

 

ruboto

gemでrubotoを入れます。なお、「jruby-jars」についてはrubotoに依存しているようなので、rubotoと同時にインストールされるようです(gem listで確認しました)。

gem install ruboto --no-ri --no-rdoc

 

JDK

JDK 7u25 x86 (jdk-7u25-windows-i586.exe) を以下のパスにインストールしました。

# JDK
C:\jdk7x86\

# JRE
C:\jre7x86\

 

Ant

apache-ant-1.9.1-bin.zip」をダウンロードし、以下のパスに展開しました。

C:\ant\<この下に展開>

 

Android SDK (SDK Tools Only)

以下のURLの「DOWNLOAD FOR OTHER PLATFORMS」を展開し、SDK Tools Onlyより「installer_r22.0.1-windows.exe」をダウンロードし、以下のパスにインストールしました。

C:\androidsdk\

 

Android SDK Managerによるインストール

コマンドラインからも実行できますが、「Build-tools」の入れ方が分からなかったため、SDK Managerで以下をインストールします。
なお、Nexus7へアプリをインストール・USBデバッグをするため、Google USB Driverも入れておきます。

項目 名前 Rev.
Tools Android SDK Platform-tools 17
Android SDK Build-tools 17
Android4.2.2 (API17) SDK Platform 2
ARM EABI v7a System Image 2
Google APIs 3
Extras Google USB Driver 7

 

環境変数の設定

以下の環境変数を設定します。設定し終わったら、念のため再起動します。


Path
Android関連・Java・AntをPathに追加します。
Android SDK r22では、adb.exeやbuild-toolsの位置などに変更が入ったようなので、忘れないように追加します。

;C:\androidsdk\platforms;C:\androidsdk\tools;C:\androidsdk\platform-tools;C:\androidsdk\build-tools\;C:\jdk7x86\bin;C:\ant\apache-ant-1.9.1\bin;


JAVA_HOME
ビルド時に必要なため、設定します。

C:\jdk7x86\bin


ANDROID_HOME
アプリを生成する時とビルドする時に必要なので設定します。
なお、パスのセパレータは「/」(スラッシュ)にします。

C:/androidsdk


スラッシュにする理由としては、Ruboto0.13.0の場合、セパレータを「\」(バックスラッシュ)にしたところ、アプリを生成時とビルド時でエラーが発生したためです。
アプリを生成するときのエラーを見ると、「C:\androidsdk/platforms.」とありました。RubyのセパレータとWindowsのセパレータが混在しているため、うまく動作しないようです*1

********************************************************************************
Could not find any Android platforms in C:\androidsdk/platforms.
At least one Android Platform SDK must be installed to compile the Ruboto classes.
Please install an Android Platform SDK using the "android" package manager.
********************************************************************************


一方、ビルド時は、以下のエラーが発生します。

You need to install the Android SDK Build-tools!


ビルド時に使う「rakelib/ruboto.rake」を読むと、42行目あたりでdx.batファイルの存在チェックをしています。

dx_filename = Dir[File.join(ENV['ANDROID_HOME'], '{build-tools/*,platform-tools}', ON_WINDOWS ? 'dx.bat' : 'dx')][-1]


こちらも、WindowsでFile.joinの結果が「C:\\androidsdk/build-tools/*/dx.bat」となり、Dir[]で正しく検索できず、エラーとなるようです。
そのため、以下のような感じで書き換えれば、うまく動作するかと思います*2
なお、今回は環境変数を修正しているため、以下の対応はしていません。

# dx_filename = Dir[File.join(ENV['ANDROID_HOME'], '{build-tools/*,platform-tools}', ON_WINDOWS ? 'dx.bat' : 'dx')][-1]
dx_filename = Dir[File.join(ON_WINDOWS ? ENV['ANDROID_HOME'].tr('\\\\', '/') : ENV['ANDROID_HOME'], '{build-tools/*,platform-tools}', ON_WINDOWS ? 'dx.bat' : 'dx')][-1]

 

Ruboto関連のインストール確認

今回はAndroid API 17 を使用するため、「-t 17」を追加したコマンドを使用します。

ruboto setup -t 17


その結果が以下の通りとなれば、OKです。
ただ、手元の環境では「Android SDK Command dx : Not found」となってもビルドなどは成功しているため、あくまでも参考にという程度でしょうか。

Java runtime : Found
Java Compiler : Found
Apache ANT : Found
Android Package Installer: Found
Android Emulator : Found
Android SDK Command adb : Found
Android SDK Command dx : Found
Platform SDK android-17 : Found

*** Ruboto setup is OK! ***

 

アプリの作成

今回はJRubyを同梱する「app1」というアプリを作ります。 (不要な場合には、「--with-jruby」オプションを削除します)

cd /d d:\
mkdir devruboto
cd devruboto
d:\devruboto\app1>ruboto gen app --package org.ruboto.example.app1 --target android-17 --with-jruby


上記のコマンド実行後、以下が表示されればOKです。

Hello, App1

 

ビルド

ビルド前の準備

Windowsの場合、ヒープメモリの編集をしないとビルドエラーが発生しました。AVD Managerの表示などから、768MBよりも大きいとエラーとなるようです*3

[dx] Could not create the Java virtual machine.Error occurred during initialization of VM
[dx] Could not reserve enough space for object heap


そこで、いくつか設定できそうな場所を探してみました。

  1. D:\devruboto\app1\rakelib\ruboto.rake
  2. C:\androidsdk\build-tools\17.0.0\dx.bat
  3. 環境変数「ANT_OPTS」に値「-Xmx768m」を設定


ただ、環境変数「ANT_OPTS」については以下のような記事もあったため、今回は1と2のみ対応するようにします。


ruboto.rakeは、52行目あたりを修正します。

# MINIMUM_DX_HEAP_SIZE = 1600
MINIMUM_DX_HEAP_SIZE = 768


dx.batは、53行目あたりを修正します。

rem set defaultXmx=-Xmx1600M
set defaultXmx=-Xmx768M


これにより、Windowsでビルドができるようになりました。



 

ビルド

以下のコマンドでビルドします。

cd app1
d:\devruboto\app1>rake

 

エミュレータの作成

AVD Managerより、エミュレータを作成します。なお、以下の項目以外は初期値のままとしておきます。

項目
AVD Name 任意、今回は ruboto
Device Nexus7
Target Android 4.2.2 - API Level 17
CPU/ABI ARM (armeabi-v7a)
Memory Options - RAM 768
Memory Options - VM Heap 32

 

エミュレータの起動とアプリのインストール

以下を参考にして、アプリをエミュレータへインストールします。

エミュレータの名称を確認

上記で作成した「ruboto」が表示されればOKです。

android list avd

 

エミュレータの起動

コマンドプロンプトが別に開き、エミュレータも起動します(しばらく待ちます)。

start emulator -avd ruboto

 

エミュレータへのアプリのインストール
d:\devruboto\app1>adb install ./bin/App1-debug.apk

 

Nexus7へのインストール

今回はGmail経由ではなく、USB経由でインストールをします。

事前準備

開発者向けオプションを使えるようにする
Nexus 7 Android 4.2で消えた開発者向けオプションを表示させる方法。 - Android(アンドロイド)おすすめアプリ・カスタムニュース|AndroidLover.Net


Androidの「設定」より、以下の作業を行う

  • セキュリティ > 「提供元不明のアプリ」にチェックを入れる
  • ストレージ > 右上のメニューボタン > USBでパソコンに接続 > 「カメラ(PTP)」にチェックを入れる
  • 開発者向けオプション > 「スリープモードにしない」にチェックを入れる
  • 開発者向けオプション > 「USBデバッグ」にチェックを入れる


なお、Nexus7をPCに接続して認識されている場合でも、インストールを行う際に「error: device not found」と表示されることがありました。
その場合は、

  1. コマンドプロンプトで「adb kill-server」
  2. ハードウェアの安全な取り外しで、Nexus7を取り外す
  3. PCからUSBを取り外し、別のUSBポートにさす

としたところ、Nexus7が再認識されて、うまくいきました。
Android Device Offline: Fixing ADB Connection Error



 

インストール

Nexus7をUSB接続し、以下のコマンドを実行します。

# インストールのみ
d:\devruboto\app1>rake install

# インストール後、Nexus7でアプリを起動する
d:\devruboto\app1>rake install start


なお、一度インストールしたものを削除後に再度インストールする場合は、以下のコマンドになります。

d:\devruboto\app1>rake reinstall

以前使用していた「rake install:clean」を置き換えたものになるようです。
ソースコードを読むと「Remove in 2013」とあり、実行すると「"rake install:clean" is deprecated. Use "rake reinstall" instead.」と表示されました。
ruboto-irb/rakelib/ruboto.rake at master · ruboto/ruboto-irb · GitHub



 

環境構築時のエラー

今回も環境構築時にエラーが発生したため、それらも残しておきます。

環境変数ANDROID_HOME」を設定しない場合のエラー

ruboto gen app する段階で、以下のエラーが発生します。

C:/Ruby200/lib/ruby/gems/2.0.0/gems/ruboto-0.13.0/lib/ruboto/sdk_locations.rb:12:in `': Unable to locate the "adb" command.
Either set the ANDROID_HOME environment variable or add the location of the "adb" command to your path. (RuntimeError)

 

環境変数「PATH」に「C:\androidsdk\platform-tools」が不足している時のエラー

Android SDK r22より、「adb.exe」の場所が変更されたことにより発生しているため、環境変数に追加する必要があります。

rake --trace
rake aborted!
No such file or directory - adb version
d:/devruboto/app1/rakelib/ruboto.rake:32:in ``'
d:/devruboto/app1/rakelib/ruboto.rake:32:in `'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/rake_module.rb:25:in `load'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/rake_module.rb:25:in `load_rakefile'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/default_loader.rb:6:in `load'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:663:in `load_imports'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:596:in `raw_load_rakefile'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:89:in `block in load_rakefile'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:88:in `load_rakefile'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:72:in `block in run'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/lib/rake/application.rb:70:in `run'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/rake-10.0.4/bin/rake:33:in `'
C:/Ruby200/bin/rake:23:in `load'
C:/Ruby200/bin/rake:23:in `

'

 

「Build-tools」をインストールしないとエラー

Rubotoが出しているエラーですが、Android SDK r22よりBuild-toolsが必要になったため、エラーが発生しているようです。

rake
you need to install the Android SDK Build-tools!

*1:おそらく、この場合はRubyの中で探そうとした時に見つからなかったかと

*2:アプリ生成後に、ANDROID_HOMEのセパレータを「\」に変更してビルドしてみたら成功した

*3:AVDを作る際に「On Windows, emulating RAM greater than 768M may fail depending ...」との表示あり