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
思えばこれが試練の始まりでした。
※紙面の都合上詳細を省いている箇所が御座います、ご了承ください。
※小川はLinuxもAndroidもHaskellも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
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なので、次の項目にチェックを入れます(端末がぴろっと鳴ったら接続完了)。
次のコマンドで接続されたことを確認します。
$ 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!!
謝辞
今回勝手ながら善意によりWebで公開されている情報を元に記事を作成させていただきました。
豊富なドキュメント、貴重なQ&A、貴重なHowToを公開されている方々にこの場を借りて感謝申し上げます。
参考文献
- Downloads – Oracle VM VirtualBox
- Debian -- Getting Debian
- Android - HaskellWiki
- Ajhc - Haskell everywhere
- GitHub - ajhc/demo-android-ndk: Demo Ajhc application on Android NDK
- 簡約!? λカ娘 Rock!の紹介とHaskell製Androidアプリの解説 - Metasepi
- Eclipseを使わない人のAndroid SDK & NDK の開発メモ - C++ ときどき ごはん、わりとてぃーぶれいく☆
- 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編
- linux - Android missing platform tools - Stack Overflow
- java - "aapt" IOException error=2, No such file or directory" why can't I build my gradle on jenkins? - Stack Overflow
- Android Tips : Android 4.2以上を搭載したXperia端末でデフォルト非表示の「開発者向けオプション」を表示する方法 | juggly.cn
- 日々のコトとか WindowsにUbuntuでadb環境
- Linux上のAndroid開発で実機実行する際のudev/adb設定 | さかな前線