2016 android × scala @scalamatsuri2016

19
AndroidでScala Septeni Original 杉谷

Upload: yasuyuki-sugitani

Post on 14-Apr-2017

1.264 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: 2016 Android × Scala @ScalaMatsuri2016

AndroidでScalaSepteni Original 杉谷

Page 2: 2016 Android × Scala @ScalaMatsuri2016

前説

• GANMA! という漫画配信サービスのAndroid版はScalaで出来ています(1/18リリース版から)

• 作成途中に得られた知見を思いつく限りご紹介します

Page 3: 2016 Android × Scala @ScalaMatsuri2016

使い物になる?

• なってる

• 道中の難所は多い

• 乗り越えた先は比較的平穏

Page 4: 2016 Android × Scala @ScalaMatsuri2016

ビルドシステム• ビルドシステムが2種類ある

• android-idk-plugin

• SBTにAndroid-SDKを対応させるプラグイン

• gradle-android-scala-plugin (@saturday06さん作)

• GradleにScalaを対応させるプラグイン

• gradle-android-scala-plugin の方を採用

• 標準ビルド環境へのプラグインなので、導入がとても楽

• IDEAとの統合に特殊操作不要

• Gradle前提の各種ライブラリがそのまま使える

• 現状困っていることは無い

Page 5: 2016 Android × Scala @ScalaMatsuri2016

良い:Scalaが使える

• サーバ側もScalaなので、いつものようにさくさく書けるうれしさ

Page 6: 2016 Android × Scala @ScalaMatsuri2016

良い: Futureが美味• Future/Promiseが標準で使えるので、コールバック地獄を抑えられる

• onResume →ネットワーク通信 → 各種処理 → ローディングくるくる表示終わり、 とかがすっきり書ける

• UI処理はメインスレッド縛り、がやや難点

• OEさんのUIExecutionContext

• 自作のThreadUtil.runOnUiThread

Page 7: 2016 Android × Scala @ScalaMatsuri2016

良い:lazyが美味

• View要素へのアクセスがすっきり書ける

lazy private val spaceTop = view.findViewById(R.id.author_top_space)

Page 8: 2016 Android × Scala @ScalaMatsuri2016

パフォーマンス• 全然問題ない(クレーム無し)

• ぬるぬるさくさく動く

• メモリ消費は荒いので、アプリによっては注意が必要?

Page 9: 2016 Android × Scala @ScalaMatsuri2016

つらい: ぬるぽ

• Android側からNullよくやってくる

• Infra層とView層で徹底防御

• 怪しそうなのはOptionでよく包む

Page 10: 2016 Android × Scala @ScalaMatsuri2016

つらい:Androidエンジニア問題

• 居ない。

• 自社で育成するしかない。

• チームのエンジニア全員が学習(Scalaエンジニアx6, Obj-c,Swiftエンジニアx1)

Page 11: 2016 Android × Scala @ScalaMatsuri2016

つらい:MultiDex地獄• Dalvikは1dex 65,535メソッドまで制限

• Scalaを使うと余裕で突破するのでMultiDex必須

• GANMA!アプリで3Dex( ProGuard適用済み)

• 実際にはぴったり65,535詰めると2Dexだが、Android4.0.x系にバグがあって余裕を持たせないといけない

• 初回起動がかなり遅い

• テストAPKにMultiDexをかけると死ぬ

• コマンドラインをいじってテストパッケージは除外

• 65,535超えないことを祈る。

Page 12: 2016 Android × Scala @ScalaMatsuri2016

つらい: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'}

Page 13: 2016 Android × Scala @ScalaMatsuri2016

つらい:テスト• AndroidのテストはJUnit3(標準),JUnit4(Espresso)しか使えない様子

• assertThatで頑張る

• UI交えたテストがものすごく転ける

• IdlingResource(assert判定の条件が整うまで待つ)をとてもしっかり作り込まないといけない

• 関わるUI処理にFuture[Unit]を返させるようにして、厳密判定できるようにする

• (余談)iOSのQuick/Nimbleだと「条件が整うまで、何度もチェックする」と書けるので楽

Page 14: 2016 Android × Scala @ScalaMatsuri2016

つらい:ライブラリ

• javax依存があるライブラリは使えない

• json4sを含む殆どのJSONライブラリがビルド不能

• json-lensesがなんとか動いた、 https://github.com/jrudolph/json-lenses

Page 15: 2016 Android × Scala @ScalaMatsuri2016

つらい:ビルド• ビルド遅い

• Scalaが遅いというより全部が遅い

• 差分コンパイルが効いて殆どScalaに時間がかからなくても遅い

• AndroidStudio次期版に、実行中のクラス差し替え可能可、による爆速化があるがScalaでは使えなかった

Page 16: 2016 Android × Scala @ScalaMatsuri2016

その他微妙につらい

• IntelliJが起動する度に”ScalaSDKどこ?”と効いてくる

• IntelliJからテストのクラス指定するときちょっと罠がある

Page 17: 2016 Android × Scala @ScalaMatsuri2016

その他

• IntelliJ Ultimate使ってますがAndroid Studioでもいけました

Page 18: 2016 Android × Scala @ScalaMatsuri2016

以上です

Page 19: 2016 Android × Scala @ScalaMatsuri2016

ご静聴ありがとうございました!

セプテーニではScalaエンジニアを募集していま

す!!!!!!!!!!!!!!!!!!!!!!!!