了解Android 的支持库
我只是技术搬运工,如果搬运有误,请不吝指出,谢谢
了解Android 的支持库
支持众多不同设备是Android平台强大的一方面。从手机,平板,手表到电视机,汽车等等,Android想成为所有移动计算平台。从数字上来说,已经非常成功了-在作者写这篇文章的时候已经用超过20,000不同的设备了。这已经超过了任何其他的竞争平台。
支持所有这些设备,遇到一连串的挑战。用户希望app能在不同设备上表现一致,尽管在设备上有重要的不同。以此同时,因为唯一的挑战是发布Android软件给用户,所以开发者不能一味的依赖于用户是使用Android的最新版本。实际上,开发者应该预期大多数用户是使用18各月以前或更早以前的Android版本。
如果没有来至Android团队的支持,开发者为了支持他们的用户被迫要求做丑陋的方案。幸运的是,Android团队意识到了协调老版本设备对战略来说是重要的。然而,在不影响未来的版本情况下,提出了一个构建的挑战,因为Android的API会随着时间的推移而演变。如何将新的重要的API让大部分Android用户使用,而不是仅仅的新设备和新版本用户?
答案是由Android团队做出的最重要,最奇特的设计决策之一:Android的支持库。
什么是Android支持库?
Android 支持库始于2011年,作为Android的兼容库。在所有安装的应用中,超过75%,它是最广泛应用的Android库。Android开发人员可以使用Android支持库提供的新的Api给老版本使用。但是这并不是全部。
Android支持库并不是单单是一个库,而是一个库的集合:大概可以分为两组:兼容库和组件库。
每个库使用一个名字约定,可以识别minSdkVersion,你的项目如果需要使用就需要使用minSdkVersion。那看起来是有点迷惑的,因为你认为高版本包含了低版本的特性(你认为v7-appcompat提供了来至v4的特性)。这望望是错误的。库自己有版本号,比如”AppCompat v21”实际上市指支持库v7-appcompat的21版本。
兼容库
兼容库旨在将新版本的特性移植到那些跑在老版本的机器上,以便可以使用新
API的优势。主要的兼容库是v4和v7-appcompat。
v4
v4是所有的鼻祖。它包含了很多的特性,就像它名字所暗示的,支持回API 4. 除了支持主要的实现类,如:Fragment和Loader(这两个都在API 11的框架中),你也将发现好几个广泛使用的类也没有在框架中,比如ViewPager和DrawerLayout。
不要让它的名字糊弄了你:尽管可以支持回Android 1.6,它任然是一个被广泛使用和重要的库。因为支持库以来,你很难完全的避免使用v4.
v7-appcompat
通常简单称为AppCompat, v7-appcompat库提供了ActionBar(在API 11中介绍)和 Toolbar(在API21中介绍)的实现为了向后金融API 7. 它需要v4库,但是它不包含v4.因此,任何特许如果是以来v7-appcompat的话也需要以来v4.
Under the Hood(引擎盖下)
兼容库大量使用垫片(shims)来向后兼容特许。这些兼容垫片是对底层实现的组件(在支持版本的API)的封装。在老的版本中,这些垫片反而调用支持实现,可能有轻微的不同或者是功能的删减。
然而,在一些情况下兼容垫片是不被使用的,相反,在这些情况下支持包经常使用它们自己的实现来替代框架的实现-甚至当版本支持框架的实现。一个主要的例子是v4支持的Fragments。
这是一个非常有趣的决定,在整个Android框架中都有体现。Android已经创建了一个完全不同的支持实现(主要的特性,大多数功能的复制),并且将他们打包为不同的classe和resources集合。这些实现平行的生存在他们的兄弟框架中,完全拥有它们自己的继承结构,修订版本和bugs。
谷歌宣称在这种情况下,大部分的API是相同的,除了包的不同和方法名的微小差别。然而,在实际中,有那么一些不明显的API差别在支持库和框架的实现上-差别将随着时间而增加。
此外,在某些情况下,开发人员可能认为他们可以在框架和支持实现中选择所用的特性,但是只是发现支持以来决定了他们的选择。比如,v7-appcompat库可以让开发人员使用Material Design UI特性(在API 21中介绍)。然而,这样做所有的Activity都需要继承自AppCompatActivity,它继承自v4的支持库FragmentActivity.因此,开发人员的API如果小于21,但是希望使用Material Design UI特性,就必须使用v4支持的Fragments,而不是框架的Fragments。
谷歌认为使用支持库是最佳的实践,即使不是必须的。v70appcompat和v4库在它的大多数实例代码中,并且在Android Studio的新项目魔棒中。谷歌显然是在兼容库上花很大的努力了,并且希望开发人员很大程度上使用它们。
组件库
除了兼容性库,Android的支持库还提供了更小,更模块化的组件库,使开发人员能够增加在其他方面功能而不是标准框架的一部分。这些独立的库,可以轻松地从项目中添加或删除,而不依赖关注。有几个有价值的组件库值得考虑:
v7-recyclerview: 提供 RecyclerView组件,它可以有效的动画的展示大量的数据,被用来替代ListView。
v7-cardview: 提供CardView组件,可以使用cards UI设计模式。
v7-gridlayout: 提供GridLayout 类,可以组织UI元素到矩形grid中。
v7-mediarouter: 提供MediaRouter和相关的类,可以支持Google Cast。
v7-palette: 提供Palette 类,可以使开发人员识别原始颜色在一张图片中。
添加这些组件到你的基于gradle的项目就像添加依赖到你的build 脚本一样简单。
除了方便和模块化的好处外,分离这些组件到它们自己的库中可以事谷歌单独发布重要API,而不需要在框架之内。这样允许收集反馈,并且可以迭代开发在整合到框架之前。
其他的库
在Android的支持库中还包含了一些平时比较少用的库,但是也值得提及:
v8: 为RenderScript(在API 11中介绍)提供支持为了向后金融API 8
v13:为Fragment UI模式和v4提供额外的兼容支持。
v17: 为构建TV UI提供支持
multidex:为构建多个DEX文件的app提供支持
annotations: 为像@NonNULL和 @IntDef的注解提供支持。
常见问题
什么时候我应该使用Android的支持库?
当你需要的框架特性是比minSdkVersion新的时候或者在你标准框架中不可用时需要支持库。
然而,谷歌认为一般情况下使用支持库是最好的实践,即使不是必要的。
那个版本的支持库是我需要的?
总之,使用你应用需要支持特性的对应的版本。一些特性和模块,比如,使用RecyclerView,只要简单的将v7-recyclerView以来添加到你的Gradle脚本。
如果你需要一个来之v4的兼容组件,你可以使用v13替代,如果你的minSdkVersion支持的话,因为它绑定了v4。不然的话,如果你需要支持API小于13的,并且需要v4组件,可以直接使用v4.
然而,需要注意的是支持库的以来可能命令具体支持库的使用。
结论
通过谷歌的标准,为了Android保持成功,它必须继续保持尽可能宽的覆盖。一个组要组件的目标就是为了爆炸式增长的设备支持,其中许多可能永远不会有机会获得最新的Android版本的持续支持。
虽然不总是优雅的或者完全无痛的,Android支持库可以是开发者在老版本上使用重要的新的API,同时提供了游泳的组件,它们不是在标准Android框架中的。它是Android开发重要的部分,Android开发人员有责任懂它和利用它。