Android Support Library的前世今生

封面

在之前的開發(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的級別。

Android版本

至于為什么提供支持包官方給出了大致三個原因:

  1. 向后兼容
    如湖笨,我們開的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)對外提供的接口续捂。

  1. 提供不適合打包進(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等類都是這種情況聂渊。

  2. 為了支持不同形態(tài)的設(shè)備
    通過使用支持包來在不同形態(tài)設(shè)備上提供功能,如手機(jī)四瘫、電視汉嗽、可穿戴設(shè)備等。

官方提供了哪些支持包找蜜,都有哪些特性饼暑?

現(xiàn)在Android官方發(fā)布了下面13類支持庫,不同的支持庫包含不同特征洗做,適用的Android版本也不相同弓叛。通常情況下我們都使用到v4和v7這兩個集合庫,因為這兩個庫支持的android系統(tǒng)版本范圍比較廣诚纸,官方推薦的UI設(shè)計樣式相關(guān)類也都在這兩集合庫中撰筷。

Android Support Library
【※】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%胀屿。

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

support-v4
  • 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)組件暑始。如搭独,ViewPagerNestedScrollView廊镜、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è)置界面常用到链峭。提供了 CheckBoxPreferenceListPreference等類又沾。
    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ù)必留言告訴我声搁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捕发,隨后出現(xiàn)的幾起案子疏旨,更是在濱河造成了極大的恐慌,老刑警劉巖爬骤,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充石,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骤铃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拉岁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惰爬,你說我怎么就攤上這事喊暖。” “怎么了撕瞧?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵陵叽,是天一觀的道長。 經(jīng)常有香客問我丛版,道長巩掺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任页畦,我火速辦了婚禮胖替,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豫缨。我一直安慰自己独令,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布好芭。 她就那樣靜靜地躺著燃箭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舍败。 梳的紋絲不亂的頭發(fā)上招狸,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音邻薯,去河邊找鬼瓢颅。 笑死,一個胖子當(dāng)著我的面吹牛弛说,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翰意,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼木人,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冀偶?” 一聲冷哼從身側(cè)響起醒第,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎进鸠,沒想到半個月后稠曼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡客年,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年霞幅,在試婚紗的時候發(fā)現(xiàn)自己被綠了漠吻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎土。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡久橙,死狀恐怖健民,靈堂內(nèi)的尸體忽然破棺而出宿礁,到底是詐尸還是另有隱情耗绿,我是刑警寧澤剑梳,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布乃沙,位于F島的核電站熬甫,受9級特大地震影響猎塞,放射性物質(zhì)發(fā)生泄漏试读。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一荠耽、第九天 我趴在偏房一處隱蔽的房頂上張望钩骇。 院中可真熱鬧,春花似錦骇塘、人聲如沸伊履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唐瀑。三九已至,卻和暖如春插爹,著一層夾襖步出監(jiān)牢的瞬間哄辣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工赠尾, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留力穗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓气嫁,卻偏偏與公主長得像当窗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寸宵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評論 25 707
  • 更多原創(chuàng)文章和優(yōu)質(zhì)資源請關(guān)注公眾號: 網(wǎng)上對Android Support Library中各個依賴包介紹的中文資...
    張明云閱讀 19,967評論 8 89
  • afinalAfinal是一個android的ioc崖面,orm框架 https://github.com/yangf...
    passiontim閱讀 15,434評論 2 45
  • 如果說,相機(jī)是情人的眼睛梯影,那么你一定覺得我很美巫员。讓我感覺到你是真的喜歡這個姑娘的^_^
    Yuki醬在到處之間閱讀 441評論 0 0
  • 出發(fā):(第一天) 還未嘗試過和同班同學(xué)去浪的我們穿著滿滿的新鮮與期待感,拖著厚重的行李箱甲棍,一只腳前简识,一只...
    51鹿兮閱讀 555評論 0 1