RubotoによるRuby Androidスクリプティング環境
RejectKaigi2010発表資料の文章版です。
Android側の実行環境はNexus One, Android 2.2です。
動機
Google Developer Day 2010のDevQuizで出題されていたPac-Manのシミュレータをいろんな人が公開しているのを見て、こんなのがAndroidでさっくりと動かせたら良いなぁと。
Androidアプリケーションの開発は、Eclipse+Android用プラグインによるクロス開発が基本ですが、PCからAndroid機 (またはエミュレータ) へのパッケージ転送およびインストールに数十秒程度の時間を要するため、ちょっとずついじっては試しに実行して…というサイクルを繰り返すにはあまり向いていません。
Ruboto IRB
ある時期以降のJRuby (少なくともJRuby 1.2) では、JRubyのjarファイルをDalvikバイトコードに変換することでAndroid上で動くことが知られています。
実際JRubyをAndroid用にパッケージ化したものがいくつか存在しますが、Chales Nutter氏が開発に参加している「Ruboto IRB」が最もメジャーのようです。
Ruboto IRBの紹介については以下の記事が詳しいですが、ここでは実際にインストールして動かしてみることにします。
# ↑の記事へのトラックバックはできないみたい…
Android Marketからのインストール
Hello world
RubotoにはIRB/Editor/Scriptsの3つのモードがありますが、まずはIRBモードでHello worldを実行してみます。
Scriptsモードで、Rubotoの配布に含まれるいくつかのサンプルスクリプトを選択することができ、Editorモードでそれを編集/実行することができます。
まだちゃんと試していませんが、RubyスクリプトからAndroid APIを直接呼び出せるようです。
問題点
さて、Rubotoを使って実際にAndroidアプリを作ろうとすると、いくつかの問題点があることに気づきます。
あるべき解決法
ということで、実用的なAndroidアプリをJRubyで書くにはどのような環境があるべきかを考察しました。
- PC側では、ローカルアプリとして動作するエディタ (できれば普段使い慣れているもの) を使ってRubyスクリプトを編集
- PC側で編集したRubyスクリプトを、Android上のストレージと同期
- Android実機 (またはエミュレータ) 上でスクリプトを実行
- 必要に応じて実行結果をPC上にリアルタイムに表示
残念ながら、上記の条件を完全に満たす手段は現在存在しないようです。
(もし知っていたら教えてもらえるとありがたいです)
代替手段
上記の理想像を完全に満たさなくても、問題点として挙げたものを部分的に解決する手段はないかを調べてみました。
- Android実機+ハードウェアキーボード: USB接続とBluetooth接続が使えるようです。スクリプト入力のしづらさについてはとりあえず解決。
- androidscreencast: PC上で動作するアプリケーションで、USBケーブルを通して、Android実機に対するリモートデスクトップのように動作します。Android機側でrootを取得していることが動作条件です。キー入力の問題はこれでも解決できるはずですが、実際に試した限りでは画面が粗いのとレスポンスが遅いのとで、実用レベルには至っていないようです。
- SDカードを通したファイル転送: SDカードそのものをAndroid機−PC間で挿し替えるか、USBケーブル接続状態でPCからマウントすることで、PCとAndroid機との間でファイルを転送できます。ただし、いずれの場合もPCとAndroid機の両方から同時にSDカードをマウントすることはできないので、頻繁にスクリプトの同期を取るような状況には適していません。
Android側のアプリ (Ruboto IRB) を改造して、無線LANあるいはUSB経由でPCとの間のファイル同期をできるようにすることは原理的にはできそうな気がしますが、そこまでチャレンジするかどうかは微妙なところです。