ScalaでAndroidアプリな修行をはじめています

Android!

自称フロントエンドエンジニアということで、普段はHTML/CSS/JavaScriptが守備範囲ですが、Android/iOSでネイティブアプリも作ることができたら、クライアントサイド実装の幅を拡げられるな〜、ということでレッツトライ。


前回Railsで俺専用RSSリーダーを用意したので、それのControllerに.jsonのレスポンスを追加してAPIらしくしました。

それを取得してAndroidでリスト表示+選択した記事のWebView表示くらいまでを目標に挑戦中。

今の時点でも、リスト表示とカテゴリー切り替え、WebViewでの記事表示までは出来てます(∩´∀`)∩ ワーイ


解説記事を見ながら環境構築

前提としてScala + IntelliJ IDEAでAndroidしたかったので、 ちょうど同じ条件で手順を解説されている[Mac] Android アプリを Scala + Intellij で開発したい件 | ゆーすけぶろぐ を参考に進めました。


Android SDKとPATH

Android SDK本体は以前からemulatorやらddmsの利用のため入れていたのでインストール済み。その上で.zshrcにAndroid SDK周りのPATHを下記のように通しています。

export ANDROID_SDK=/Applications/android-sdk-macosx
export ANDROID_SDK_HOME=/Applications/android-sdk-macosx
export PATH=$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools:$PATH

IntelliJ IDEAにSDKの類を登録

IntelliJ IDEAに、 Structure > Platform Settings > SDKs でJDKとAndroid SDKを登録しました。JDKが入っていない場合は、ググったらMac向けのJava SE 6のインストールを参考に。7は試してないです。

JDK 1.6
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Android 4.0.3 Platform (API Level 15)
/Applications/android-sdk-macosx

Scala

Scalaは、ScalaでPlayなアプリをHerokuにデプロイした作業ログ ::ハブろぐでインストール済み。自分はyuroyoro/svmを利用しています。もちろん、homebrewなどで入れても良いと思います。

あ、はじめpocorall/scaloidを使おうとして、それがScalaのバージョンを2.10.0以上で要求していたので、アップデートして今2.10.1を利用しています。scaloid自体は結局、余計混乱しそうだったので今回は使わないことにしました。

android-plugin

ScalaでAndroid開発するためのsbtプラグイン(sbt = Scalaのビルドツール)を導入します。初期化やビルド、実機転送などもこれで行うことになります。

Getting started · jberkel/android-plugin Wikiを参考に進めます。

テンプレートからプロジェクトを作成 giter8というScalaテンプレート生成コマンドを、conscriptというscalaベーススクリプトのインストールコマンドを使って導入します。(ややこしい)

どちらもgithubのリポジトリをベースとしているみたいです。ナウいですね。

% curl https://raw.github.com/n8han/conscript/master/setup.sh | sh
% ~/bin/cs n8han/giter8

% ~/bin/g8 jberkel/android-app

Template for Android apps in Scala

package [my.android.project]: mu.aho.Testroid
name [My Android Project]: Testroid
main_activity [MainActivity]:
scala_version [2.9.2]: 2.10.1
api_level [10]: 15
useProguard [true]:
scalatest_version [1.8]:

Template applied in ./testroid

sbt-ideaプラグインを入れるとIDEAの設定ファイルを作れるようになったりします。ユーザーディレクトリの.sbt/plugins/build.sbtに下記の内容を書いておけばOK。

% mkdir ~/.sbt/plugins
% emacs ~/.sbt/plugins/build.sbt

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.2.0")

実際にIDEAの設定を作って、デバイスに転送してHello Worldするにはsbt 'gen-idea no-classifiers' compileして実機かエミュレーターにインストールします。

% cd ./testroid
% sbt 'gen-idea no-classifiers' compile
% sbt
> android:package-debug
(…何か色々でる)
> android:list-devices
List of devices attached
NANANNANA      device

> android:install-device

なんかいろいろ

Androidならでは的な。最早メモ書きです。

HTTP

基本のHTTP通信から。

NetworkOnMainThreadException

メインスレッドで直接ネットワーク処理を行うとandroid.os.NetworkOnMainThreadExceptionが発生して落ちます。UIスレッドをブロックすんな的な?フロントもブラウザ気にせずWebWorker使えるとよかですな。。

AsyncTaskLoader

で、AsyncTaskLoaderで別のThreadにさばいてCallbackを受け取ればOKということで。

Fragment

Fragmentという仕組みを使うと良いそうです。ListFragmentを継承してLoaderCallbacksを実装したりとか。

android-support-v4.jar

APIレベルを15に上げる前に、Compatibility Packageを試していたのですが、その際はlibディレクトリに.jarを突っ込めばOKでした。

Play2.0(Scala)で依存するjarを追加する | mwSoft

ということで

現在のフロントエンドを深く掘るためのナレッジも大切ですが、今後継続的にクライアントサイドの表現の幅を拡げるには、同時に新しい領域に移り続けられる地力を鍛えるですね、ってことでちょっとチャレンジしてている最中な次第。

JavaもAndroidのAPIも分かってるわけじゃないのに、いきなりScalaを選んだおかげで、Androidの扱いと世間のJavaサンプルコードをScalaで表現することの両面で苦しんでおります。まあ、慣れたらわりと何とかなってきましたが。。。(´ω`)

http://read.aho.muを見るだけのアプリですが、勢いでPlay Storeに公開するところまではいってみようと思います。