本文主要是记录Android的各个版本的大体Api变更情况,主要是从5.0以及之后的开始,之前的现在的主流App基本也不会去兼容了,本文是主要记录对日常开发较为重要的点,并非都记录。除了下面的功能之外,还有一些webview优化,引入AI,无障碍,性能优化等的一些没有记录。
sdk与系统版本的对应关系
版本的别名(即Build.Version
),sdk版本号,与Android版本的对应
别名 | sdk版本 | 系统版本 |
---|---|---|
S | 31 | 12 |
R | 30 | 11 |
Q | 29 | 10.0 |
P | 28 | 9.0 |
O_MR1 | 27 | 8.1 |
O | 26 | 8.0 |
N_MR1 | 25 | 7.1 |
N | 24 | 7.0 |
M | 23 | 6.0 |
LOOLLIPOP_MR1 | 22 | 5.1 |
LOOLLIPOP | 21 | 5.0 |
Android 5.0
官方文档:Android 5.0 API,Android 5.1 API, 5.0行为变更
- 废弃Dalvik,引入ART(Android Runtime),前者是每次运行都需要执行转换机器码操作,安装快运行慢,后者是首次安装字节码预先转换为机器码,启动的时候无须转换,安装慢运行快,占用存储空间较大。
- 引入
Material Design
材料组件,比如CardView
,RecycleView
等 bindService
需要显式Intent启动,即要么通过setComponent
或者是Inten初始化的时候设置进去,而不是通过setAction
等方式。- 电池优化
- 通知栏优化
Android 6.0
官网地址:Android 6.0 API,Android 6.0 变更
- 支持指纹
- 危险权限需要申请,不只是清单文件添加即可,关于权限申请后续再出一篇文章去分析
- 引入低电耗和应用待机模式(对一些需要保活的应用有影响,后续出一篇保活相关的文章),官网地址:针对低电耗模式和应用待机模式进行优化
- 低电耗,DOZE模式:设备不在充电,并且关闭屏幕一段时间会进入该模式,限制应用访问占用大量网络和CPU资源,还会阻止应用访问网络,延迟作业,同步和标准闹钟,无论应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供剪短的维护窗口,在这个窗口期间,应用程序可以访问网络并执行任何之前被推迟的作业
- 暂停访问网络
- 系统忽略唤醒锁定
- 标准的AlarmManger推迟到下一个维护期,使用
setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
设置重要闹钟,而且他们的间隔不能超过9min - 系统不执行WLAN扫描
- 不允许运行同步适配器
- 不允许运行JobScheduler
- and so on
- 应用待机模式:当用户有一段时间为触摸应用时,系统就会判定应用处于闲置状态,进入该模式的时候,设备不再充电状态,该应用会被暂停网络和同步操作。有以下条件不会使得应用进入待机模式
- 用户明确启动应用,
- 应用当前有一个进程在前台运行(有Activity或者是前台的Service(比如通知栏绑定的Service))
- 应用生成用户可在锁定屏幕或者通知栏看得到的通知
- 应用是正在使用的设备管理应用
- 低电耗,DOZE模式:设备不在充电,并且关闭屏幕一段时间会进入该模式,限制应用访问占用大量网络和CPU资源,还会阻止应用访问网络,延迟作业,同步和标准闹钟,无论应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供剪短的维护窗口,在这个窗口期间,应用程序可以访问网络并执行任何之前被推迟的作业
- 取消支持Apache Http客户端,建议使用
HttpURLConnection
Android 7.0
官网地址:Android 7.0 API,Android 7.1 API,Android 7.0 行为变更
- 继续优化了点电耗和应用待机模式
- 移除3项系统广播,这些以前在清单文件注册既可监听到的,目前已经无法监听到,包括
- CONNECTIVITY_ACTION,新版本只能在应用前台手动注册的BroadcastReceiver可以在主线程接受到
- 无法接受到ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO
- 危险权限的再次优化,提高私有文件的安全性
- 应用共享文件使用FileProvider,即我们无法主动共享给外部以
file://
开发的方式的文件,而是需要通过content://
方式(比如启动系统相机拍照,图片保存到自己应用的目录,这样的逻辑7.0需要修改),这块后续单独分享一篇文章,推荐阅读Android的FileProvider使用解释。 - Android7.1增加了桌面长按的快捷方式
Android 8.0
官网地址:Android 8.0 功能和 API,Android 8.0 行为变更,Android 8.1 功能和 API
- 通知栏改变,官网地址:通知概览,增加通知渠道,每一个通知都必须有一个渠道,后续可以新增一篇文章讲解一下,
- TextView 支持自动调整字体大小,自动调整 TextView 的大小
- 支持设置垂直和水平的margin和padding
JobScheduler
改进优化findViewById
支持泛型- 后台执行限制,这是一个比较大的改动,修复了之前Android系统可以有不死进程的问题。
- 后台 Service 限制,首先是如何区分前台和后台,下面情况视为前台,除此之外的都是后台
- 具有可见的Activity
- 具有前台Service
- 另一个应用关联到了该应用,比如通过跨进程的方式还是使用当前应用的ContentProvider,例如另外一个应用绑定到了该应用的Service,则该应用处于前台
- IME
- 壁纸
- 通知监听器
- 语音或者是文本Service
- 当应用在前台的时候,可以创建和运行Service,进入后台的数分钟之内仍然可以这么做,但是数分钟之后应用会被视为空闲状态,系统会停止后台应用运行,就像调用了
Service.stopSelf()
一样。 - 在后台需要重新创建Service的时候,如果调用了
startService
回报一个ANR,需要使用startForegroundService()
,并且需要在Service中创建一个可见的通知栏,这块后续在编写文章去分析,是8.0很重要的一点,影响了我们对Service的使用和保活方面的代码。
- 后台 Service 限制,首先是如何区分前台和后台,下面情况视为前台,除此之外的都是后台
- 广播限制,8.0对大多数的系统广播无法通过清单注册实现监听,只能通过动态注册的方式,还可以豁免的可以查看这个列表:隐式广播例外情况
- 后台位置受限,为了降低耗电量,会对应用获取用户位置信息的频率进行限制,每小时仅能获取几次。如果应用必须实时获取用户的位置,那么就应该把应用设置为前台应用,使用
startForegroundService()
。当然如果应用是在前台运行,那么他的获取频率是跟之前一样的。
Android 9.0
- 支持wifi室内定位
- 通知优化
- 动画优化,引入
AnimatedImageDrawable
,用于绘制Gif
和webP
- 提供
PrecomputedText
对TextView做出优化,可以参考PrecomputedTextCompat用法及原理 - JobScheduler API增加
Android10
面向开发者的 Android 10,Android 10 功能和 API
- 隐私加强
- 存储分区,从外部存储空间访问
- 增加用户对于位置权限的控制,请求位置信息更新,新增的后台权限需要与其他权限分开请求。这里后续会再写一篇文章分析。
- 后台启动Activity限制,从后台启动 Activity 的限制,解决方案:显示有时效性的通知
- 访问IMEI限制,对不可重置的设备标识符实施了限制
- 剪贴板限制:除非应用处于输入法的焦点,否则无法获取
- 访问WLAN,WLAN感知和蓝牙扫描需要精确位置权限,一些电话 API、蓝牙 API 和 WLAN API 需要精确位置权限
- 限制非sdk接口,即无法再通过反射去修改一些系统的api参数,针对非 SDK 接口的限制,这一块后续会出一片文章分析
- 通知增强
- 支持深色主题
- 手势导航,支持全屏模式
- 支持设置面板(针对wlan)
- 共享快捷方式
Android 11
- 增加一次性权限,对位置,麦克风,和摄像头等用户可以给与一次临时性的权限
- 权限对话框的可见性,增加
不在询问
选项 - 系统提醒窗口变更,系统会自动向具有 ROLE_CALL_SCREENING或者是通过 MediaProjection 截取屏幕的所有应用自动授予SYSTEM_ALERT_WINDOW权限而无需申请。
ACTION_MANAGE_OVERLAY_PERMISSION
在Android11开始,始终会将用户转至顶级设置屏幕,用户可以授予或者取消悬浮窗权限,intent中任何package数据都会被忽略,低于android11的,ACTION_MANAGE_OVERLAY_PERMISSION
可以指定一个package,而且是必须由用户选项需要授予或者取消那些英语权限,这一块后续再写一篇分析。 - 电话号码:增加
READ_PHONE_NUMBERS
权限而不是READ_PHONE_STATE
权限。 - JobScheduler Api条用限制调试
- 非sdk接口列表更新,非 SDK 接口限制
Android12
- 引入Material You
- 蓝牙权限更新
- 自定义通知优化
- 大致位置,用户可以要求应用仅仅获取大致位置信息
- 应用休眠
- 性能方面
- 前台服务启动限制
- 精确的闹钟权限
- 听哟女性为变更
- 非sdk限制更新