Android Support Library的前世今生

封面

在之前的开发经历中经常需要导入一些如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全部了,谢谢。如果文章有错误或者有疑问请务必留言告诉我。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 更多原创文章和优质资源请关注公众号: 网上对Android Support Library中各个依赖包介绍的中文资...
    张明云阅读 19,823评论 8 89
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,072评论 2 44
  • 如果说,相机是情人的眼睛,那么你一定觉得我很美。让我感觉到你是真的喜欢这个姑娘的^_^
    Yuki酱在到处之间阅读 407评论 0 0
  • 出发:(第一天) 还未尝试过和同班同学去浪的我们穿着满满的新鲜与期待感,拖着厚重的行李箱,一只脚前,一只...
    51鹿兮阅读 498评论 0 1