1. 程式人生 > >Android Support Library的前世今生

Android Support Library的前世今生

原文連結:http://www.jianshu.com/p/f5f9a4fd22e8
這裡寫圖片描述
在之前的開發經歷中經常需要匯入一些如v4、v7、v13等Android官方的支援包,遇到這些情況時都是網上搜索一下,按照前人給的示例新增依賴。這麼稀裡糊塗的使用後代碼正常運行了,但心中不免會有一些疑問,如,Android官方為什麼要提供支援包,都提供哪些支援包,這些支援包又提供了什麼特性,開發者又應該如何選擇使用這些支援包?

為了解開這些疑問,週末在家仔細閱讀了官方的開發者指導文件的相關內容。這篇文章就是讀後整理的讀書筆記。

Android官方為什麼要提供支援包?

為什麼官方向開發者在提供了android sdk之外,還要提供一些零碎的開發支援jar包,全部放在framework中不好嗎?恩,不好!因為這不是好不好的問題,這是Android平臺快速發展帶來的必然產物,這張圖羅列了已經發布的Android版本及其對應的開發sdk的級別。
這裡寫圖片描述


至於為什麼提供支援包官方給出了大致三個原因:

向後相容

如,我們開的App需要支援的minSdkVersion=9,targetSdkVersion=11,在程式裡使用了android 3.0 (API level 11)提供的ActionBar類,使用compileSdkVersion=11成功編譯出apk。在android 3.0的裝置上完美執行,但是app在android 2.3的裝置就會crash,報找不到ActionBar的錯誤。這很好理解,因為舊版本上沒有新版本里新增的類。為了避免使用了最新功能開發的app只能在最新系統的裝置上執行的尷尬,官方把新版系統framework中新增加的介面提出來放到了Android Support Library(支援包)中,開發者在遇到上面的情況時,就可以使用支援包中具有同樣功能的ActionBar類,這個支援包會打包進App裡,這樣使用了新版本系統上功能的App也可以向後相容以前的老系統版本裝置了。
使用支援包中的類除了讓我們免於判斷App執行的系統版本外,還可以使App在各個版本保持同樣的使用者體驗。如在5.0以下系統使用material design。

App編譯時用的android sdk(android.jar)不會打包進我們的App中。因為App編碼是使用android.jar中的介面就是android裝置裡系統框架層(framework)對外提供的介面。

提供不適合打包進framework的功能

Android官方對App開發提供了推薦設計,希望Android應用都有相對一致的互動設計來減少使用者的使用成本,希望三方App類似系統應用從而完美融入到Android生態系統中。但是這都僅僅是推薦,不要求開發者一定要這樣,如果有這種需求就可以使用官方支援包提供的這些功能,避免重複造輪子。如支援包中的DrawerLayout、Snackbar等類都是這種情況。

為了支援不同形態的裝置

通過使用支援包來在不同形態裝置上提供功能,如手機、電視、可穿戴裝置等。

官方提供了哪些支援包,都有哪些特性?

現在Android官方釋出了下面13類支援庫,不同的支援庫包含不同特徵,適用的Android版本也不相同。通常情況下我們都使用到v4和v7這兩個集合庫,因為這兩個庫支援的android系統版本範圍比較廣,官方推薦的UI設計樣式相關類也都在這兩集合庫中。

這裡寫圖片描述

Android Support Library

【※】v4 Support Libraries

v4庫被設計在Android 2.3 (API level 9)及其以上系統中使用。 Support Library的第1版(2011年3月釋出)就只包含v4庫,當時v4庫只是一個庫,支援Android 1.6 (API level 4)及其以上版本,這也是v4名字的由來。隨著系統的迭代現在Android 1.6裝置已經很少了,官方在Support Library的第24.2.0版本(2016年8月釋出)的時候移除了對Android 2.2 (API level 8)及其以下版本的支援,但是名字依然是v4。v4悠久的歷史長期的發展造就了它較大的體積。也是在24.2.0這個版本Goggle將原來的單個v4庫拆分成了5個子庫,我們在使用的時候可以直接依賴某個子庫,從而減少依賴包的大小。下圖可見Android 2.2 Froyo佔有率約為0.1%。

2016年9月5日各版本市場佔有率
這裡寫圖片描述
Gradle編譯指令碼中整個v4庫的依賴語句如下:

compile 'com.android.support:support-v4:24.2.1'

gradle中jar依賴語句格式如 compile ‘jar檔案組(group/名稱空間):jar檔名(name):jar檔案版本(version)’。所以上面的語句意思是依賴Android支援庫中第24.2.1版的support-v4庫。由於在24.2.0版本support-v4庫已經被拆分成5個子庫,所以如下圖所示依賴24.2.1版本的support-v4庫除了匯入support-v4庫外還會匯入它的5個子庫,這個版本的support-v4庫本身是一個空的包,所有具體的實現都在它依賴的子庫中。下面依次看下v4庫拆分出來的5個子庫。
這裡寫圖片描述

v4 compat library

為一些框架的API提供相容性包裝。如,Context.obtainDrawable()、View.performAccessibilityAction()等。

Gradle編譯指令碼中v4 compat庫的依賴語句:

compile 'com.android.support:support-compat:24.2.1'

v4 core-utils library

提供了一些工具類。如,AsyncTaskLoader、PermissionChecker等。
Gradle編譯指令碼中v4 core-utils庫的依賴語句:

compile 'com.android.support:support-core-utils:24.2.1'

v4 core-ui library

提供很多UI相關元件。如,ViewPager、NestedScrollView、ExploreByTouchHelper等。

Gradle編譯指令碼中v4 core-ui庫的依賴語句:

compile 'com.android.support:support-core-ui:24.2.1'

v4 media-compat library

多媒體框架相關部分。如,MediaBrowser、MediaSession等。

Gradle編譯指令碼中v4 media-compat庫的依賴語句:
compile ‘com.android.support:support-media-compat:24.2.1’

v4 fragment library

跟fragment相關部分。v4這個子庫依賴了其他4個子庫,所以我們一旦依賴這個庫就會自動匯入其他4個子庫,這跟直接依賴整個support-v4效果類似。關於v4拆分這篇文章有介紹,有興趣的可以點過去看看。

Gradle編譯指令碼中v4 fragment 庫的依賴語句如下:

compile 'com.android.support:support-fragment:24.2.1'

【※】v7 Support Libraries

注意這裡的Library用的也是複數,說明v7庫和v4一樣也是很多庫的集合,不同的是v7各個庫不是後來拆分出來的,而是最初發布時就是以各個獨立的庫的形式釋出的,如釋出的最早的v7庫v7 gridlayout library。這些庫的共同之處是釋出之初都是支援Android 2.1 (API level 7)及其以上版本,所以把他們統稱為v7支援庫。需要注意的24.2.0版本以後的v7支援庫支援範圍也是Android 2.3 (API level 9)及其以上版本了,這是因為v7依賴的v4庫支援版本範圍改變了,這點在v4支援庫小節有介紹。v7庫集合裡有7個子庫,使用時根據需要選擇匯入哪些庫。

v7 appcompat library

支援UI設計樣式、 material design相關,如ActionBar、AppCompatActivity、Theme等。

Gradle編譯指令碼中v7 appcompat庫的依賴語句:

compile 'com.android.support:appcompat-v7:24.2.1'

v7 cardview library

支援cardview控制元件,使用material design語言設計,卡片式的資訊展示,在電視App中有廣泛的使用。

Gradle編譯指令碼中v7 cardview庫的依賴語句:

compile 'com.android.support:cardview-v7:24.2.1'

v7 gridlayout library

支援gridlayout佈局。

Gradle編譯指令碼中v7 gridlayout庫的依賴語句:

compile 'com.android.support:gridlayout-v7:24.2.1'

v7 mediarouter library

該庫提供了 MediaRouter、MediaRouteProvider等與Google Cast相關的類。

Gradle編譯指令碼中v7 mediarouter庫的依賴語句:

compile 'com.android.support:mediarouter-v7:24.2.1'

v7 palette library

該庫提供了palette類,使用這個類可以很方便提取出圖片中主題色。比如在音樂App中,從音樂專輯封面圖片中提取出專輯封面圖片的主題色,然後將播放介面的背景色設定為封面的主題色,隨著播放音樂的改變,播放介面的背景色也會巧妙的跟著改變,從而提供更好的使用者體驗。

Gradle編譯指令碼中v7 palette庫的依賴語句:

compile 'com.android.support:palette-v7:24.2.1'

v7 recyclerview library

該庫提供了recyclerview類。這個庫使用的頻率很高,網上有很多文章介紹recyclerview。

Gradle編譯指令碼中v7 recyclerview庫的依賴語句:

compile 'com.android.support:recyclerview-v7:24.2.1'

v7 Preference Support library

這個庫在設定介面常用到。提供了 CheckBoxPreference、ListPreference等類。

Gradle編譯指令碼中v7 preference support庫的依賴語句:

compile ‘com.android.support:preference-v7:24.2.1’

v8 Support Library

v8支援庫支援範圍也是Android 2.3 (API level 9)及其以上版本。v8支援庫集合中現在只有一個庫。

v8 renderscript library

這個庫支援渲染指令碼計算框架。對這個庫有興趣可以看渲染指令碼開發指導。

使用v8 renderscript庫Gradle編譯指令碼的配置方法:

defaultConfig {    
      renderscriptTargetApi 18    
      renderscriptSupportModeEnabled true
}

【※】v13 Support Library

v13支援庫適用範圍是Android 3.2 (API level 13)及其以上版本。這個庫跟v4 fragment library功能基本一樣,也是提供相容fragment相關內容。區別是v4 fragment library需要依賴v4支援庫集合裡的其它4個子庫,而v13 support library依賴的是Android 3.2 (API level 13)及其以上版本framework。也就是說v4支援庫除了v4 fragment library以外,其它功能都在Android 3.2 (API level 13)及其以上版本的framework中提供了。所以我們的App如果只需要相容到Android 3.2,那麼fragment部分使用v13 Support Library中的相關類才是明智之舉。
Gradle編譯指令碼中v13 support庫的依賴語句:

  compile 'com.android.support:support-v13:24.2.1'

v14 Preference Support Library

功能類似v7 Preference Support library,支援Android系統版本不一致,新增部分相關介面。

Gradle編譯指令碼中v 庫的依賴語句:

  compile 'com.android.support:preference-v14:24.2.1'

v17 Preference Support Library for TV

功能類似v7 Preference Support library,支援Android系統版本不一致,新增部分相關介面,為電視裝置App提供相應的UI。

Gradle編譯指令碼中v 庫的依賴語句:

  compile 'com.android.support:preference-leanback-v17:24.2.1'

v17 Leanback Library

這也是在電視裝置上使用的庫,主要是和YouTube相關的。

Gradle編譯指令碼中v17 Leanback庫的依賴語句:

  compile 'com.android.support:leanback-v17:24.2.1'

Annotations Support Library

提供註解相關功能。

Gradle編譯指令碼中Annotations Support庫的依賴語句:

  compile 'com.android.support:support-annotations:24.2.1'

【※】Design Support Library

這個庫現在使用的也比較多,它提供了material design設計風格的控制元件。如,navigation drawers、floating action buttons (FAB)、snackbars、tabs等。

Gradle編譯指令碼中Design Support庫的依賴語句:

  compile 'com.android.support:design:24.2.1'

【※】Multidex Support Library

Android的單個.dex檔案最多能引用65536個方法,在這之後的方法就無法引用了。當我們的方法數超過這個限制後就需要分成多個dex檔案,該庫就是用來支援多個dex檔案構建應用程式的。

Gradle編譯指令碼中Multidex Support庫的依賴語句:

compile 'com.android.support:multidex:1.0.0'

【※】Custom Tabs Support Library

這個庫有很有意思,提供了一種新的開啟網頁的方式。以前的App要開啟一個網頁有兩種選擇,一個是用webview,這種方式工作量較大,第二種方式是呼叫瀏覽器應用來開啟網頁,這種方式要在兩個應用中切換,使用者的操作體驗是割裂的,都不夠理想。這個庫提供了第三種選擇,具體情況可以點選這篇文章瞭解。

Gradle編譯指令碼中Custom Tabs Support庫的依賴語句:

  compile 'com.android.support:customtabs:24.2.1'

Percent Support Library

百分比支援庫提供瞭如PercentFrameLayout、PercentRelativeLayout佈局,在這些佈局中子view可以使用百分比來設定大小、位置等。

Gradle編譯指令碼中Percent Support庫的依賴語句:

  compile 'com.android.support:percent:24.2.1'

App Recommendation Support Library for TV

這個庫是電視裝置上用來提供視訊內容推薦的。

Gradle編譯指令碼中Recommendation Support庫的依賴語句:

  compile 'com.android.support:recommendation:24.2.1'

如何選擇使用支援包?

其實在瞭解了支援包特性之後,這個問題也就迎刃而解了,這裡再做下總結。在使用Android Support Library之前我們需要通過sdk manager安裝Android Support Repository,然後再在gradle編譯指令碼中新增如下依賴語句就可以了。

compile 'com.android.support:support-v4:24.2.1'  //以v4為例

前面文章說過gradle中jar依賴語句格式如 compile jar檔案組(group/名稱空間):jar檔名(name):jar檔案版本(version)。對於Android Support Library庫的依賴語句jar檔名和jar檔案版本兩部分需要選擇確定。

jar檔名:在選擇之前要明確兩件事,需要使用支援包的哪種特性、需要相容的最低Android版本,然後就可以確定具體依賴哪個支援庫。
jar檔案版本:支援庫的版本需要跟compileSdkVersion保持一致。

注意:由於依賴的支援庫會打包進apk,所以官方推薦開發者在編譯時使用ProGuard工具預處理release版本的apk。ProGuard工具除了混淆原始碼外,還會移除那些依賴的支援庫中沒有使用到的類,達到apk瘦身的效果。

結束

以上就是關於Android Support Library全部了,謝謝。如果文章有錯誤或者有疑問請務必留言告訴我。