封面

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

(本文出处 @都有米:http://www.jianshu.com/p/f5f9a4fd22e8)

为了解开这些疑问,周末在家仔细阅读了官方的开发者指导文档的相关内容。这篇文章就是读后整理的读书笔记。最新的Android Support Library版本。

Android官方为什么要提供支持包?

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

Android版本

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

  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)对外提供的接口。

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

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

官方提供了哪些支持包,都有哪些特性?

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

Android Support Library
【※】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个子库。

support-v4
  • 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拆分这篇文章有介绍,有兴趣的可以点过去看看。
    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相关,如ActionBarAppCompatActivity、Theme等。
    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
    这个库支持渲染脚本计算框架。对这个库有兴趣可以看渲染脚本开发指导。
    使用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编译脚本中v 库的依赖语句:

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

功能类似v7 Preference Support library,支持Android系统版本不一致,新增部分相关接口,为电视设备App提供相应的UI。
Gradle编译脚本中v 库的依赖语句:

  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 drawers、floating action buttons (FAB)、snackbars、tabs等。
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,这种方式工作量较大,第二种方式是调用浏览器应用来打开网页,这种方式要在两个应用中切换,用户的操作体验是割裂的,都不够理想。这个库提供了第三种选择,具体情况可以点击这篇文章了解。
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编译脚本中添加如下依赖语句就可以了。

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

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

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

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

结束

以上就是关于Android Support Library全部了,谢谢。如果文章有错误或者有疑问请务必留言告诉我。

更多相关文章

  1. Android平台上最好的几款免费的代码编辑器
  2. Android网络电台的一种实现方案
  3. Android(安卓)studio 导入module 依赖第三方库
  4. AutoCAD即将为Android智能手机和平板电脑推出免费客户端
  5. Android平台上最好的几款免费代码编辑器
  6. Android系统架构学习笔记
  7. Android快速开发工具库xUtils 1.0发布,针对混淆优化,orm,view注解..
  8. 一款现代、高效的 Android(安卓)图片压缩框架
  9. Android(安卓)编译文件使其支持wml

随机推荐

  1. android权限管理之PermissionsDispatcher
  2. Android的路接下来该怎么走?
  3. android sqlite 操作 说明 记录
  4. android设置背景
  5. Android上的滤镜效果
  6. cocos2dx android
  7. Android函数重构(MVC)
  8. Android Service创建USB HOST通信
  9. Android(安卓)ApiDemos示例解析(117):Vie
  10. Android进阶知识树——Android系统的启动