安卓平台其中一个很牛逼的地方在于它支持各类不一样的设备。从你的平板电脑,到你的手机,电视等,安卓无处不在。安卓想成为一个全领域的移动计算平台。光从它的数量上来讲,已经算是很成功了。android
支持全部这些设备是有一些挑战的。无论硬件仍是软件上的不一样,用户但愿应用程序能够在每一台设备上用样的运行;一样,对于开发者来讲,你不能总期望用户已经升级到最近的安卓版本。事实上,开发者遇到的用户大多使用18个月前或者更老的版本。架构
若是没有安卓团队的帮助,开发者会不得不作些“丑陋的代码”去兼容那些使用老版本的用户。幸运的是,安卓团队已经意识到包容老设备这一点很重要。不过兼容老的同时不影响新的这一要求是一个架构上的挑战,由于安卓接口随着版本演进一直是在变更的。如何让那些没有更新设备的老安卓设备成功运行这些最新的安卓接口呢?app
答案就是安卓团队作得最重要和奇特的设计决定:安卓支持库(the Android Support Library)ide
早在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中没有的特性。这些库能够轻松的增删而不用考虑引用问题。如下是几个有价值的组件库:
向你工程里添加这些组件就如同在你的build脚本中添加一个引用同样简单。
先不说便利性和模块化的好处,将组件从库中抽离出来容许Google在Framework以外发布重要API。这样在正式何入到framework以前方便收集反馈,和设计上的迭代更新。总比先在framework中发布再作更改好的吧。
一样包含了一些其余比较少用的库,可是值得注意:
若是你须要的特性比你应用支持的最低sdk版本要老,或者该特性在标准framework中不支持。
不过Google认为使用支持库是一个好的实践,即便没有需求去使用它。
简而言之,使用有你须要功能的版本。好比你要用RecyclerView,直接将v7-recycleview引用添加到你的build脚本中就好。
若是你须要一个v4组件,你可使用v13若是你的最小sdk版本支持的话。
不过,支持库中的引用可能会使你决定使用哪个版本。
翻译自 http://martiancraft.com/blog/2015/06/android-support-library/