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 で動く。

  1. インストール
    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install openjdk-17-jdk
    
  2. 変数 JAVA_HOME の設定

    OpenJDK 17 を使う場合の設定手順例

    cd 
    echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> .bashrc 
    source ~/.bashrc
    
  3. java のバージョンの確認

    java -version 
    

Android SDK のインストールと、変数 ANDROID_HOME の設定 (install Android SDK and set ANDROID_HOME)

現在は「コマンドラインツール (command line tools)」を使って SDK を管理する。 以前必要だった 32 ビット互換ライブラリ(ia32-libs)は、64 ビット版のツールになったため不要。

  1. Android Studio / コマンドラインツールの Web ページを開く

    https://developer.android.com/studio

  2. ページ下部の「Command line tools only」から Linux 用の ZIP をダウンロードする。 (Android Studio 本体を使う場合は上部からダウンロードしてもよい)
  3. ライセンス条項を熟読し確認

    納得できる場合のみ続行

  4. ファイルは、分かりやすいディレクトリ(例えば /tmp)に保存する
  5. 変数 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
    
  6. 変数 PATH の設定

    cd 
    echo 'export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator' >> .bashrc 
    source ~/.bashrc
    
  7. 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 系を使う。

  1. 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
    

  2. rbenv 設定ファイルの更新
    cd ~/.rbenv
    git pull
    cd ~/.rbenv/plugins/ruby-build
    git pull
    

  3. 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)

  1. 設定

    ruboto setup で、足りない SDK コンポーネントの確認・設定を行う。

    cd /tmp
    ruboto setup 
    source ~/.bashrc
    
  2. 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
    
  3. エミュレータの起動 (Start emulator)
    emulator -avd Android_14
    
  4. Ruboto プロジェクトの生成 (Creating a Ruboto project)

    ターゲットは、入れたプラットフォームに合わせて android-34 を指定する。

    cd /tmp
    ruboto gen app --package org.ruboto.example.quick_start --target android-34
    
  5. 生成された 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
    
  6. ビルドしてエミュレータ(または実機)へ導入・起動

    エミュレータが起動している状態で、プロジェクトのフォルダで次を実行する。

    cd /tmp/quick_start
    rake install
    rake start
    
  7. エミュレータ上でアプリが起動し、ボタンを押すと表示が変わることを確認する。

参考:既存の Android アプリに Ruby を組み込む

最近の Ruboto は、既存の Android アプリに JRuby を依存関係として追加するやり方も想定している。 Gradle の依存関係に JRuby を加え、必要な部分だけ Ruby で書く、という使い方もできる。 詳しくは公式サイト(ruboto.org)と GitHub(github.com/ruboto/ruboto)を参照。