iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

AndroidアプリをHaskellで書く為の環境構築

自己紹介

お初にお目にかかります、自称iPX界のHaskell*1部長、小川です。
趣味はプログラミングで、最近は携帯をXperia Z3 Compactに替えてみました。
今回はこれらを題材にしたいと思います。

初めに

Android端末を手に入れたからにはAndroidアプリを作りたいと思うのは人間の業です。
しかし今から普通に学ぶのもつまらないので、勉強中のHaskellで書ける様に環境を構築してみたいと思います。

調べてみるとMetasepi team様のMetasepiプロジェクトのサブプロジェクトとしてAjhc(Haskellコンパイラ)があります。
このAjhcのデモとしてAndroid NDK と Haskellの連携を行われています。
まさに求めているものです。
www.youtube.com


今回の目標はこちらのデモコードをビルド・動作させることをゴールとしたいと思います。
github.com

思えばこれが試練の始まりでした。

※紙面の都合上詳細を省いている箇所が御座います、ご了承ください。
※小川はLinuxAndroidHaskellもNewbieです、出来るだけ優しくマサカリを飛ばしてください。

実践

VirtualBox

次のURLからダウンロード、インストールします。
Downloads – Oracle VM VirtualBox

Debian

次のURLからdebian-8.0.0-amd64-netinst.isoをダウンロードします(小さなCD - amd64の部分です)。
Debian -- Getting Debian

VirtualBox上に仮想マシンを作成します。
主要な設定項目は次の通りです。

sudo

Debianインストール直後はsodoコマンドが存在しないので、インストールします。

$ su -
# aptitude update
# aptitude install sudo
# visudo

# User privilege specification 項に次の様に追記します

root     ALL=(ALL:ALL) ALL
%ogawa   ALL=(ALL:ALL) ALL

Ctrl+x、Enterで保存します。

git

デモコードをダウンロードする為にgitを入れます。

$ sudo apt-get install git-core
$ sudo apt-get install git-doc

demo-android-ndk

デモをダウンロードしましょう。

$ git clone https://github.com/ajhc/demo-android-ndk.git

JDK, ant

Javaでの開発の為に必要です、インストールしましょう。

$ sudo apt-get install openjdk-7-jdk ant

Android SDK, Android NDK

Android開発の為に必要です、NDKはHaskellとの連携に必要です、インストールしましょう。

$ wget http://dl.google.com/android/android-sdk_r22-linux.tgz
$ wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2
$ tar xf android-sdk_r22-linux.tgz
$ tar xf android-ndk-r9-linux-x86_64.tar.bz2
$ mv android-ndk-r9 android-ndk

※ダウンロードに時間が掛かるので、ここでCoCo壱を注文します。

環境変数PATHに各パスを追記します。

$ export PATH=$PATH:$HOME/android-ndk:$HOME/android-sdk-linux/tools:$HOME/android-sdk-linux/platform-tools

Android SDKに、諸々既定では含まれなくなったようなので、インストールします。

$ android update sdk -u

※ダウンロードに時間が掛かるので、ここで到着した手仕込とんかつカレーを食べます。

haskell-platform, その他

Haskell開発に必要なものと、その他デモのビルドに必要なものをインストールしましょう。

$ sudo apt-get install haskell-platform gcc make m4 autoconf lib32stdc++6 lib32z1

環境変数PATHにcabalへのパスを追記します。
cabalとはHaskellのパッケージ管理システムです。*2

$ export PATH=$PATH:$HOME/.cabal/bin

cabalのリストを更新します。

$ cabal update

Ajhc

jhc(Haskellコンパイラ)をforkして作られたコンパイラです、今回のキモとなります。
cabal経由でインストール出来ますがデモのビルド時に Libraries not found エラーが出てしまいました。
解決方法が分からなかったので、最新のソースコードからインストールしたいと思います
(Ajhcというよりもjhcの知識不足?? Makefileやantビルドと含めて理解していきたい)。
※上手くいかなかった場合は再起動等してみてください(環境変数PATHへの設定を忘れずに)。

$ sudo apt-get install patch libncurses5-dev \
libconfig-yaml-perl graphviz cpphs hscolour po4a \
libghc-temporary-dev libghc-haskeline-dev libghc-utf8-string-dev libghc-hssyck-dev \
libghc-test-framework-th-dev libghc-test-framework-hunit-dev \
libghc-test-framework-quickcheck2-dev libghc-uniplate-dev libgc-dev gcc valgrind
$ cabal install drift
$ cabal install ajhc
$ ajhc --version

$ git clone git://github.com/ajhc/ajhc.git
$ cd ajhc
$ git checkout arafura
$ autoreconf -i
$ ./configure
$ make
$ make install

demo-android-ndk

ここまで到達出来たらいよいよデモをビルドしてみましょう。

$ cd $HOME
$ cd demo-android-ndk
$ make
$ file */bin/*debug.apk
cube/bin/cube-debug.apk:                                 Java Jar file data (zip)
native-activity/bin/native-activity-debug.apk:           Java Jar file data (zip)

Android端末接続

Android端末側でUSBデバッグの許可を行う必要があります。
次のURLを参考にしました。
Android Tips : Android 4.2以上を搭載したXperia端末でデフォルト非表示の「開発者向けオプション」を表示する方法 | juggly.cn

次にPCとAndroid端末を接続し、Virtualboxに認識させます。
私の場合はXperiaなので、次の項目にチェックを入れます(端末がぴろっと鳴ったら接続完了)。
f:id:ipx-writer:20150502020957p:plain

次のコマンドで接続されたことを確認します。

$ lsusb
Bus 001 Device 003: ID 0fce:51bb Sony Ericsson Mobile Communications AB

IDの右隣(上記例では0fce)がベンダーIDと呼ばれるものです、次項に使います。

ベンダーIDに従って、次のファイルを作成します。

$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="ここにベンダーID", MODE="0666", GROUP="ogawa"

ここで一度USBを物理的に引っこ抜き、再度差し込みます。
次にVirtualBoxのメニューバーから再度USBを接続します。
Android端末側にUSBデバッグを許可する旨のダイアログを許可します
(分かりづらくて申し訳ないのですが、スクリーンショットを撮ろうとするとダイアログが消えました)。

最後にAVD(Android仮想デバイス)に認識されているか確認します、deviceと出れば接続完了です。

$ adb devices
*T9110XDA*    device

デモを端末へインストール

$ adb install -r cube/bin/cube-debug.apk

Hello Real Haskeroid World!!
f:id:ipx-writer:20150502024007j:plain

謝辞

今回勝手ながら善意によりWebで公開されている情報を元に記事を作成させていただきました。
豊富なドキュメント、貴重なQ&A、貴重なHowToを公開されている方々にこの場を借りて感謝申し上げます。

*1:部員は1人です。

*2:依存関係を解決してインストールしてくれるすごいやつ、でも油断していると地獄をおみまい!! 通称cabal Hell