
在之前的開發(fā)經(jīng)歷中經(jīng)常需要導(dǎo)入一些如v4、v7、v13等Android官方的支持包,遇到這些情況時(shí)都是網(wǎng)上搜索一下,按照前人給的示例添加依賴。這么稀里糊涂的使用后代碼正常運(yùn)行了,但心中不免會(huì)有一些疑問,如,Android官方為什么要提供支持包,都提供哪些支持包,這些支持包又提供了什么特性,開發(fā)者又應(yīng)該如何選擇使用這些支持包?
(本文出處 @都有米:http://www.itdecent.cn/p/f5f9a4fd22e8)
為了解開這些疑問,周末在家仔細(xì)閱讀了官方的開發(fā)者指導(dǎo)文檔的相關(guān)內(nèi)容。這篇文章就是讀后整理的讀書筆記。最新的Android Support Library版本。
Android官方為什么要提供支持包?
為什么官方向開發(fā)者在提供了android sdk之外,還要提供一些零碎的開發(fā)支持jar包,全部放在framework中不好嗎?恩,不好!因?yàn)檫@不是好不好的問題,這是Android平臺(tái)快速發(fā)展帶來的必然產(chǎn)物,這張圖羅列了已經(jīng)發(fā)布的Android版本及其對(duì)應(yīng)的開發(fā)sdk的級(jí)別。

至于為什么提供支持包官方給出了大致三個(gè)原因:
- 向后兼容
如,我們開的App需要支持的minSdkVersion=9,targetSdkVersion=11,在程序里使用了android 3.0 (API level 11)提供的ActionBar類,使用compileSdkVersion=11成功編譯出apk。在android 3.0的設(shè)備上完美運(yùn)行,但是app在android 2.3的設(shè)備就會(huì)crash,報(bào)找不到ActionBar的錯(cuò)誤。這很好理解,因?yàn)榕f版本上沒有新版本里新增的類。為了避免使用了最新功能開發(fā)的app只能在最新系統(tǒng)的設(shè)備上運(yùn)行的尷尬,官方把新版系統(tǒng)framework中新增加的接口提出來放到了Android Support Library(支持包)中,開發(fā)者在遇到上面的情況時(shí),就可以使用支持包中具有同樣功能的ActionBar類,這個(gè)支持包會(huì)打包進(jìn)App里,這樣使用了新版本系統(tǒng)上功能的App也可以向后兼容以前的老系統(tǒng)版本設(shè)備了。
使用支持包中的類除了讓我們免于判斷App運(yùn)行的系統(tǒng)版本外,還可以使App在各個(gè)版本保持同樣的用戶體驗(yàn)。如在5.0以下系統(tǒng)使用material design。
App編譯時(shí)用的android sdk(android.jar)不會(huì)打包進(jìn)我們的App中。因?yàn)锳pp編碼是使用android.jar中的接口就是android設(shè)備里系統(tǒng)框架層(framework)對(duì)外提供的接口。
提供不適合打包進(jìn)framework的功能
Android官方對(duì)App開發(fā)提供了推薦設(shè)計(jì),希望Android應(yīng)用都有相對(duì)一致的交互設(shè)計(jì)來減少用戶的使用成本,希望三方App類似系統(tǒng)應(yīng)用從而完美融入到Android生態(tài)系統(tǒng)中。但是這都僅僅是推薦,不要求開發(fā)者一定要這樣,如果有這種需求就可以使用官方支持包提供的這些功能,避免重復(fù)造輪子。如支持包中的DrawerLayout、Snackbar等類都是這種情況。為了支持不同形態(tài)的設(shè)備
通過使用支持包來在不同形態(tài)設(shè)備上提供功能,如手機(jī)、電視、可穿戴設(shè)備等。
官方提供了哪些支持包,都有哪些特性?
現(xiàn)在Android官方發(fā)布了下面13類支持庫,不同的支持庫包含不同特征,適用的Android版本也不相同。通常情況下我們都使用到v4和v7這兩個(gè)集合庫,因?yàn)檫@兩個(gè)庫支持的android系統(tǒng)版本范圍比較廣,官方推薦的UI設(shè)計(jì)樣式相關(guān)類也都在這兩集合庫中。

【※】v4 Support Libraries
v4庫被設(shè)計(jì)在Android 2.3 (API level 9)及其以上系統(tǒng)中使用。 Support Library的第1版(2011年3月發(fā)布)就只包含v4庫,當(dāng)時(shí)v4庫只是一個(gè)庫,支持Android 1.6 (API level 4)及其以上版本,這也是v4名字的由來。隨著系統(tǒng)的迭代現(xiàn)在Android 1.6設(shè)備已經(jīng)很少了,官方在Support Library的第24.2.0版本(2016年8月發(fā)布)的時(shí)候移除了對(duì)Android 2.2 (API level 8)及其以下版本的支持,但是名字依然是v4。v4悠久的歷史長期的發(fā)展造就了它較大的體積。也是在24.2.0這個(gè)版本Goggle將原來的單個(gè)v4庫拆分成了5個(gè)子庫,我們?cè)谑褂玫臅r(shí)候可以直接依賴某個(gè)子庫,從而減少依賴包的大小。下圖可見Android 2.2 Froyo占有率約為0.1%。

Gradle編譯腳本中整個(gè)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庫已經(jīng)被拆分成5個(gè)子庫,所以如下圖所示依賴24.2.1版本的support-v4庫除了導(dǎo)入support-v4庫外還會(huì)導(dǎo)入它的5個(gè)子庫,這個(gè)版本的support-v4庫本身是一個(gè)空的包,所有具體的實(shí)現(xiàn)都在它依賴的子庫中。下面依次看下v4庫拆分出來的5個(gè)子庫。

- 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相關(guān)組件。如,ViewPager、NestedScrollView、ExploreByTouchHelper等。
Gradle編譯腳本中v4 core-ui庫的依賴語句:
compile 'com.android.support:support-core-ui:24.2.1' - v4 media-compat library
多媒體框架相關(guān)部分。如,MediaBrowser、MediaSession等。
Gradle編譯腳本中v4 media-compat庫的依賴語句:
compile 'com.android.support:support-media-compat:24.2.1' - v4 fragment library
跟fragment相關(guān)部分。v4這個(gè)子庫依賴了其他4個(gè)子庫,所以我們一旦依賴這個(gè)庫就會(huì)自動(dòng)導(dǎo)入其他4個(gè)子庫,這跟直接依賴整個(gè)support-v4效果類似。關(guān)于v4拆分這篇文章有介紹,有興趣的可以點(diǎn)過去看看。
Gradle編譯腳本中v4 fragment 庫的依賴語句如下:
compile 'com.android.support:support-fragment:24.2.1'
【※】v7 Support Libraries
注意這里的Library用的也是復(fù)數(shù),說明v7庫和v4一樣也是很多庫的集合,不同的是v7各個(gè)庫不是后來拆分出來的,而是最初發(fā)布時(shí)就是以各個(gè)獨(dú)立的庫的形式發(fā)布的,如發(fā)布的最早的v7庫v7 gridlayout library。這些庫的共同之處是發(fā)布之初都是支持Android 2.1 (API level 7)及其以上版本,所以把他們統(tǒng)稱為v7支持庫。需要注意的24.2.0版本以后的v7支持庫支持范圍也是Android 2.3 (API level 9)及其以上版本了,這是因?yàn)関7依賴的v4庫支持版本范圍改變了,這點(diǎn)在v4支持庫小節(jié)有介紹。v7庫集合里有7個(gè)子庫,使用時(shí)根據(jù)需要選擇導(dǎo)入哪些庫。
v7 appcompat library
支持UI設(shè)計(jì)樣式、 material design相關(guān),如ActionBar、AppCompatActivity、Theme等。
Gradle編譯腳本中v7 appcompat庫的依賴語句:
compile 'com.android.support:appcompat-v7:24.2.1'v7 cardview library
支持cardview控件,使用material design語言設(shè)計(jì),卡片式的信息展示,在電視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相關(guān)的類。
Gradle編譯腳本中v7 mediarouter庫的依賴語句:
compile 'com.android.support:mediarouter-v7:24.2.1'v7 palette library
該庫提供了palette類,使用這個(gè)類可以很方便提取出圖片中主題色。比如在音樂App中,從音樂專輯封面圖片中提取出專輯封面圖片的主題色,然后將播放界面的背景色設(shè)置為封面的主題色,隨著播放音樂的改變,播放界面的背景色也會(huì)巧妙的跟著改變,從而提供更好的用戶體驗(yàn)。
Gradle編譯腳本中v7 palette庫的依賴語句:
compile 'com.android.support:palette-v7:24.2.1'v7 recyclerview library
該庫提供了recyclerview類。這個(gè)庫使用的頻率很高,網(wǎng)上有很多文章介紹recyclerview。
Gradle編譯腳本中v7 recyclerview庫的依賴語句:
compile 'com.android.support:recyclerview-v7:24.2.1'v7 Preference Support library
這個(gè)庫在設(shè)置界面常用到。提供了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支持庫集合中現(xiàn)在只有一個(gè)庫。
- v8 renderscript library
這個(gè)庫支持渲染腳本計(jì)算框架。對(duì)這個(gè)庫有興趣可以看渲染腳本開發(fā)指導(dǎo)。
使用v8 renderscript庫Gradle編譯腳本的配置方法:
defaultConfig {
renderscriptTargetApi 18
renderscriptSupportModeEnabled true
}
【※】v13 Support Library
v13支持庫適用范圍是Android 3.2 (API level 13)及其以上版本。這個(gè)庫跟v4 fragment library功能基本一樣,也是提供兼容fragment相關(guān)內(nèi)容。區(qū)別是v4 fragment library需要依賴v4支持庫集合里的其它4個(gè)子庫,而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中的相關(guān)類才是明智之舉。
Gradle編譯腳本中v13 support庫的依賴語句:
compile 'com.android.support:support-v13:24.2.1'
v14 Preference Support Library
功能類似v7 Preference Support library,支持Android系統(tǒng)版本不一致,新增部分相關(guān)接口。
Gradle編譯腳本中v 庫的依賴語句:
compile 'com.android.support:preference-v14:24.2.1'
v17 Preference Support Library for TV
功能類似v7 Preference Support library,支持Android系統(tǒng)版本不一致,新增部分相關(guān)接口,為電視設(shè)備App提供相應(yīng)的UI。
Gradle編譯腳本中v 庫的依賴語句:
compile 'com.android.support:preference-leanback-v17:24.2.1'
v17 Leanback Library
這也是在電視設(shè)備上使用的庫,主要是和YouTube相關(guān)的。
Gradle編譯腳本中v17 Leanback庫的依賴語句:
compile 'com.android.support:leanback-v17:24.2.1'
Annotations Support Library
提供注解相關(guān)功能。
Gradle編譯腳本中Annotations Support庫的依賴語句:
compile 'com.android.support:support-annotations:24.2.1'
【※】Design Support Library
這個(gè)庫現(xiàn)在使用的也比較多,它提供了material design設(shè)計(jì)風(fēng)格的控件。如,navigation drawers、floating action buttons (FAB)、snackbars、tabs等。
Gradle編譯腳本中Design Support庫的依賴語句:
compile 'com.android.support:design:24.2.1'
【※】Multidex Support Library
Android的單個(gè).dex文件最多能引用65536個(gè)方法,在這之后的方法就無法引用了。當(dāng)我們的方法數(shù)超過這個(gè)限制后就需要分成多個(gè)dex文件,該庫就是用來支持多個(gè)dex文件構(gòu)建應(yīng)用程序的。
Gradle編譯腳本中Multidex Support庫的依賴語句:
compile 'com.android.support:multidex:1.0.0'
【※】Custom Tabs Support Library
這個(gè)庫有很有意思,提供了一種新的打開網(wǎng)頁的方式。以前的App要打開一個(gè)網(wǎng)頁有兩種選擇,一個(gè)是用webview,這種方式工作量較大,第二種方式是調(diào)用瀏覽器應(yīng)用來打開網(wǎng)頁,這種方式要在兩個(gè)應(yīng)用中切換,用戶的操作體驗(yàn)是割裂的,都不夠理想。這個(gè)庫提供了第三種選擇,具體情況可以點(diǎn)擊這篇文章了解。
Gradle編譯腳本中Custom Tabs Support庫的依賴語句:
compile 'com.android.support:customtabs:24.2.1'
Percent Support Library
百分比支持庫提供了如PercentFrameLayout、PercentRelativeLayout布局,在這些布局中子view可以使用百分比來設(shè)置大小、位置等。
Gradle編譯腳本中Percent Support庫的依賴語句:
compile 'com.android.support:percent:24.2.1'
App Recommendation Support Library for TV
這個(gè)庫是電視設(shè)備上用來提供視頻內(nèi)容推薦的。
Gradle編譯腳本中Recommendation Support庫的依賴語句:
compile 'com.android.support:recommendation:24.2.1'
如何選擇使用支持包?
其實(shí)在了解了支持包特性之后,這個(gè)問題也就迎刃而解了,這里再做下總結(jié)。在使用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)。對(duì)于Android Support Library庫的依賴語句jar文件名和jar文件版本兩部分需要選擇確定。
jar文件名:在選擇之前要明確兩件事,需要使用支持包的哪種特性、需要兼容的最低Android版本,然后就可以確定具體依賴哪個(gè)支持庫。
jar文件版本:支持庫的版本需要跟compileSdkVersion保持一致。
注意:由于依賴的支持庫會(huì)打包進(jìn)apk,所以官方推薦開發(fā)者在編譯時(shí)使用ProGuard工具預(yù)處理release版本的apk。ProGuard工具除了混淆源代碼外,還會(huì)移除那些依賴的支持庫中沒有使用到的類,達(dá)到apk瘦身的效果。
結(jié)束
以上就是關(guān)于Android Support Library全部了,謝謝。如果文章有錯(cuò)誤或者有疑問請(qǐng)務(wù)必留言告訴我。