batchのブログ

知見の備忘録

multi moduleで依存関係を記述するときのimplementationとapiの違い

DroidKaigi2020のconference-appをもとに説明します. f:id:batch08:20200307193621p:plain 点線がimplementationを使った依存関係で実線がappを使った依存関係を表しています.

DroidKaigiのこの依存関係のグラフを見れば分かる通り,基本的にはimplementationを使って依存関係を記述していきます.これは例えば左下の:data:deviceモジュールを見てみると,:modelモジュールと依存関係があります.この場合,:data:deviceモジュールは:modelモジュールのことしか知りません.
他の点線で書かれている依存関係も一緒の意味です.:data:deviceモジュールの右隣りの:data:dbモジュールは:data:apiモジュールと:modelモジュールを知っています.

では次に,実線で書かれている部分を見ていきましょう.:data:repositoryモジュールと:modelモジュールは実線で繋がっている依存関係にあります.これが:data:repositoryモジュールにapi project(':model')とかって書いたときにできる依存関係です.
ここだけみると,implemantationを使って依存関係を書いたときの変わりありません.
変わるのは:data:repositoryモジュールとの依存関係を持つモジュールの挙動です.上のグラフでいうと,:android-baseモジュールの挙動です.
:android-baseモジュールは:data:repositoryモジュールと点線で繋がっている依存関係のためimplementationで繋がっています.なので,もちろん:android-baseモジュールは:data:repositoryモジュールのことを知っています.しかし,その先の:data:repositoryモジュールはapiで繋がっているため,:android-baseモジュールは:modelのことも知ることができます.
apiを使うと依存関係に透過性ができるイメージです.

じゃあここで,もう一つ実線を使った依存関係が:android-baseモジュールと:feature:staffモジュールにあることがわかります.しかし,ここでは:android-baseモジュールは誰からも知られておらず,apiを使った透過性のある依存関係は必要ないように感じます.
なぜ,ここでapiを使った依存関係があるかというと,僕もあまり詳しいことは知らないのですが.feature:staffモジュールがdynamic-feature-moduleという特別なモジュールであるからです.ここではただこいつは特別なモジュールでこいつにはいつものappモジュール的な存在であるandroid-baseモジュールが必要ということだけわかれば良さそうです.

とにかく,apiを使った依存関係は透過性を持つということです.

現場からは以上です.

参考サイト