前言
能够让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支持的版本。