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

安卓平台其中一个很牛逼的地方在于它支持各种不同的设备。从你的平板电脑,到你的手机,电视等,安卓无处不在。安卓想成为一个全领域的移动计算平台。光从它的数量上来说,已经算是很成功了。

支持所有这些设备是有一些挑战的。不管硬件还是软件上的不同,用户希望应用程序可以在每一台设备上用样的运行;同样,对于开发者来说,你不能总指望用户已经升级到最近的安卓版本。事实上,开发者遇到的用户大多使用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/

 

posted @ 2016-05-28 00:30  idealcat  阅读(1843)  评论(0编辑  收藏  举报