2016 android × scala @scalamatsuri2016
TRANSCRIPT
AndroidでScalaSepteni Original 杉谷
前説
• GANMA! という漫画配信サービスのAndroid版はScalaで出来ています(1/18リリース版から)
• 作成途中に得られた知見を思いつく限りご紹介します
使い物になる?
• なってる
• 道中の難所は多い
• 乗り越えた先は比較的平穏
ビルドシステム• ビルドシステムが2種類ある
• android-idk-plugin
• SBTにAndroid-SDKを対応させるプラグイン
• gradle-android-scala-plugin (@saturday06さん作)
• GradleにScalaを対応させるプラグイン
• gradle-android-scala-plugin の方を採用
• 標準ビルド環境へのプラグインなので、導入がとても楽
• IDEAとの統合に特殊操作不要
• Gradle前提の各種ライブラリがそのまま使える
• 現状困っていることは無い
良い:Scalaが使える
• サーバ側もScalaなので、いつものようにさくさく書けるうれしさ
良い: Futureが美味• Future/Promiseが標準で使えるので、コールバック地獄を抑えられる
• onResume →ネットワーク通信 → 各種処理 → ローディングくるくる表示終わり、 とかがすっきり書ける
• UI処理はメインスレッド縛り、がやや難点
• OEさんのUIExecutionContext
• 自作のThreadUtil.runOnUiThread
良い:lazyが美味
• View要素へのアクセスがすっきり書ける
lazy private val spaceTop = view.findViewById(R.id.author_top_space)
パフォーマンス• 全然問題ない(クレーム無し)
• ぬるぬるさくさく動く
• メモリ消費は荒いので、アプリによっては注意が必要?
つらい: ぬるぽ
• Android側からNullよくやってくる
• Infra層とView層で徹底防御
• 怪しそうなのはOptionでよく包む
つらい:Androidエンジニア問題
• 居ない。
• 自社で育成するしかない。
• チームのエンジニア全員が学習(Scalaエンジニアx6, Obj-c,Swiftエンジニアx1)
つらい:MultiDex地獄• Dalvikは1dex 65,535メソッドまで制限
• Scalaを使うと余裕で突破するのでMultiDex必須
• GANMA!アプリで3Dex( ProGuard適用済み)
• 実際にはぴったり65,535詰めると2Dexだが、Android4.0.x系にバグがあって余裕を持たせないといけない
• 初回起動がかなり遅い
• テストAPKにMultiDexをかけると死ぬ
• コマンドラインをいじってテストパッケージは除外
• 65,535超えないことを祈る。
つらい:MultiDex地獄(2)
tasks.matching { it.name.startsWith('dex') && !it.name.contains("Test") }.each { dx -> if (dx.additionalParameters == null) { dx.additionalParameters = [] } dx.additionalParameters += '--multi-dex' dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString() dx.additionalParameters += '--set-max-idx-number=45000'}
つらい:テスト• AndroidのテストはJUnit3(標準),JUnit4(Espresso)しか使えない様子
• assertThatで頑張る
• UI交えたテストがものすごく転ける
• IdlingResource(assert判定の条件が整うまで待つ)をとてもしっかり作り込まないといけない
• 関わるUI処理にFuture[Unit]を返させるようにして、厳密判定できるようにする
• (余談)iOSのQuick/Nimbleだと「条件が整うまで、何度もチェックする」と書けるので楽
つらい:ライブラリ
• javax依存があるライブラリは使えない
• json4sを含む殆どのJSONライブラリがビルド不能
• json-lensesがなんとか動いた、 https://github.com/jrudolph/json-lenses
つらい:ビルド• ビルド遅い
• Scalaが遅いというより全部が遅い
• 差分コンパイルが効いて殆どScalaに時間がかからなくても遅い
• AndroidStudio次期版に、実行中のクラス差し替え可能可、による爆速化があるがScalaでは使えなかった
その他微妙につらい
• IntelliJが起動する度に”ScalaSDKどこ?”と効いてくる
• IntelliJからテストのクラス指定するときちょっと罠がある
その他
• IntelliJ Ultimate使ってますがAndroid Studioでもいけました
以上です
ご静聴ありがとうございました!
セプテーニではScalaエンジニアを募集していま
す!!!!!!!!!!!!!!!!!!!!!!!!