android开发中SDK相关的一列问题解析

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.0Android R11.030R2020/10/23
Android 10.0Android Q10.029Q2019/09/03
Android 9.0Pie9.028P2018/08/01
Android 8.1Oreo8.127OMr12017/12/01
Android 8.0Oreo8.026O2017/08/01
Android 7.1Nougat7.125NMr12016/12/01
Android 7.0Nougat7.024N2016/08/01
Android 6.0Marshmallow6.023M2015/08/01
Android 5.1Lollipop5.122LollipopMr12015/03/01
Android 5.0Lollipop5.021Lollipop2014/11/01
Android 4.4WKitkat Watch4.4W20KitKatWatch2014/06/01
Android 4.4Kitkat4.419KitKat2013/10/01
Android 4.3Jelly Bean4.318JellyBeanMr22013/07/01
Android 4.2-4.2.2Jelly Bean4.2-4.2.217JellyBeanMr12012/11/01
Android 4.1-4.1.1Jelly Bean4.1-4.1.116JellyBean2012/06/01
Android 4.0.3-4.0.4Ice Cream Sandwich4.0.3-4.0.415IceCreamSandwichMr12011/12/01
Android 4.0-4.0.2Ice Cream Sandwich4.0-4.0.214IceCreamSandwich2011/10/01
Android 3.2Honeycomb3.213HoneyCombMr22011/06/01
Android 3.1.xHoneycomb3.1.x12HoneyCombMr12011/05/01
Android 3.0.xHoneycomb3.0.x11HoneyComb2011/02/01
Android 2.3.3-2.3.4Gingerbread2.3.3-2.3.410GingerBreadMr12011/02/01
Android 2.3-2.3.2Gingerbread2.3-2.3.29GingerBread2010/11/01
Android 2.2.xFroyo2.2.x8Froyo2010/06/01
Android 2.1.xEclair2.1.x7EclairMr12010/01/01
Android 2.0.1Eclair2.0.16Eclair012009/12/01
Android 2.0Eclair2.05Eclair2009/11/01
Android 1.6Donut1.64Donut2009/09/01
Android 1.5Cupcake1.53Cupcake2009/05/01
Android 1.1Base1.12Base112009/02/01
Android 1.0Base1.01Base2008/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的手机用户使用会出问题,这种情况通常有以下几种解决方式

  1. 寻找可替换的库函数来实现相同功能
  2. 将build.gradle的minSdkVersion改成24
  3. 查找支持库有没有该库函数,比如上述这个问题就是引用了java.util.function.Consumer,而这个库函数是安卓7.0才引入的,因此可以直接使用androidx.core.util.Consumer来实现(两者实现是一样的,需要引入androidx支持库)

7.既然支持库提供了很多的未来的库函数,那么是否可以将minSdkVersion设置的比较低?
不建议,一方面高版本的sdk会发布更多优化的逻辑和库函数,另一方面并不是所有库函数都有放置到支持库中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值