前言
能夠讓App運行在大量不同型號和系統版本的設備上是Android系統最牛逼的地方之一。注意,我這里說的是設備,這其中除了不同型號的手機,還包括平板電腦,手表,甚至是電視,汽車等等。
要想茲次花樣繁多的設備和平臺本身已經是一件挺麻煩的事兒了,Android系統又在不斷發展著,時不時地用科技改變一下生活。
然而用戶們才不管這些,他們還特別希望同一個App在不同版本的系統和設備上運行的時候外觀和功能上都差不多,哪怕有些系統都老掉牙了。
用戶的需求給程序猿的開發工作帶來了巨大的挑戰,到底如何讓新版本的特性展現在老版本的系統上呢?
上帝說淵面黑暗的時候要有光,于是Google貼心地為開發者們準備了Android Support Library
。
Android Support Library
幾乎每個Android開發者都多少了解一點Android Support Library
:就是給老版本的系統提供新API的庫嘛,幾乎的App開發中都用到了。這的確是Android Support Library
作用,但往往人們對它的理解還存在一些細節上的誤區,今天我們就來徹底理解一下Android Support Library
。
事實上,Android Support Library 在設計上并不是用一個library來保證所有的老設備都能用上新功能,道理很簡單:隨著新功能越來越多會讓它變得越來越龐大和難以維護。(我要吐槽一句,也許剛開始就是這么設計的,所以v4才海納百川般龐大)
因此,Android Support Library 是一個眾多兼容庫的集合,開發者根據自己的需求來選擇合適的library來依賴就可以了。
我們注意到,Android Support Library在命名上都有一個版本號(例如v7,v4等等),這個版本號其實是標識了工程必須使用的minSdkVersion,而不是說高版本的library包含了低版本的所有功能和特性。
總體上,Android Support Library 可以分為兩類:兼容庫和組件庫,下面我們來仔細了解一下。
顧名思義,兼容庫的主要作用就是解決向后兼容的問題:來讓App運行在低版本手機上的時候能夠使用新版本系統才有的特性。很多人會混淆向前兼容(Forwards Compatibility)和向后兼容(Backwards Compatibility)的意思,向前兼容并不是說兼容以前的版本,而是兼容將來(Forwards)的版本。我們這里所討論的是向后兼容的問題。
大多數情況下,兼容庫會采用包裝類的方式來實現向后兼容的問題,在新版Android系統的API調用上有兩種實現策略:
調用Android framework層的API。假設Android新版本中引入了一種組件,兼容庫在支持該組件的新版系統上調用系統framework層的API來實現相應功能,而在低版本系統上則會調用兼容庫自身所做的相關實現。從而來保證舊的系統也能使用該組件及相應功能。
調用Android Support Library自身所實現的API。例如v4包中所支持的Fragment,就算App運行在新版系統上也會調用Fragment在兼容庫里面的實現,而不是framework層的實現。
那么對于一個組件或者新的API,系統framework和兼容包中的實現是相同的么?Google表示盡管兩者在類文件,打包的資源等都不相同,但向外暴露的API基本都是相同的。
聽上去我們開發者在日常工作中用哪套接口都是可以咯?然而在實際開發中我們會發現并不是這樣簡單。舉個例子,Android在 API 21引入了Material Design,并在低版本中我們可以通過v7-appcompat 對其進行兼容。然而,我們要想使用Material Design就需要我們的activity繼承AppCompatActivity
,而恰恰AppCompatActivity
又繼承了v4包中實現的FragmentActivity
,因此,即使app運行在Android 21以上,它所使用的fragment也不是framework中所實現的,而是在v4包中所實現的fragment。我們平時開發工作中,用到最多的兼容庫就是v4
和v7-appcompat
:
v4
正如上面提到的,v4包相對來說比較大,也支持了API 4之后非常多的新特性(例如Fragment),因此它看上去更像諸多library的祖宗。仍要強調的一點是,v4包并不是支持了Android API 4以來的所有的新特性,而是說依賴v4的工程的minSdkVersion要大于4.v7-appcompat
v7-appcompat 提供了API 21 引入的Toolbar
在API 7 以后的實現,從而保證開發者可以在API 21 之前就可以使用到Toolbar
。v7-appcompat雖然不包含v4,但是會依賴v4,因此那些需要使用v7-appcompat的工程也需要依賴v4。
Android在推出新版本的時候往往也會推出一些新的組件,這些組件自身并沒有調用底層的framework的API,因此在舊版本系統上進行兼容就顯得很方便,進行開發時只需引入相應的組件依賴即可。Android Support Library提供了諸如v7-recyclerview,v7-cardview,v7-gridlayout等更小更靈活的組件庫。
總結
綜上,當我們希望在低版本系統上運行的App也能使用高版本系統所推出的新特性時,需要引入相應的兼容庫或者組件庫,只需要保證工程的minSdkVersion API要大于Library支持的版本。