2016 Android × Scala @ScalaMatsuri2016
-
Upload
yasuyuki-sugitani -
Category
Technology
-
view
1.264 -
download
3
Transcript of 2016 Android × Scala @ScalaMatsuri2016
![Page 1: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/1.jpg)
AndroidでScalaSepteni Original 杉谷
![Page 2: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/2.jpg)
前説
• GANMA! という漫画配信サービスのAndroid版はScalaで出来ています(1/18リリース版から)
• 作成途中に得られた知見を思いつく限りご紹介します
![Page 3: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/3.jpg)
使い物になる?
• なってる
• 道中の難所は多い
• 乗り越えた先は比較的平穏
![Page 4: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/4.jpg)
ビルドシステム• ビルドシステムが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](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/5.jpg)
良い:Scalaが使える
• サーバ側もScalaなので、いつものようにさくさく書けるうれしさ
![Page 6: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/6.jpg)
良い: Futureが美味• Future/Promiseが標準で使えるので、コールバック地獄を抑えられる
• onResume →ネットワーク通信 → 各種処理 → ローディングくるくる表示終わり、 とかがすっきり書ける
• UI処理はメインスレッド縛り、がやや難点
• OEさんのUIExecutionContext
• 自作のThreadUtil.runOnUiThread
![Page 7: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/7.jpg)
良い:lazyが美味
• View要素へのアクセスがすっきり書ける
lazy private val spaceTop = view.findViewById(R.id.author_top_space)
![Page 8: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/8.jpg)
パフォーマンス• 全然問題ない(クレーム無し)
• ぬるぬるさくさく動く
• メモリ消費は荒いので、アプリによっては注意が必要?
![Page 9: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/9.jpg)
つらい: ぬるぽ
• Android側からNullよくやってくる
• Infra層とView層で徹底防御
• 怪しそうなのはOptionでよく包む
![Page 10: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/10.jpg)
つらい:Androidエンジニア問題
• 居ない。
• 自社で育成するしかない。
• チームのエンジニア全員が学習(Scalaエンジニアx6, Obj-c,Swiftエンジニアx1)
![Page 11: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/11.jpg)
つらい: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](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/12.jpg)
つらい: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](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/13.jpg)
つらい:テスト• AndroidのテストはJUnit3(標準),JUnit4(Espresso)しか使えない様子
• assertThatで頑張る
• UI交えたテストがものすごく転ける
• IdlingResource(assert判定の条件が整うまで待つ)をとてもしっかり作り込まないといけない
• 関わるUI処理にFuture[Unit]を返させるようにして、厳密判定できるようにする
• (余談)iOSのQuick/Nimbleだと「条件が整うまで、何度もチェックする」と書けるので楽
![Page 14: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/14.jpg)
つらい:ライブラリ
• javax依存があるライブラリは使えない
• json4sを含む殆どのJSONライブラリがビルド不能
• json-lensesがなんとか動いた、 https://github.com/jrudolph/json-lenses
![Page 15: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/15.jpg)
つらい:ビルド• ビルド遅い
• Scalaが遅いというより全部が遅い
• 差分コンパイルが効いて殆どScalaに時間がかからなくても遅い
• AndroidStudio次期版に、実行中のクラス差し替え可能可、による爆速化があるがScalaでは使えなかった
![Page 16: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/16.jpg)
その他微妙につらい
• IntelliJが起動する度に”ScalaSDKどこ?”と効いてくる
• IntelliJからテストのクラス指定するときちょっと罠がある
![Page 17: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/17.jpg)
その他
• IntelliJ Ultimate使ってますがAndroid Studioでもいけました
![Page 18: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/18.jpg)
以上です
![Page 19: 2016 Android × Scala @ScalaMatsuri2016](https://reader034.fdocuments.net/reader034/viewer/2022050614/5889fb9f1a28ab0f388b5847/html5/thumbnails/19.jpg)
ご静聴ありがとうございました!
セプテーニではScalaエンジニアを募集していま
す!!!!!!!!!!!!!!!!!!!!!!!!