Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2016 Android × Scala @ScalaMatsuri2016

1,391 views

Published on

GANMA!というアプリのAndroid版をScalaで作り直したときの知見です

Published in: Technology
  • Be the first to comment

  • Be the first to like this

2016 Android × Scala @ScalaMatsuri2016

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

×