Android 版本platform 与api的对应关系

2024-06-17 16:38

本文主要是介绍Android 版本platform 与api的对应关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

API Level和版本有如下对应关系

 

 
Code nameVersionAPI level
Marshmallow6.0API level 23
Lollipop5.1API level 22
Lollipop5.0API level 21
KitKat4.4 - 4.4.4API level 19
Jelly Bean4.3.xAPI level 18
Jelly Bean4.2.xAPI level 17
Jelly Bean4.1.xAPI level 16
Ice Cream Sandwich4.0.3 - 4.0.4API level 15, NDK 8
Ice Cream Sandwich4.0.1 - 4.0.2API level 14, NDK 7
Honeycomb3.2.xAPI level 13
Honeycomb3.1API level 12, NDK 6
Honeycomb3.0API level 11
Gingerbread2.3.3 - 2.3.7API level 10
Gingerbread2.3 - 2.3.2API level 9, NDK 5
Froyo2.2.xAPI level 8, NDK 4
Eclair2.1API level 7, NDK 3
Eclair2.0.1API level 6
Eclair2.0API level 5
Donut1.6API level 4, NDK 2
Cupcake1.5API level 3, NDK 1
(no code name)1.1API level 2
(no code name)1.0API level 1

 

 

Android版本分布图- 2015-04

 

先说一下minSdkVersion的用处:
新版本中public了老版本没有的接口,如果我写的一个App中用到了只有新版本才有的接口,肯定不能让它跑在老版本SDK上,不然会报错。 Android是如何保证这一点的?靠定义minSdkVersion来实现。 比如,如果我定义了<uses-sdk android:minSdkVersion="8"  ... />, 编译生成的apk是无法安装到Android 2.1(API Level 7)系统上的,系统会提示: ERROR: Application requires API version 8. Device API version is 7。

AndroidManifest.xml中如果不写,缺省 minSdkVersion = 1, 表示程序至少能安装到,并且作者也希望它能跑到Android 1.0上。

接下来说一下targetSdkVersion的用处:
一般而言,新版本要兼容老版本,这就是为什么Android中很多接口即使过时了(deprecated)但还依然保留在新SDK中,所以绝大多数情况下,为老版本开发的应用可以运行在新版SDK上。但是也有一些例外,主要是以下三类问题:

1. 老接口被删除或修改了(这种case有,但很少),本文不关注
2. 同样的接口,但新老版本的实现有所不同。比如有一些API早期设计时考虑不周全,新版本做了改进。
3. 即使不涉及任何接口调用,但由于物理设备的扩展,同样的apk需要在新版本上需要适配更多的物理设备,从而具备了新的特性

对于第二类问题,指定targetSdkVersion为具体的某个API Level,则表示调用接口时只会调用该版本实现的API,而不是早期版本的API。
对于第三类问题,就是这封信碰到情况,Google从开发Android 1.6 (API Level 4)开始意识到,程序运行时需要考虑到手机屏幕大小、分辨率不同。因此从1.6开始引入了针对多屏幕的支持,定义了不同屏幕尺寸与分辨率、密度的一个对应关系。注意到此前google只意识到会在中密度屏幕(mdpi)下开发,所以1.5以及以前版本的图片图标等资源、布局都是按照中密度屏幕设计的。

 

从Android 1.6开始,Google提供了多套资源(ldpi, mdpi, hdpi) 支持,对内置应用以及Framework的资源(比如控件),系统可以在编译时刻决定只打包某个特定密度的资源(定义在PRODUCT_LOCALES中,对N1,应该是PRODUCT_LOCALES := hdpi ...)。

对基于SDK开发的应用,eclipse缺省会打包所有密度的资源,在Android 1.6之后的版本上跑,会在运行时刻根据物理设备实际密度来选择对应密度的资源。


如果某个App中定义的targetSdkVersion <= 3, , 表示该App无法用到Android 1.6才有的多屏幕支持能力, 所以即使应用本身包含了hdpi,mdpi,ldpi资源,但运行到hdpi的物理设备上时只会去加载mdpi的资源,当然显示就不正常了。
注意:如果App中也用到的系统级资源(比如控件),一般来说特定的物理设备只可能是hdpi,mdpi, ldpi (以后会有扩展,比如xdpi)中的一种,所以只会加载那唯一的一种dpi资源,因此显示系统控件本来不应该有任何问题。不过,如果Image没有优化,而是包含了所有资源,那么控件显示也会不正常 。

 

 

 

再回到正题上来,为什么eclipse下编译的程序运行起来和ubuntu下编译的显示效果不同?

在ubuntu下编译,系统认为你编译的是内置应用,内置应用在正常情况下不会被变态的人扒出来放到其他设备上去,所以不存在安装兼容性问题,minSdkVersion缺省就是当前物理设备的current sdk version。另外既然是内置应用,当然运行在当前物理设备上效果最好,所以targetSdkVersion缺省也是当前物理设备的current sdk version。这个在编译时刻打包apk时,build system首先检测这两个值有没有设置,没设置的话它会替你加上。 

在eclipse下编译,系统认为你编译的是第三方应用,忘了写就是你的错了,minSdkVersion和targetSdkVersion缺省都是1,所以会出现上面说到的悲剧。

结论:
1. 对内置应用,不要自己去设置minSdkVersion和targetSdkVersion;
2. 基于SDK开发的,根据自己的实际情况,一定要设置minSdkVersion和targetSdkVersion;
3. 刚刚没说maxSdkVersion,我们别定义它,以后可能会OTA升级整个Android系统,定义了它对我们是个悲剧

 

 

 

 

 

这篇关于Android 版本platform 与api的对应关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069982

相关文章

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3