原文地址 : medium.com/pulselive/a…android
隨着 Android Studio 4.0 穩定版的發佈,有人對於 Feature-on-Feature Dependencies 的做用提出了疑問,表示不理解,經過本篇將介紹它在 Android Studio 4.0 新版本中的做用。bash
這個功能其實和
com.android.dynamic-feature
有關,將某些庫模塊遷移到 DFM (Dynamic Feature Modules) 要求在項目結構中進行更改,可使基礎 com.android.application 特性與任何 dynamic features 之間的依賴關係反轉,更多可見底部拓展閱讀。app
在 Android Gradle Plugin 4.0.0 中,動態功能如今能夠依賴於其餘動態功能,當你的應用程序下載動態功能時,它還會下載它依賴的全部動態功能。ide
更多官方解釋可見 feature-on-feature。post
通常 Feature-on-Feature Dependencies 中 Gradle 依賴關係圖能夠以下所示:gradle
最初,你可能會認爲這僅適用於動態功能的某些特定用途,但這實際上有助於解決 Android Gradle Plugin 3.5 當前動態功能項目面臨的一個很是現實的問題。ui
假設你有一個具備 3 個動態功能的項目,:video-list
、:video-player
和 :news
。其中 :video-list
和 :video-player
依賴於一個共同的庫 :video-data
,以下圖所示多是你會使用的 Gradle 依賴項:this
具備3個動態功能的示例項目,其中2個依賴於相同的庫模塊。google
若是此時嘗試構建此庫,可能會收到一條錯誤消息,指出 2 個動態功能都打包了相同的庫:spa
[:video-list, :video-player] all package the same library [:video-data].
Multiple APKs packaging the same library can cause runtime errors.
Adding the above library as a dependency of the base module will resolve this
issue by packaging the library with the base APK instead.
複製代碼
在Android Gradle Plugin 3.5 中,常見的依賴關係必須由 base 提供,所以你的 Gradle 依賴項將以下所示:
:video-data
必須由 :base
提供,由於 2 個或更多動態功能依賴於它, 這就產生了一個有趣的反作用,:news
如今隱含依賴 :video-data
。
若是要製做 :news
的 Instant apps
, 這將成爲一個巨大的問題,由於 Instant apps
的下載大小限制爲 4MB,若是此時依賴庫實際上並不須要,那麼將下載大小降至 4MB 如下將很是困難。
例如
:video-data
可能依賴於 Google Play 服務提供的 Cast 庫,若是此時的項目還沒有使用 Google Play 服務,則會變成一個很大浪費的依賴關係。
在 Android Gradle Plugin 4.0 中的 Feature-on-Feature 依賴關係解決了此問題,此時有兩種不一樣的選擇,能夠像這樣進行 :video-list
依賴 :video-player
:
反之亦然,即 :video-player
取決於 :video-list
, 如今就再也不擁有 2 個徹底依賴於的動態功能 :video-data
,而且 「AGP is happy」 。
你還可使 :video-data
本身成爲動態功能,並具備 :video-list
和 :video-player
依賴 :video-data
。
這些解決方案中的任何一個,都將避免 3.5 裏常見的依賴項構建錯誤,並確保它們 :news
不依賴 :video-data
,所以 :news
能夠做爲 4MB 即時應用發佈。
補充:對於 DFM (Dynamic Feature Modules),基本對象
com.android.application
是com.android.dynamic-feature
模塊的依賴項,這意味着您可使用 DFM 中基本模塊及其庫中定義的任何類,可是在編譯時不能從 base application 中引用 DFM 中定義的任何代碼。