1.SDK和Android SDK的关系?
SDK(Software Development Kit, 软件开发工具集)是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合,这是一个很广义的概念,而Android sdk(software development kit)是提供给Android开发者调用google提供的Api的工具集,里面包含了android提供的api源码,编译工具等,具体可以看Android SDK目录结构,android.jar及其内部结构。
2.平时开发中调用的库函数和SDK有什么关系?
SDK有一个文件叫android.jar,平时安卓开发中所调用的库大多数在这个文件中。
3.为什么看源码经常发现很多方法是没有具体实现的,那apk怎么运行?
需要注意的是,开发的时候调用了android.jar中的库函数,但是编译好的apk并不包含android.jar。实际上Android系统的Framework框架层已经包含的大多数android.jar的代码,可以理解为android.jar的源码只是framework.jar中的子集,android.jar包含了很多@hide的类,这些类在android.jar相当于一个壳,实际的代码实现都在framework.jar。
综上,也就不难理解了为什么安卓调试需要通过虚拟机,因为apk还有很多源码是缺失的,只有在运行时framework.jar被链接到应用的进程中,应用才能正常启动运作,还有一点就是Android SDK中并不包含安卓的虚拟机。
简单来说编程工具(AndroidStudio等)是引用SDK中的android.jar,这个包里没有hide和internal相关的类、属性和方法的,它是个删减版。当app开发完成装到手机上或虚拟里运行时,引用的却是framework.jar,这个包是完整版
4.我们平时听到的android系统版本和sdk的关系是怎么样的?
如下图,设备固件版本就是平时所说的Android的版本(比如安卓8.0),sdk和系统版本是一一对应关系,从上面的分析也可以理解,每次发布新的系统版本,那么系统中的framework.jar和sdk中的android.jar的接口肯定要对应上
平台版本 | 名称 | 版本号 | API等级 | BuildVersion | 发布时间 |
---|---|---|---|---|---|
Android 11.0 | Android R | 11.0 | 30 | R | 2020/10/23 |
Android 10.0 | Android Q | 10.0 | 29 | Q | 2019/09/03 |
Android 9.0 | Pie | 9.0 | 28 | P | 2018/08/01 |
Android 8.1 | Oreo | 8.1 | 27 | OMr1 | 2017/12/01 |
Android 8.0 | Oreo | 8.0 | 26 | O | 2017/08/01 |
Android 7.1 | Nougat | 7.1 | 25 | NMr1 | 2016/12/01 |
Android 7.0 | Nougat | 7.0 | 24 | N | 2016/08/01 |
Android 6.0 | Marshmallow | 6.0 | 23 | M | 2015/08/01 |
Android 5.1 | Lollipop | 5.1 | 22 | LollipopMr1 | 2015/03/01 |
Android 5.0 | Lollipop | 5.0 | 21 | Lollipop | 2014/11/01 |
Android 4.4W | Kitkat Watch | 4.4W | 20 | KitKatWatch | 2014/06/01 |
Android 4.4 | Kitkat | 4.4 | 19 | KitKat | 2013/10/01 |
Android 4.3 | Jelly Bean | 4.3 | 18 | JellyBeanMr2 | 2013/07/01 |
Android 4.2-4.2.2 | Jelly Bean | 4.2-4.2.2 | 17 | JellyBeanMr1 | 2012/11/01 |
Android 4.1-4.1.1 | Jelly Bean | 4.1-4.1.1 | 16 | JellyBean | 2012/06/01 |
Android 4.0.3-4.0.4 | Ice Cream Sandwich | 4.0.3-4.0.4 | 15 | IceCreamSandwichMr1 | 2011/12/01 |
Android 4.0-4.0.2 | Ice Cream Sandwich | 4.0-4.0.2 | 14 | IceCreamSandwich | 2011/10/01 |
Android 3.2 | Honeycomb | 3.2 | 13 | HoneyCombMr2 | 2011/06/01 |
Android 3.1.x | Honeycomb | 3.1.x | 12 | HoneyCombMr1 | 2011/05/01 |
Android 3.0.x | Honeycomb | 3.0.x | 11 | HoneyComb | 2011/02/01 |
Android 2.3.3-2.3.4 | Gingerbread | 2.3.3-2.3.4 | 10 | GingerBreadMr1 | 2011/02/01 |
Android 2.3-2.3.2 | Gingerbread | 2.3-2.3.2 | 9 | GingerBread | 2010/11/01 |
Android 2.2.x | Froyo | 2.2.x | 8 | Froyo | 2010/06/01 |
Android 2.1.x | Eclair | 2.1.x | 7 | EclairMr1 | 2010/01/01 |
Android 2.0.1 | Eclair | 2.0.1 | 6 | Eclair01 | 2009/12/01 |
Android 2.0 | Eclair | 2.0 | 5 | Eclair | 2009/11/01 |
Android 1.6 | Donut | 1.6 | 4 | Donut | 2009/09/01 |
Android 1.5 | Cupcake | 1.5 | 3 | Cupcake | 2009/05/01 |
Android 1.1 | Base | 1.1 | 2 | Base11 | 2009/02/01 |
Android 1.0 | Base | 1.0 | 1 | Base | 2008/10/01 |
5.compileSdkVersion作用是什么?
当在 build.gradle 设定 compileSdkVersion 为 27 时,apk在编译的时候就会去 $ANDROID_SDK/platforms/android-27/ 目录寻找android.jar 文件,把这个 JAR 添加到编译时类路径中。
在编译 Java 代码时,会根据这个 android.jar 的内容来解析所有对 Android SDK 中成员的引用。同时在运行时有将framework.jar链接到应用的进程中。
6.开发中碰到Class requires API level 24(current min is 21)是什么情况?
上面这个提示说明当前工程在build.gradle文件中指定的minSdkVersion为21,而使用了24版本才引入的库函数,从上面的对照图来看,也就是说配置文件中指定当前功能最低能支持安卓5.0的系统,但是这里使用了安卓7.0才加入的接口,因此如果安卓5.0到7.0的手机用户使用会出问题,这种情况通常有以下几种解决方式
- 寻找可替换的库函数来实现相同功能
- 将build.gradle的minSdkVersion改成24
- 查找支持库有没有该库函数,比如上述这个问题就是引用了java.util.function.Consumer,而这个库函数是安卓7.0才引入的,因此可以直接使用androidx.core.util.Consumer来实现(两者实现是一样的,需要引入androidx支持库)
7.既然支持库提供了很多的未来的库函数,那么是否可以将minSdkVersion设置的比较低?
不建议,一方面高版本的sdk会发布更多优化的逻辑和库函数,另一方面并不是所有库函数都有放置到支持库中