RubotoによるRuby Androidスクリプティング環境

RejectKaigi2010発表資料の文章版です。

Android側の実行環境はNexus One, Android 2.2です。

動機

Google Developer Day 2010のDevQuizで出題されていたPac-Manのシミュレータをいろんな人が公開しているのを見て、こんなのがAndroidでさっくりと動かせたら良いなぁと。

Androidアプリケーションの開発は、EclipseAndroidプラグインによるクロス開発が基本ですが、PCからAndroid機 (またはエミュレータ) へのパッケージ転送およびインストールに数十秒程度の時間を要するため、ちょっとずついじっては試しに実行して…というサイクルを繰り返すにはあまり向いていません。

Android上でJRubyが動くと聞いたことがあるので、どういう状況かを実際に触って調べてみました。

(と言いつつ、実際はAndroid上でRubyを動かしてみたかっただけというのが実態ですがw)

Ruboto IRB

ある時期以降のJRuby (少なくともJRuby 1.2) では、JRubyのjarファイルをDalvikバイトコードに変換することでAndroid上で動くことが知られています。

実際JRubyAndroid用にパッケージ化したものがいくつか存在しますが、Chales Nutter氏が開発に参加している「Ruboto IRB」が最もメジャーのようです。

Ruboto IRBの紹介については以下の記事が詳しいですが、ここでは実際にインストールして動かしてみることにします。

# ↑の記事へのトラックバックはできないみたい…

Android Marketからのインストール

"ruboto" のようなキーワードで検索するのが手っ取り早いと思います。

Hello world

RubotoにはIRB/Editor/Scriptsの3つのモードがありますが、まずはIRBモードでHello worldを実行してみます。

Scriptsモードで、Rubotoの配布に含まれるいくつかのサンプルスクリプトを選択することができ、Editorモードでそれを編集/実行することができます。
まだちゃんと試していませんが、RubyスクリプトからAndroid APIを直接呼び出せるようです。

問題点

さて、Rubotoを使って実際にAndroidアプリを作ろうとすると、いくつかの問題点があることに気づきます。

  • 内蔵エディタの画面が狭すぎて、実用的なAndroidアプリをこれで編集するのは厳しい
  • ソフトウェアキーボードでは、まとまった規模のスクリプトを書くのは厳しい
  • PCの画面上で実行結果を確かめるにはAndroidエミュレータ (AVD) を使う必要があるが、AVDの上でRubotoのエディタを動かすと非常に動作が遅くて使いづらい

あるべき解決法

ということで、実用的なAndroidアプリをJRubyで書くにはどのような環境があるべきかを考察しました。

残念ながら、上記の条件を完全に満たす手段は現在存在しないようです。
(もし知っていたら教えてもらえるとありがたいです)

代替手段

上記の理想像を完全に満たさなくても、問題点として挙げたものを部分的に解決する手段はないかを調べてみました。

  • 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との間のファイル同期をできるようにすることは原理的にはできそうな気がしますが、そこまでチャレンジするかどうかは微妙なところです。