標籤:
安卓平台其中一個很牛逼的地方在於它支援各種不同的裝置。從你的平板電腦,到你的手機,電視等,安卓無處不在。安卓想成為一個全領域的移動計算平台。光從它的數量上來說,已經算是很成功了。
支援所有這些裝置是有一些挑戰的。不管硬體還是軟體上的不同,使用者希望應用程式可以在每一台裝置上用樣的運行;同樣,對於開發人員來說,你不能總指望使用者已經升級到最近的安卓版本。事實上,開發人員遇到的使用者大多使用18個月前或者更老的版本。
如果沒有安卓團隊的協助,開發人員會不得不做些“醜陋的代碼”去相容那些使用老版本的使用者。幸運的是,安卓團隊已經意識到包容老裝置這一點很重要。不過相容老的同時不影響新的這一要求是一個架構上的挑戰,因為安卓介面隨著版本演化一直是在變動的。如何讓那些沒有更新裝置的老安卓裝置成功運行這些最新的安卓介面呢?
答案就是安卓團隊做得最重要和奇特的設計決定:安卓支援庫(the Android Support Library)
什麼是安卓支援庫(Android Support Library)?
早在2011年它作為安卓相容庫發布,在75%的應用中使用過,是最廣泛使用的安卓庫。它事實上不是一個單一的檔案,而是一個集合,其中可以大致可以分為兩組:相容庫和組件庫。
每一個庫都指明了所支援的最小sdk版本。有一點容易弄錯,就是高版本的支援庫很容易被理解為涵蓋了低版本支援庫的所有內容。實際上,並非如此。(可能你認為v7-appcompat包含了v4,但是不是這樣的)
相容庫(Compatibility Lib)
專註新版本向後相容,使老版本上可以使用新的API。主要的相容庫有v4和v7版本。
v4
正如名字所示,它向後相容到API4.支援了一些主要類的實現,比如Frament和Loader(API11引入),也支援了一些廣泛使用的但不存在framework中的類,比如ViewPager和DrawerLayout。
不要光看名字。不管是不是要支援安卓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/
理解安卓支援庫(Android Support Library)