multi module へ向けて

F46a37b9f855c245f72a07b04045216a?s=47 Tomoya Miwa
September 28, 2018

multi module へ向けて

F46a37b9f855c245f72a07b04045216a?s=128

Tomoya Miwa

September 28, 2018
Tweet

Transcript

  1. multi module へ向けて tomoya0x00 shibuya.apk #28

  2. About me tomoya0x00 Twitter, GitHub, Qiita Android, Embedded system, BLE/BT,

    iOS DeNA Co., Ltd. Automotive Business Unit. 最近、 deploy.fm (podcast) に出演させていただきました https://takattata.github.io/deployfm/episode/01-main
  3. みなさん、 multi module やってます︖

  4. multi module への第⼀歩︖ module追加 のお話し

  5. タクベルの場合

  6. タクベルとは︖ タクシーの配⾞サービスです︕

  7. タクベルの最適ルート提案

  8. AWS Summit 2018「DeNAオートモーティブにおけるAWS活⽤事例」

  9. タクベル乗務員アプリ

  10. 提案した最適ルートを⾛⾏頂くため、 ナビ機能追加が必要︕

  11. ナビ機能の追加 サードパーティーのナビSDKを利⽤ SDKはAARで提供されている 地図表⽰のCustom Viewを含む ⾮同期処理の戻りはコールバック ナビSDK⾃体を変更する可能性を考慮しておく

  12. 基本⽅針 ナビ機能は⼀つのmodule(以降、ナビmodule)とする ナビSDKはナビmoduleで隠蔽する ナビmodule外から、ナビSDKに直接アクセスさせない うまくいけば、ナビSDK変更時に変更範囲がナビmoduleに閉じる コールバックは⾊々ツラいので⾮同期処理はRx化する coroutineと迷ったけど、案内状態などstreamがあったのでRxJava を採⽤

  13. module の作成⽅法とか基本的なところ

  14. module の作成⽅法とか基本的なところ 釘宮さんのスライドと本をぜひご参照下さい︕ マルチモジュールのすヽめ https://speakerdeck.com/kgmyshin/multi-module-no-susume ⼤きめのAndroidアプリでの設計を考えてみる~pocket~ https://booth.pm/ja/items/837226 とっても助かりました、ありがとうございます

  15. 実際に module追加 してみて

  16. internal を初めて使った 使われたことある⽅、いらっしゃいますか︖

  17. internal アクセス修飾⼦ internal — any client inside this module who

    sees the declaring class sees its internal members; https://kotlinlang.org/docs/reference/visibility-modi ers.html 極⼒、ナビmoduleのclassをinternalにして公開するものを絞る 公開するdata classの⼀部プロパティで⾒せたくないものを隠す C⾔語でヘッダにstructの空定義だけして公開する感じ︖
  18. 補⾜︓公開するdata classの⼀部プロパ ティで⾒せたくないものを隠す data class CarLocation( val longitude: Double, val

    latitude: Double, val direction: Double, val speed: Double? = null, internal val hoge: Int, // ナビmodule外からは⾒えない internal val fuga: Int // ナビmodule外からは⾒えない )
  19. implementation の必要性を実感した 今まではなんとなく implementation にしてた

  20. implementation or api 例︓ナビmoduleのbuild.gradle dependencies { // libsディレクトリにあるナビSDK(aar)に依存 // ★ナビmodule外から直接ナビSDKにアクセスできてしまう★

    api fileTree(dir: 'libs', include: ['*.aar']) } dependencies { // libsディレクトリにあるナビSDK(aar)に依存 // ナビmodule外からは⾒えない implementation fileTree(dir: 'libs', include: ['*.aar']) }
  21. いくつかハマったこと

  22. Data Bindingと相性が悪い ナビmoduleで、ナビSDKの地図Viewを包んだCustom Viewを提供 アプリビルド時に地図Viewが⾒つからない、というビルドエラー 詳細は釘宮さんのスライドをご参照 Data Binding Compiler V2にすればOK︕

    // gradle.properties android.databinding.enableV2=true
  23. 公開クラスにナビSDKのinterfaceを実 装してビルドエラー // ナビmodule class NaviEngine: NaviSdkListener { ... }

    // アプリ class Hoge { val naviEngine = NaviEngine() // NaviSdkListener not found! }
  24. 公開クラスにナビSDKのinterfaceを実 装してビルドエラー // ナビmodule class NaviEngine { val listener =

    object: NaviSdkListener { ... } } // アプリ class Hoge { val naviEngine = NaviEngine() // OK! }
  25. release版でクラッシュ ナビSDKにはネイティブライブラリが含まれていた proguardでネイティブから参照しているJavaメソッドが削除 ナビmoduleのproguardルールにkeep設定を⾜しても解決せず アプリ側のproguardルールにkeep設定を⾜して解決

  26. 気付いたこと

  27. アプリのビルド時間 ナビmoduleを変更する時としない時で倍ぐらい変わる ナビmoduleを変更しない時の⽅が、断然早い multi module にすると、かなりビルド早くなりそうな予感・・・︖

  28. 次は multi module やっていくぞ︕

  29. ありがとうございました︕