理解安卓支持庫(Android Support Library)

安卓平臺其中一個很牛逼的地方在於它支持各類不一樣的設備。從你的平板電腦,到你的手機,電視等,安卓無處不在。安卓想成爲一個全領域的移動計算平臺。光從它的數量上來講,已經算是很成功了。android

支持全部這些設備是有一些挑戰的。無論硬件仍是軟件上的不一樣,用戶但願應用程序能夠在每一臺設備上用樣的運行;一樣,對於開發者來講,你不能總期望用戶已經升級到最近的安卓版本。事實上,開發者遇到的用戶大多使用18個月前或者更老的版本。架構

若是沒有安卓團隊的幫助,開發者會不得不作些「醜陋的代碼」去兼容那些使用老版本的用戶。幸運的是,安卓團隊已經意識到包容老設備這一點很重要。不過兼容老的同時不影響新的這一要求是一個架構上的挑戰,由於安卓接口隨着版本演進一直是在變更的。如何讓那些沒有更新設備的老安卓設備成功運行這些最新的安卓接口呢?app

答案就是安卓團隊作得最重要和奇特的設計決定:安卓支持庫(the Android Support Library)ide

 

什麼是安卓支持庫(Android Support Library)?

早在2011年它做爲安卓兼容庫發佈,在75%的應用中使用過,是最普遍使用的安卓庫。它事實上不是一個單一的文件,而是一個集合,其中能夠大體能夠分爲兩組:兼容庫組件庫模塊化

每個庫都指明瞭所支持的最小sdk版本。有一點容易弄錯,就是高版本的支持庫很容易被理解爲涵蓋了低版本支持庫的全部內容。實際上,並不是如此。(可能你認爲v7-appcompat包含了v4,可是不是這樣的)ui

兼容庫(Compatibility Lib)spa

專一新版本向後兼容,使老版本上可使用新的API。主要的兼容庫有v4和v7版本。翻譯

v4設計

正如名字所示,它向後兼容到API4.支持了一些主要類的實現,好比Frament和Loader(API11引入),也支持了一些普遍使用的但不存在framework中的類,好比ViewPager和DrawerLayout。component

不要光看名字。不論是不是要支持安卓1.6,這裏仍然有一些頗有用和重要庫。而且因爲支持庫的引用依賴,通常很難避免不用v4.

v7

一般單純地用於兼容。v7提供了諸如ActionBar(API11引入),Toolbar(API21引入),而且向後兼容到API7.它依賴v4支持庫。

幕後狀況

兼容庫大量地使用shims技術(填充碼)來向後支持。這些shrims是簡單的封裝,若是在新版本上調用,shrims會將調用傳入底層framework實現;在老版本中,可能就是稍微不一樣的實現或者減小了一些功能。

在一些狀況下,shim沒有使用到。相對地,支持庫使用了一套本身的實現來代替framework的實現。(可能真的是無法100%兼容了)主要的一個例子就是v4中的Fragment。這個Fragment和framework中的Fragment就不同,也不兼容。

這個影響了整個安卓Framework,這個是有意思的設計。安卓建立了一整套不一樣的兼容實現,重複創造了大量相同功能。這些向後兼容的實現並行於framework,而且有它們本身的繼承結構以及bugs。

Google聲稱這些狀況下大部分API仍然是同樣的,除了那些屬於不一樣package而且有一些不一樣的方法。可事實上,是有一些不一致和非顯著不一樣存在於支持庫和framework之間的,而且這些不一樣頗有可能將隨時間推移而增加。

另外,在一些狀況下,開發者覺得他們本身有選擇去使用framework或者支持庫,但其實這得遵從於所支持的引用出自哪裏。好比說,v7支持庫容許開發者使用Material Design UI(API 21引入)。可是這樣須要Activity繼承AppCompatActivity,而AppCompatActivity是繼承自FragmentActivity(v4中實現)。因此在API21之下或者使用Material Design UI特性的所有都強制使用了v4版本的Fragment,而不是framework中的Fragment。不過Google認爲使用支持庫是一個好的實踐,即便沒有需求去使用它。

組件庫

安卓支持庫一樣提供了更小,更模塊化的組件庫,從而使開發者能夠添加framework中沒有的特性。這些庫能夠輕鬆的增刪而不用考慮引用問題。如下是幾個有價值的組件庫:

  • v7-recyclerview: provides the RecyclerView component, which efficiently displays and animates large amounts of data and is designed to replace ListView
  • v7-cardview: provides the CardView component, enabling the cards UI design pattern
  • v7-gridlayout: provides the GridLayout class, which enables organizing UI elements into a rectangular grid
  • v7-mediarouter: provides MediaRouter and related classes, enabling Google Cast support
  • v7-palette: provides the Palette class, which enables developers to identify primary colors in an image

向你工程裏添加這些組件就如同在你的build腳本中添加一個引用同樣簡單。

先不說便利性和模塊化的好處,將組件從庫中抽離出來容許Google在Framework以外發布重要API。這樣在正式何入到framework以前方便收集反饋,和設計上的迭代更新。總比先在framework中發佈再作更改好的吧。

 

其餘庫

一樣包含了一些其餘比較少用的庫,可是值得注意:

  • v8: provides support for RenderScript (introduced in API 11) back to API 8
  • v13: provides additional compatibility support for the Fragment UI pattern and bundles the v4 library
  • v17: provides support for building TV UIs
  • multidex: provides support for building apps with multiple DEX files
  • annotations: provides support for annotations like @NonNull and @IntDef

常見問題

我什麼狀況下應該用安卓支持庫?

若是你須要的特性比你應用支持的最低sdk版本要老,或者該特性在標準framework中不支持。

不過Google認爲使用支持庫是一個好的實踐,即便沒有需求去使用它。

 

我應該用哪個版本?

簡而言之,使用有你須要功能的版本。好比你要用RecyclerView,直接將v7-recycleview引用添加到你的build腳本中就好。

若是你須要一個v4組件,你可使用v13若是你的最小sdk版本支持的話。

不過,支持庫中的引用可能會使你決定使用哪個版本。

 

翻譯自 http://martiancraft.com/blog/2015/06/android-support-library/

相關文章
相關標籤/搜索