Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

みなさん、 multi module やってます︖

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

タクベルの場合

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

タクベル乗務員アプリ

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

実際に module追加 してみて

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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の空定義だけして公開する感じ︖

Slide 18

Slide 18 text

補⾜︓公開する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外からは⾒えない )

Slide 19

Slide 19 text

implementation の必要性を実感した 今まではなんとなく implementation にしてた

Slide 20

Slide 20 text

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']) }

Slide 21

Slide 21 text

いくつかハマったこと

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

release版でクラッシュ ナビSDKにはネイティブライブラリが含まれていた proguardでネイティブから参照しているJavaメソッドが削除 ナビmoduleのproguardルールにkeep設定を⾜しても解決せず アプリ側のproguardルールにkeep設定を⾜して解決

Slide 26

Slide 26 text

気付いたこと

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

次は multi module やっていくぞ︕

Slide 29

Slide 29 text

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