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

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux升级或者切换python版本实现方式

《Linux升级或者切换python版本实现方式》本文介绍在Ubuntu/Debian系统升级Python至3.11或更高版本的方法,通过查看版本列表并选择新版本进行全局修改,需注意自动与手动模式的选... 目录升级系统python版本 (适用于全局修改)对于Ubuntu/Debian系统安装后,验证Pyt

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于