multi moduleで依存関係を記述するときのimplementationとapiの違い
DroidKaigi2020のconference-appをもとに説明します. 点線が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
を使った依存関係は透過性を持つということです.
現場からは以上です.