Ruboto を使ってみる (Ubuntu を使用)
Ruboto は、Ruby(JRuby)を使って Android アプリを作るための枠組み・ツールチェーン。 Java や Kotlin を書かずに、Ruby と Android の API でアプリを組み立てられる。 アプリは実行時に JRuby(jruby-jars)に依存する。
* 現状について: Ruboto は少人数のコミュニティで開発されているニッチなプロジェクトで、 公式サイトの新着情報は 2019 年、RubyGems 上の安定版 gem は 1.6.1(2017 年)が最後。 最新の開発は GitHub の開発版(2.0 系, JRuby 9.4 を対象)で進んでいる。 本格的な Android アプリ開発では Kotlin/Java が標準だが、 Ruby で Android を動かす体験は面白いので、ここでは開発版を使って一通り試す。
前もって行なっておくこと
Java 処理系のインストール (install Java)
以前は Oracle Java 8 を使っていたが、現在はその配布用 PPA が使えないため、 OpenJDK を使う。JRuby 9.4 と最近の Android ツールは JDK 17 で動く。
- インストール
# パッケージリストの情報を更新 sudo apt update sudo apt -y install openjdk-17-jdk - 変数 JAVA_HOME の設定
OpenJDK 17 を使う場合の設定手順例
cd echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> .bashrc source ~/.bashrc - java のバージョンの確認
java -version
Android SDK のインストールと、変数 ANDROID_HOME の設定 (install Android SDK and set ANDROID_HOME)
現在は「コマンドラインツール (command line tools)」を使って SDK を管理する。 以前必要だった 32 ビット互換ライブラリ(ia32-libs)は、64 ビット版のツールになったため不要。
- Android Studio / コマンドラインツールの Web ページを開く
- ページ下部の「Command line tools only」から Linux 用の ZIP をダウンロードする。 (Android Studio 本体を使う場合は上部からダウンロードしてもよい)
- ライセンス条項を熟読し確認
納得できる場合のみ続行
- ファイルは、分かりやすいディレクトリ(例えば /tmp)に保存する
- 変数 ANDROID_HOME の設定と、コマンドラインツールの配置
SDK の置き場所を決め(例:$HOME/Android/Sdk)、その中の
cmdline-tools/latest/にツールを展開する(このフォルダ構成が必須)。cd echo 'export ANDROID_HOME=$HOME/Android/Sdk' >> .bashrc source ~/.bashrc mkdir -p $ANDROID_HOME/cmdline-tools cd $ANDROID_HOME/cmdline-tools unzip /tmp/commandlinetools-linux-*_latest.zip # 展開された cmdline-tools を latest という名前にする mv cmdline-tools latest - 変数 PATH の設定
cd echo 'export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator' >> .bashrc source ~/.bashrc - SDK コンポーネントのインストール
sdkmanager で、プラットフォームツール・エミュレータ・ビルドツール・プラットフォーム・システムイメージを入れる。 ここでは Android 14 (API レベル 34) を例にする。
# ライセンスに同意 yes | sdkmanager --licenses # 必要なコンポーネントをインストール sdkmanager "platform-tools" "emulator" \ "platforms;android-34" \ "build-tools;34.0.0" \ "system-images;android-34;google_apis;x86_64"
rbenv と JRuby のインストール (install rbenv and JRuby)
Ruby のバージョン管理に rbenv を使い、JRuby を入れる。 以前は JRuby 1.7 系を使っていたが、現在は JRuby 9.4 系を使う。
- rbenv のインストール
# パッケージリストの情報を更新 sudo apt update sudo apt -y install git cd git clone https://github.com/rbenv/rbenv.git ~/.rbenv git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build # rbenv を有効にする設定を .bashrc に追加 echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc
- rbenv 設定ファイルの更新
cd ~/.rbenv git pull cd ~/.rbenv/plugins/ruby-build git pull
- jruby のインストール
インストールできる JRuby の一覧は
rbenv install -lで確認できる。 ここでは JRuby 9.4 系の具体的なバージョンを入れる(例:jruby-9.4.9.0。一覧にある最新の 9.4 系を選ぶ)。rbenv install jruby-9.4.9.0 rbenv global jruby-9.4.9.0 jruby -v
Ruboto のインストールと設定
Ruboto のインストール (install Ruboto)
RubyGems 上の安定版(gem install ruboto)は 1.6.1 と古い。 最新の機能や JRuby 9.4 対応を使うため、ここでは GitHub の開発版(2.0 系)を入れる。 アプリ実行時に必要な jruby-jars も入れておく。
rbenv global jruby-9.4.9.0
# 開発版の Ruboto を GitHub から入れる
jruby -S gem install specific_install
jruby -S gem specific_install https://github.com/ruboto/ruboto.git
# アプリ実行時に必要な jruby-jars
jruby -S gem install jruby-jars
* 安定版でよければ、次のように RubyGems から入れることもできる。
jruby -S gem install ruboto
Ruboto を起動してみる (try to run Ruboto)
- 設定
ruboto setup で、足りない SDK コンポーネントの確認・設定を行う。
cd /tmp ruboto setup source ~/.bashrc - Android 仮想デバイスの生成 (Generate an Android Virtual Device (AVD))
以前の
androidコマンドは廃止された。現在は avdmanager で AVD を作る。 システムイメージは、先ほど sdkmanager で入れたもの(android-34, x86_64)を指定する。avdmanager create avd -f -n Android_14 \ -k "system-images;android-34;google_apis;x86_64" avdmanager list avd - エミュレータの起動 (Start emulator)
emulator -avd Android_14 - Ruboto プロジェクトの生成 (Creating a Ruboto project)
ターゲットは、入れたプラットフォームに合わせて android-34 を指定する。
cd /tmp ruboto gen app --package org.ruboto.example.quick_start --target android-34 - 生成された Ruby ファイルの更新 (Modify the generated .rb file)
下のプログラム(xkcd の「butterfly」ネタの定番サンプル)を
/tmp/quick_start/src/quick_start_activity.rb
に貼り付ける。ボタンを押すと文字と Toast が変わる、というだけの簡単なアプリ。require 'ruboto/widget' require 'ruboto/util/toast' ruboto_import_widgets :Button, :LinearLayout, :TextView # http://xkcd.com/378/ class QuickStartActivity def onCreate(bundle) super set_title 'Domo arigato, Mr Ruboto!' self.content_view = linear_layout :orientation => :vertical do @text_view = text_view :text => 'What hath Matz wrought?', :id => 42, :layout => {:width => :match_parent}, :gravity => :center, :text_size => 48.0 button :text => 'M-x butterfly', :layout => {:width => :match_parent}, :id => 43, :on_click_listener => proc { butterfly } end rescue Exception puts "Exception creating activity: #{$!}" puts $!.backtrace.join("\n") end private def butterfly @text_view.text = 'What hath Matz wrought!' toast 'Flipped a bit via butterfly' end end - ビルドしてエミュレータ(または実機)へ導入・起動
エミュレータが起動している状態で、プロジェクトのフォルダで次を実行する。
cd /tmp/quick_start rake install rake start - エミュレータ上でアプリが起動し、ボタンを押すと表示が変わることを確認する。
参考:既存の Android アプリに Ruby を組み込む
最近の Ruboto は、既存の Android アプリに JRuby を依存関係として追加するやり方も想定している。 Gradle の依存関係に JRuby を加え、必要な部分だけ Ruby で書く、という使い方もできる。 詳しくは公式サイト(ruboto.org)と GitHub(github.com/ruboto/ruboto)を参照。