Support V4 包大拆分
阿新 • • 發佈:2019-01-10
v4 包從 2011 年開始引入,包含 ViewPager、FragmentActivity 等我們常用的功能。
從24.2.0 之後,為了提高效率,此庫拆分成多個模組。出於向後相容的考慮,如果您在 Gradle 指令碼中依賴了 support-v4,您的 APK 將包含所有的 v4 模組。不過,要減少 APK 大小,我們建議僅依賴需要的特定模組。目前v4包拆分為 5 個子的 Module,每個 Module 可以被單獨引用。
(1) support-compat
相容一些 Framework API。如 Context.getDrawable() 和 View.performAccessibilityAction()。
Gradle依賴如下所示:
com.android.support:support-compat:24.2.0
(2) support-core-utils
提供一系列核心的工具,如 AsyncTaskLoader 和 PermissionChecker。
Gradle依賴如下所示:
com.android.support:support-core-utils:24.2.0
(3) support-core-ui
提供一系列核心的 UI,如 ViewPager、 NestedScrollView。
Gradle依賴如下所示:
com.android.support:support-core-ui:24.2.0
(4) support-media-compat
android.media 相容庫,包括 MediaBrowser 和 MediaSession。
Gradle依賴如下所示:
com.android.support:support-media-compat:24.2.0
(5) support-fragment
fragment 的相容庫
Gradle依賴如下所示:
com.android.support:support-fragment:24.2.0
PS:其中 support-annotations 為一些註解的宣告庫,如我們比較常用的 RequiresApi、UiThread、NonNull。
從中可以看出 support-fragment 依賴於所有其他子 Module,而 support-v4 包含所有 Module,所以現在引入
compile 'com.android.support:support-fragment:24.2.0'
與
compile 'com.android.support:support-v4:24.2.0'
的效果是一樣的。
support-v4 拆分的好處第一眼看來便是能減少應用大小,因為你不需要引用完整的 support-v4 包,只需要引用子的 Module 即可。
比如我只用了 AsyncTaskLoader,只需要引用 support-core-utils 即可,只有 90k 哎,比原來的 1.3M 降了一個數量級多,應用減少了 1M 多哎,然而真的這樣嗎?
(1) support-compat 過大
大家知道 AAR 的大小是不包含它的依賴大小的,所以 support-core-utils 90k大小僅表示自己的程式碼和資源總大小。
從上面的依賴關係可以看出它們都依賴 support-compat,而 support-compat 有 602k,它依賴的 support-annotations 還有 21k,這樣引用 support-core-utils 實際增大大小約為 700k+。這樣比 1.3M 還是少了一半,也是不錯,然而還沒有結束。
(2) support-v4 觸角太深
v4 包從 2011 年開始出來,由於 ViewPager、FragmentActivity 等類,v4 被大量其他包引用,早已子孫遍全球,比如 v7 相容包 appcompat-v7 就依賴 v4。
我們可以嘗試通過 exclude module 可以把 v7 中 v4 去掉,然並卵,v7 依賴 FragmentActivity 這個類,而 FragmentActivity 位於 v4 的 support-fragment 中,所以依賴變成這樣:
初步看來 data-binding 也依賴與 support-v4。
1 這個拆分本身對於 V4 包專案來說是好事
各模組劃清各自功能邊界,充分解耦。
2 減小apk體積
靈活選擇自己需要的module
從24.2.0 之後,為了提高效率,此庫拆分成多個模組。出於向後相容的考慮,如果您在 Gradle 指令碼中依賴了 support-v4,您的 APK 將包含所有的 v4 模組。不過,要減少 APK 大小,我們建議僅依賴需要的特定模組。目前v4包拆分為 5 個子的 Module,每個 Module 可以被單獨引用。
1、子Module介紹
其中(1) support-compat
相容一些 Framework API。如 Context.getDrawable() 和 View.performAccessibilityAction()。
Gradle依賴如下所示:
com.android.support:support-compat:24.2.0
(2) support-core-utils
提供一系列核心的工具,如 AsyncTaskLoader 和 PermissionChecker。
Gradle依賴如下所示:
com.android.support:support-core-utils:24.2.0
(3) support-core-ui
提供一系列核心的 UI,如 ViewPager、 NestedScrollView。
Gradle依賴如下所示:
com.android.support:support-core-ui:24.2.0
(4) support-media-compat
android.media 相容庫,包括 MediaBrowser 和 MediaSession。
Gradle依賴如下所示:
com.android.support:support-media-compat:24.2.0
(5) support-fragment
fragment 的相容庫
Gradle依賴如下所示:
com.android.support:support-fragment:24.2.0
2、子 Module 間依賴關係
PS:其中 support-annotations 為一些註解的宣告庫,如我們比較常用的 RequiresApi、UiThread、NonNull。
從中可以看出 support-fragment 依賴於所有其他子 Module,而 support-v4 包含所有 Module,所以現在引入
compile 'com.android.support:support-fragment:24.2.0'
與
compile 'com.android.support:support-v4:24.2.0'
的效果是一樣的。
3. 問題
比如我只用了 AsyncTaskLoader,只需要引用 support-core-utils 即可,只有 90k 哎,比原來的 1.3M 降了一個數量級多,應用減少了 1M 多哎,然而真的這樣嗎?
(1) support-compat 過大
大家知道 AAR 的大小是不包含它的依賴大小的,所以 support-core-utils 90k大小僅表示自己的程式碼和資源總大小。
從上面的依賴關係可以看出它們都依賴 support-compat,而 support-compat 有 602k,它依賴的 support-annotations 還有 21k,這樣引用 support-core-utils 實際增大大小約為 700k+。這樣比 1.3M 還是少了一半,也是不錯,然而還沒有結束。
(2) support-v4 觸角太深
v4 包從 2011 年開始出來,由於 ViewPager、FragmentActivity 等類,v4 被大量其他包引用,早已子孫遍全球,比如 v7 相容包 appcompat-v7 就依賴 v4。
我們可以嘗試通過 exclude module 可以把 v7 中 v4 去掉,然並卵,v7 依賴 FragmentActivity 這個類,而 FragmentActivity 位於 v4 的 support-fragment 中,所以依賴變成這樣:
compile ('com.android.support:appcompat-v7:24.2.0') {
exclude module: 'support-v4'
}
compile 'com.android.support:support-fragment:24.2.0'
上面介紹過現在 com.android.support:support-fragment 與 com.android.support:support-v4 已經幾乎無異,所以對於依賴 v7 的 App 來說這次的 v4 拆分不能帶來任何依賴包體積的精簡。初步看來 data-binding 也依賴與 support-v4。
4. 好處
這樣看來 v4 包的拆分是否是 Google 的自娛自樂,對於開發者全無好處呢?我看並不是。1 這個拆分本身對於 V4 包專案來說是好事
各模組劃清各自功能邊界,充分解耦。
2 減小apk體積
靈活選擇自己需要的module