原文地址 : medium.com/pulselive/a…
隨著 Android Studio 4.0 穩定版的釋出,有人對於 Feature-on-Feature Dependencies 的作用提出了疑問,表示不理解,通過本篇將介紹它在 Android Studio 4.0 新版本中的作用。
這個功能其實和
com.android.dynamic-feature
有關,將某些庫模組遷移到 DFM (Dynamic Feature Modules) 要求在專案結構中進行更改,可以使基礎 com.android.application 特性與任何 dynamic features 之間的依賴關係反轉,更多可見底部擴充閱讀。
在 Android Gradle Plugin 4.0.0 中,動態功能現在可以依賴於其他動態功能,當你的應用程式下載動態功能時,它還會下載它依賴的所有動態功能。
更多官方解釋可見 feature-on-feature。
一般 Feature-on-Feature Dependencies 中 Gradle 依賴關係圖可以如下所示:
最初,你可能會認為這僅適用於動態功能的某些特定用途,但這實際上有助於解決 Android Gradle Plugin 3.5 當前動態功能專案面臨的一個非常現實的問題。
假設你有一個具有 3 個動態功能的專案,:video-list
、:video-player
和 :news
。其中 :video-list
和 :video-player
依賴於一個共同的庫 :video-data
,如下圖所示可能是你會使用的 Gradle 依賴項:
具有3個動態功能的示例專案,其中2個依賴於相同的庫模組。
如果此時嘗試構建此庫,可能會收到一條錯誤訊息,指出 2 個動態功能都打包了相同的庫:
[: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 中定義的任何程式碼。