【譯】Android Gradle 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

戀貓de小郭發表於2020-05-29

原文地址 : 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 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

最初,你可能會認為這僅適用於動態功能的某些特定用途,但這實際上有助於解決 Android Gradle Plugin 3.5 當前動態功能專案面臨的一個非常現實的問題。

假設你有一個具有 3 個動態功能的專案,:video-list:video-player:news。其中 :video-list:video-player 依賴於一個共同的庫 :video-data,如下圖所示可能是你會使用的 Gradle 依賴項:

具有3個動態功能的示例專案,其中2個依賴於相同的庫模組。

【譯】Android Gradle 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

如果此時嘗試構建此庫,可能會收到一條錯誤訊息,指出 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 依賴項將如下所示:

【譯】Android Gradle 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

:video-data 必須由 :base 提供,因為 2 個或更多動態功能依賴於它, 這就產生了一個有趣的副作用,:news 現在隱含依賴 :video-data

如果要製作 :newsInstant apps, 這將成為一個巨大的問題,因為 Instant apps 的下載大小限制為 4MB,如果此時依賴庫實際上並不需要,那麼將下載大小降至 4MB 以下將非常困難。

例如 :video-data 可能依賴於 Google Play 服務提供的 Cast 庫,如果此時的專案尚未使用 Google Play 服務,則會變成一個很大浪費的依賴關係。

在 Android Gradle Plugin 4.0 中的 Feature-on-Feature 依賴關係解決了此問題,此時有兩種不同的選擇,可以像這樣進行 :video-list 依賴 :video-player

【譯】Android Gradle 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

反之亦然,即 :video-player 取決於 :video-list , 現在就不再擁有 2 個完全依賴於的動態功能 :video-data,並且 “AGP is happy” 。

你還可以使 :video-data 自己成為動態功能,並具有 :video-list:video-player 依賴 :video-data

【譯】Android Gradle 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

這些解決方案中的任何一個,都將避免 3.5 裡常見的依賴項構建錯誤,並確保它們 :news 不依賴 :video-data,因此 :news 可以作為 4MB 即時應用釋出。

補充:對於 DFM (Dynamic Feature Modules),基本物件 com.android.applicationcom.android.dynamic-feature 模組的依賴項,這意味著您可以使用 DFM 中基本模組及其庫中定義的任何類,但是在編譯時不能從 base application 中引用 DFM 中定義的任何程式碼。

Further Reading

【譯】Android Gradle 外掛 4.0.0 中 Feature-on-Feature 的依賴關係

相關文章