Android Support Library的前世今生

来源:互联网 发布:直接给mac安装win10 编辑:程序博客网 时间:2024/06/14 13:50

今日科技快讯

上周360云盘发布公告称:由于当前部分不法分子利用360云盘存储传播非法文件、侵权盗版牟利、传播淫秽色情信息等违法犯罪行为屡有发生,严重侵犯正版企业的合法权益,更给社会带来了巨大的危害,所以决定进行服务转型,停止个人云盘服务,即日起至2017年2月1日进行会员退款,2017年2月1日起关闭所有的云盘账号并清空数据。

其实在360云盘宣布关停之后,百度云盘就成了大家关注的焦点。结果近日百度云盘直接补刀了一一开展红包活动并配文:“不知为啥,就是突然想送3.60个亿的超级会员红包!啥时候结束?不知道,可能明天,看心情吧~没啥活动规则,点下面就对了,手慢无!”网友称:百度云盘此举既是啪啪打脸某零云盘,又是向用户推销其超级会员服务。

作者简介

之前有朋友留言说,对v4,v7等支持包不怎么清楚,那么今天这篇来自 都有米 的投稿,将带你全面理解所有的 Support Library。希望能给大家带来帮助!

都有米 的博客地址:

http://www.jianshu.com/users/809a87a672b3

前言

在之前的开发经历中经常需要导入一些如 v4v7v13 等 Android官方的支持包,遇到这些情况时都是网上搜索一下,按照前人给的示例添加依赖。这么稀里糊涂的使用后代码正常运行了,但心中不免会有一些疑问,如:Android官方为什么要提供支持包,都提供哪些支持包,这些支持包又提供了什么特性,开发者又应该如何选择使用这些支持包

为了解开这些疑问,周末在家仔细阅读了官方的 开发者指导文档 的相关内容:

https://developer.android.com/topic/libraries/support-library/index.html

这篇文章就是读后整理的读书笔记。

为什么提供支持包

为什么官方向开发者在提供了 android sdk 之外,还要提供一些零碎的开发支持jar包,全部放在 framework 中不好吗?恩,不好!因为这不是好不好的问题,这是 Android 平台快速发展带来的必然产物,这张图罗列了已经发布的 Android 版本及其对应的开发 sdk 的级别。

至于为什么提供支持包官方给出了大致三个原因:

1. 向后兼容

比如,我们开的App需要支持的 minSdkVersion=9,targetSdkVersion=11,在程序里使用了android 3.0 (API level 11)提供的 ActionBar类,使用 compileSdkVersion=11 成功编译出apk。在 android 3.0 的设备上完美运行,但是app在 android 2.3 的设备就会 crash,报找不到 ActionBar 的错误。

这很好理解,因为旧版本上没有新版本里新增的类。为了避免使用了最新功能开发的app只能在最新系统的设备上运行的尴尬,官方把新版系统framework中新增加的接口提出来放到了 Android Support Library(支持包)中,开发者在遇到上面的情况时,就可以使用支持包中具有同样功能的 ActionBar类,这个支持包会打包进App里,这样使用了新版本系统上功能的App也可以向后兼容以前的老系统版本设备了。

使用支持包中的类除了让我们免于判断App运行的系统版本外,还可以使App在各个版本保持同样的用户体验。如在5.0以下系统使用 material design。

App编译时用的 android sdk(android.jar)不会打包进我们的App中。因为App编码是使用 android.jar 中的接口就是 android设备里系统框架层(framework)对外提供的接口。

2. 提供不适合打包进framework的功能

Android官方 对App开发提供了推荐设计,希望 Android应用 都有相对一致的交互设计来减少用户的使用成本,希望三方App类似系统应用从而完美融入到Android生态系统中。但是这都仅仅是推荐,不要求开发者一定要这样,如果有这种需求就可以使用官方支持包提供的这些功能,避免重复造轮子。如支持包中的 DrawerLayoutSnackbar 等类都是这种情况。

3. 为了支持不同形态的设备

通过使用支持包来在不同形态设备上提供功能,如手机、电视、可穿戴设备等。

有哪些支持包及特性

现在Android官方发布了下面 13类支持库,不同的支持库包含不同特征,适用的Android版本也不相同。通常情况下我们都使用到 v4 和 v7 这两个集合库,因为这两个库支持的android系统版本范围比较广,官方推荐的UI设计样式相关类也都在这两集合库中。

【※】v4 Support Libraries

v4库被设计在Android 2.3 (API level 9)及其以上系统中使用。 Support Library的第1版(2011年3月发布)就只包含v4库,当时v4库只是一个库,支持Android 1.6 (API level 4)及其以上版本,这也是v4名字的由来。随着系统的迭代现在Android 1.6设备已经很少了,官方在Support Library的第24.2.0版本(2016年8月发布)的时候移除了对Android 2.2 (API level 8)及其以下版本的支持,但是名字依然是v4。v4悠久的历史长期的发展造就了它较大的体积。也是在24.2.0这个版本Goggle将原来的单个v4库拆分成了5个子库,我们在使用的时候可以直接依赖某个子库,从而减少依赖包的大小。下图可见Android 2.2 Froyo占有率约为0.1%。

2016年9月5日各版本市场占有率

Gradle编译脚本中整个v4库的依赖语句如下:

compile 'com.android.support:support-v4:24.2.1'

gradle中jar依赖语句格式如 compile 'jar文件组(group/命名空间):jar文件名(name):jar文件版本(version)'。所以上面的语句意思是依赖Android支持库中 第24.2.1版 的 support-v4库。由于在 24.2.0版本 support-v4库 已经被拆分成5个子库,所以如下图所示依赖 24.2.1版本 的 support-v4库 除了导入 support-v4库 外还会导入它的5个子库,这个版本的 support-v4库 本身是一个空的包,所有具体的实现都在它依赖的子库中。下面依次看下v4库拆分出来的5个子库。

  • v4 compat library

为一些框架的API提供兼容性包装。如 Context.obtainDrawable()View.performAccessibilityAction() 等。

Gradle编译脚本中 v4 compat库 的依赖语句:

compile 'com.android.support:support-compat:24.2.1'
  • v4 core-utils library

提供了一些工具类。如 AsyncTaskLoaderPermissionChecker等。

Gradle编译脚本中 v4 core-utils库 的依赖语句:

compile 'com.android.support:support-core-utils:24.2.1'
  • v4 core-ui library

提供很多UI相关组件。如 ViewPagerNestedScrollViewExploreByTouchHelper 等。

Gradle编译脚本中 v4 core-ui库 的依赖语句:

compile 'com.android.support:support-core-ui:24.2.1'
  • v4 media-compat library

多媒体框架相关部分。如 MediaBrowserMediaSession 等。

Gradle编译脚本中 v4 media-compat库 的依赖语句:

compile 'com.android.support:support-media-compat:24.2.1'
  • v4 fragment library

跟 fragment 相关部分。v4这个子库依赖了其他4个子库,所以我们一旦依赖这个库就会自动导入其他4个子库,这跟直接依赖整个support-v4效果类似。关于v4拆分这篇文章:

http://www.trinea.cn/android/android-%E6%9C%80%E6%96%B0-support-v4-%E5%8C%85%E5%A4%A7%E6%8B%86%E5%88%86%E6%9C%89%E7%94%A8%E5%90%97%EF%BC%9F

Gradle编译脚本中 v4 fragment 库 的依赖语句如下:

compile 'com.android.support:support-fragment:24.2.1'
【※】v7 Support Libraries

注意这里的 Library 用的也是复数,说明 v7库 和 v4 一样也是很多库的集合,不同的是 v7 各个库不是后来拆分出来的,而是最初发布时就是以各个独立的库的形式发布的,如发布的最早的 v7库 v7 gridlayout library。这些库的共同之处是发布之初都是支持 Android 2.1 (API level 7) 及其以上版本,所以把他们统称为 v7支持库。需要注意的 24.2.0版本 以后的v7支持库 支持范围也是 Android 2.3 (API level 9) 及其以上版本了,这是因为 v7 依赖的 v4库 支持版本范围改变了,这点在 v4支 持库小节有介绍。v7库 集合里有 7个子库,使用时根据需要选择导入哪些库。

  • v7 appcompat library

支持UI设计样式 、 material design 相关,如 ActionBarAppCompatActivityTheme 等。

Gradle编译脚本中 v7 appcompat库 的依赖语句:

compile 'com.android.support:appcompat-v7:24.2.1'
  • v7 cardview library

支持 cardview 控件,使用 material design 语言设计,卡片式的信息展示,在电视App中有广泛的使用。

Gradle编译脚本中 v7 cardview库 的依赖语句:

compile 'com.android.support:cardview-v7:24.2.1'
  • v7 gridlayout library

支持 gridlayout 布局。

Gradle编译脚本中 v7 gridlayout库 的依赖语句:

compile 'com.android.support:gridlayout-v7:24.2.1'
  • v7 mediarouter library

该库提供了 MediaRouterMediaRouteProvider 等与 Google Cast 相关的类。

Gradle编译脚本中 v7 mediarouter库 的依赖语句:

compile 'com.android.support:mediarouter-v7:24.2.1'
  • v7 palette library

该库提供了 palette类,使用这个类可以很方便提取出图片中主题色。比如在音乐App中,从音乐专辑封面图片中提取出专辑封面图片的主题色,然后将播放界面的背景色设置为封面的主题色,随着播放音乐的改变,播放界面的背景色也会巧妙的跟着改变,从而提供更好的用户体验。

Gradle编译脚本中 v7 palette库 的依赖语句:

compile 'com.android.support:palette-v7:24.2.1'
  • v7 recyclerview library

该库提供了 recyclerview类。这个库使用的频率很高,网上有很多文章介绍 recyclerview。

Gradle编译脚本中 v7 recyclerview库 的依赖语句:

compile 'com.android.support:recyclerview-v7:24.2.1'
  • v7 Preference Support library

这个库在设置界面常用到。提供了 CheckBoxPreferenceListPreference 等类。

Gradle编译脚本中 v7 preference support库 的依赖语句:

compile 'com.android.support:preference-v7:24.2.1'
v8 Support Library

v8支持库支持范围也是 Android 2.3 (API level 9) 及其以上版本。v8支持库集合中现在只有一个库。

  • v8 renderscript library

这个库支持渲染脚本计算框架。对这个库有兴趣可以看 渲染脚本开发指导

https://developer.android.com/guide/topics/renderscript/compute.html


使用 v8 renderscript库 Gradle编译脚本的配置方法:


defaultConfig {        renderscriptTargetApi 18        renderscriptSupportModeEnabled true
}
【※】v13 Support Library

v13支持库 适用范围是 Android 3.2 (API level 13) 及其以上版本。这个库跟 v4 fragment library 功能基本一样,也是提供兼容 fragment 相关内容。区别是 v4 fragment library 需要依赖 v4支持库 集合里的其它4个子库,而 v13 support library 依赖的是 Android 3.2 (API level 13) 及其以上版本 framework。

也就是说 v4 支持库除了 v4 fragment library 以外,其它功能都在 Android 3.2 (API level 13) 及其以上版本的 framework 中提供了。所以我们的App如果只需要兼容到Android 3.2,那么 fragment 部分使用 v13 Support Library 中的相关类才是明智之举。

Gradle编译脚本中 v13 support库 的依赖语句:

compile 'com.android.support:support-v13:24.2.1'
v14 Preference Support Library

功能类似 v7 Preference Support library,支持 Android系统版本 不一致,新增部分相关接口。

Gradle编译脚本中 v14库 的依赖语句:

compile 'com.android.support:preference-v14:24.2.1'
v17 Preference Support Library for TV

功能类似 v7 Preference Support library,支持Android系统版本不一致,新增部分相关接口,为电视设备App提供相应的UI。

Gradle编译脚本中的依赖语句:

compile 'com.android.support:preference-leanback-v17:24.2.1'
v17 Leanback Library

这也是在电视设备上使用的库,主要是和 YouTube 相关的。

Gradle编译脚本中 v17 Leanback库 的依赖语句:

compile 'com.android.support:leanback-v17:24.2.1'
Annotations Support Library

提供注解相关功能。

Gradle编译脚本中 Annotations Support库 的依赖语句:

compile 'com.android.support:support-annotations:24.2.1'

【※】Design Support Library

这个库现在使用的也比较多,它提供了 material design 设计风格的控件。如 navigation drawersfloating action buttons (FAB)snackbarstabs 等。

Gradle编译脚本中 Design Support库 的依赖语句:

compile 'com.android.support:design:24.2.1'
【※】Multidex Support Library

Android的单个.dex文件最多能引用65536个方法,在这之后的方法就无法引用了。当我们的方法数超过这个限制后就需要分成多个dex文件,该库就是用来支持多个dex文件构建应用程序的。

Gradle编译脚本中 Multidex Support库 的依赖语句:

compile 'com.android.support:multidex:1.0.0'
【※】Custom Tabs Support Library

这个库有很有意思,提供了一种新的打开网页的方式。以前的App要打开一个网页有两种选择,一个是用webview,这种方式工作量较大,第二种方式是调用浏览器应用来打开网页,这种方式要在两个应用中切换,用户的操作体验是割裂的,都不够理想。这个库提供了第三种选择,具体情况可以点击这篇文章:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0914/3449.html

Gradle编译脚本中 Custom Tabs Support库 的依赖语句:

compile 'com.android.support:customtabs:24.2.1'
Percent Support Library

百分比支持库提供了如 PercentFrameLayoutPercentRelativeLayout 布局,在这些布局中子view可以使用百分比来设置大小、位置等。

Gradle编译脚本中 Percent Support库 的依赖语句:

compile 'com.android.support:percent:24.2.1'
App Recommendation Support Library for TV

这个库是电视设备上用来提供视频内容推荐的。

Gradle编译脚本中Recommendation Support库的依赖语句:

compile 'com.android.support:recommendation:24.2.1'

选择使用支持包

其实在了解了支持包特性之后,这个问题也就迎刃而解了,这里再做下总结。在使用Android Support Library 之前我们需要通过 sdk manager 安装 Android Support Repository,然后再在 gradle编译脚本 中添加如下依赖语句就可以了:

//以v4为例
compile 'com.android.support:support-v4:24.2.1'

前面文章说过 gradle 中 jar依赖语句 格式如 compile jar文件组(group/命名空间):jar文件名(name):jar文件版本(version)。对于Android Support Library库 的依赖语句 jar文件名jar文件版本 两部分需要选择确定。

  • jar文件名:在选择之前要明确两件事,需要使用支持包的哪种特性、需要兼容的最低Android版本,然后就可以确定具体依赖哪个支持库。

  • jar文件版本:支持库的版本需要跟compileSdkVersion保持一致。

注意:由于依赖的支持库会打包进apk,所以官方推荐开发者在编译时使用ProGuard工具预处理release版本的apk。ProGuard工具除了混淆源代码外,还会移除那些依赖的支持库中没有使用到的类,达到apk瘦身的效果。

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都会有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

原创粉丝点击