在之前的開發(fā)經(jīng)歷中經(jīng)常需要導(dǎo)入一些如v4、v7、v13等Android官方的支持包蕴轨,遇到這些情況時都是網(wǎng)上搜索一下,按照前人給的示例添加依賴骇吭。這么稀里糊涂的使用后代碼正常運(yùn)行了橙弱,但心中不免會有一些疑問,如燥狰,Android官方為什么要提供支持包棘脐,都提供哪些支持包,這些支持包又提供了什么特性龙致,開發(fā)者又應(yīng)該如何選擇使用這些支持包蛀缝?
(本文出處 @都有米:http://www.reibang.com/p/f5f9a4fd22e8)
為了解開這些疑問,周末在家仔細(xì)閱讀了官方的開發(fā)者指導(dǎo)文檔的相關(guān)內(nèi)容目代。這篇文章就是讀后整理的讀書筆記屈梁。最新的Android Support Library版本。
Android官方為什么要提供支持包榛了?
為什么官方向開發(fā)者在提供了android sdk之外在讶,還要提供一些零碎的開發(fā)支持jar包,全部放在framework中不好嗎霜大?恩构哺,不好!因為這不是好不好的問題战坤,這是Android平臺快速發(fā)展帶來的必然產(chǎn)物曙强,這張圖羅列了已經(jīng)發(fā)布的Android版本及其對應(yīng)的開發(fā)sdk的級別。
至于為什么提供支持包官方給出了大致三個原因:
- 向后兼容
如湖笨,我們開的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è)備就會crash,報找不到ActionBar的錯誤袱衷。這很好理解捎废,因為舊版本上沒有新版本里新增的類。為了避免使用了最新功能開發(fā)的app只能在最新系統(tǒng)的設(shè)備上運(yùn)行的尷尬致燥,官方把新版系統(tǒng)framework中新增加的接口提出來放到了Android Support Library(支持包)中登疗,開發(fā)者在遇到上面的情況時,就可以使用支持包中具有同樣功能的ActionBar類嫌蚤,這個支持包會打包進(jìn)App里辐益,這樣使用了新版本系統(tǒng)上功能的App也可以向后兼容以前的老系統(tǒng)版本設(shè)備了。
使用支持包中的類除了讓我們免于判斷App運(yùn)行的系統(tǒng)版本外脱吱,還可以使App在各個版本保持同樣的用戶體驗智政。如在5.0以下系統(tǒng)使用material design。
App編譯時用的android sdk(android.jar)不會打包進(jìn)我們的App中箱蝠。因為App編碼是使用android.jar中的接口就是android設(shè)備里系統(tǒng)框架層(framework)對外提供的接口续捂。
提供不適合打包進(jìn)framework的功能
Android官方對App開發(fā)提供了推薦設(shè)計,希望Android應(yīng)用都有相對一致的交互設(shè)計來減少用戶的使用成本宦搬,希望三方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這兩個集合庫,因為這兩個庫支持的android系統(tǒng)版本范圍比較廣诚纸,官方推薦的UI設(shè)計樣式相關(guān)類也都在這兩集合庫中撰筷。
【※】v4 Support Libraries
v4庫被設(shè)計在Android 2.3 (API level 9)及其以上系統(tǒng)中使用。 Support Library的第1版(2011年3月發(fā)布)就只包含v4庫畦徘,當(dāng)時v4庫只是一個庫毕籽,支持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ā)布)的時候移除了對Android 2.2 (API level 8)及其以下版本的支持溶握,但是名字依然是v4。v4悠久的歷史長期的發(fā)展造就了它較大的體積蒸播。也是在24.2.0這個版本Goggle將原來的單個v4庫拆分成了5個子庫睡榆,我們在使用的時候可以直接依賴某個子庫,從而減少依賴包的大小袍榆。下圖可見Android 2.2 Froyo占有率約為0.1%胀屿。
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庫已經(jīng)被拆分成5個子庫碉纳,所以如下圖所示依賴24.2.1版本的support-v4庫除了導(dǎo)入support-v4庫外還會導(dǎo)入它的5個子庫,這個版本的support-v4庫本身是一個空的包馏艾,所有具體的實現(xiàn)都在它依賴的子庫中。下面依次看下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相關(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這個子庫依賴了其他4個子庫股缸,所以我們一旦依賴這個庫就會自動導(dǎo)入其他4個子庫,這跟直接依賴整個support-v4效果類似吱雏。關(guān)于v4拆分這篇文章有介紹敦姻,有興趣的可以點過去看看瘾境。
Gradle編譯腳本中v4 fragment 庫的依賴語句如下:
compile 'com.android.support:support-fragment:24.2.1'
【※】v7 Support Libraries
注意這里的Library用的也是復(fù)數(shù),說明v7庫和v4一樣也是很多庫的集合替劈,不同的是v7各個庫不是后來拆分出來的寄雀,而是最初發(fā)布時就是以各個獨立的庫的形式發(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)及其以上版本了眨业,這是因為v7依賴的v4庫支持版本范圍改變了急膀,這點在v4支持庫小節(jié)有介紹。v7庫集合里有7個子庫龄捡,使用時根據(jù)需要選擇導(dǎo)入哪些庫卓嫂。
v7 appcompat library
支持UI設(shè)計樣式、 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è)計,卡片式的信息展示突照,在電視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類,使用這個類可以很方便提取出圖片中主題色座慰。比如在音樂App中陨舱,從音樂專輯封面圖片中提取出專輯封面圖片的主題色,然后將播放界面的背景色設(shè)置為封面的主題色角骤,隨著播放音樂的改變隅忿,播放界面的背景色也會巧妙的跟著改變,從而提供更好的用戶體驗邦尊。
Gradle編譯腳本中v7 palette庫的依賴語句:
compile 'com.android.support:palette-v7:24.2.1'v7 recyclerview library
該庫提供了recyclerview類背桐。這個庫使用的頻率很高,網(wǎng)上有很多文章介紹recyclerview蝉揍。
Gradle編譯腳本中v7 recyclerview庫的依賴語句:
compile 'com.android.support:recyclerview-v7:24.2.1'v7 Preference Support library
這個庫在設(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)在只有一個庫熙卡。
- v8 renderscript library
這個庫支持渲染腳本計算框架。對這個庫有興趣可以看渲染腳本開發(fā)指導(dǎo)励饵。
使用v8 renderscript庫Gradle編譯腳本的配置方法:
defaultConfig {
renderscriptTargetApi 18
renderscriptSupportModeEnabled true
}
【※】v13 Support Library
v13支持庫適用范圍是Android 3.2 (API level 13)及其以上版本驳癌。這個庫跟v4 fragment library功能基本一樣,也是提供兼容fragment相關(guān)內(nèi)容役听。區(qū)別是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中的相關(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
這個庫現(xiàn)在使用的也比較多填物,它提供了material design設(shè)計風(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的單個.dex文件最多能引用65536個方法涎劈,在這之后的方法就無法引用了。當(dāng)我們的方法數(shù)超過這個限制后就需要分成多個dex文件阅茶,該庫就是用來支持多個dex文件構(gòu)建應(yīng)用程序的蛛枚。
Gradle編譯腳本中Multidex Support庫的依賴語句:
compile 'com.android.support:multidex:1.0.0'
【※】Custom Tabs Support Library
這個庫有很有意思,提供了一種新的打開網(wǎng)頁的方式脸哀。以前的App要打開一個網(wǎng)頁有兩種選擇蹦浦,一個是用webview,這種方式工作量較大撞蜂,第二種方式是調(diào)用瀏覽器應(yīng)用來打開網(wǎng)頁盲镶,這種方式要在兩個應(yīng)用中切換侥袜,用戶的操作體驗是割裂的,都不夠理想溉贿。這個庫提供了第三種選擇枫吧,具體情況可以點擊這篇文章了解。
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
這個庫是電視設(shè)備上用來提供視頻內(nèi)容推薦的尼酿。
Gradle編譯腳本中Recommendation Support庫的依賴語句:
compile 'com.android.support:recommendation:24.2.1'
如何選擇使用支持包?
其實在了解了支持包特性之后植影,這個問題也就迎刃而解了裳擎,這里再做下總結(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)
。對于Android Support Library庫的依賴語句jar文件名和jar文件版本兩部分需要選擇確定谷饿。
jar文件名:在選擇之前要明確兩件事惶我,需要使用支持包的哪種特性、需要兼容的最低Android版本博投,然后就可以確定具體依賴哪個支持庫绸贡。
jar文件版本:支持庫的版本需要跟compileSdkVersion
保持一致。
注意:由于依賴的支持庫會打包進(jìn)apk毅哗,所以官方推薦開發(fā)者在編譯時使用ProGuard工具預(yù)處理release版本的apk听怕。ProGuard工具除了混淆源代碼外,還會移除那些依賴的支持庫中沒有使用到的類虑绵,達(dá)到apk瘦身的效果尿瞭。
結(jié)束
以上就是關(guān)于Android Support Library全部了,謝謝翅睛。如果文章有錯誤或者有疑問請務(wù)必留言告訴我声搁。