随着 Android 的发展,每个新版本的 Android 都带来了新的 API 和 改进。这篇文章将介绍从 Android 5 开始到最新版 Android 的API及其行为的变更。
Android 5 Lollipop
Android 5有两个版本,分别是 5.0 和 5.1,分别对应 API 21 和 API 22。Android 5 的API及其行为的变更有:
- Android Runtime (ART)
在 Android 5.0 中,ART 运行时取代了 Dalvik 成为平台默认运行时。ART 的新功能有:
- 预先 (AOT) 编译
- 改进的垃圾回收 (GC)
- 改进的调试支持
- 通知改进
在 Android 5中,通知可以在锁屏时出现,同时来电等重要通知提醒会显示在浮动通知 中,这是一个小浮动窗口,让用户无需离开当前应用即可响应或关闭通知。对于媒体播放和通知跳转等功能增加了 Notification.MediaStyle
模块。
- "概览"屏幕支持显示多个来做同一个应用的activity
"最近使用的应用"屏幕,也称为"概览"屏幕,表示近期任务 或"最近用过的应用"屏幕,这是系统级界面,其中会列出 activity 和 tasks。 用户可以浏览列表、选择某个任务 恢复任务,或者通过滑开任务将其从列表中移除。
在 Android 5 中,我们可以通过 documentLaunchMode
属性来让最近屏幕显示多个来做同一个应用的activity。如上图所示,Google 云端硬盘应用的两个 Activity 显示在最近屏幕上,并且每个 Activity 展示不同的内容。
- Android NDK 支持 64 位支持
Android 5.0 引入了对 64 位系统的支持。64 位增强功能可增加地址空间并提升性能,同时仍完全支持现有的 32 位应用。
- OpenGL ES 3.1 的支持
Android 5.0 添加了 Java 接口和对 OpenGL ES 3.1 的原生支持。
- 引入了新的 Camera2 API
Android 5.0 引入了新的 android.hardware.camera2
API 来简化精细照片采集和图像处理。
详情可以看 Android Lollipop 官方文档
Android 6 Marshmallow (API 23)
Android 6 的API及其行为的变更有:
- 运行时权限
Android 6 引入了运行时权限,用户可以在运行时授予或拒绝权限。checkSelfPermission()
方法用来确定应用是否已获得权限; requestPermissions()
方法用于请求权限。即使应用并不以 Android 6.0(API 级别 23)为目标平台,我们也应该在新权限模式下测试应用。
- 休眠(Doze)模式和应用待机模式
在 Android 6.0 开始引入了两项省电功能,分别是休眠和应用待机。其中休眠是针对系统的,触发条件是设备静止、屏幕关闭、未连接电源;而应用待机则是针对应用的,触发条件是当用户有一段时间未触摸应用。
在休眠(Doze)模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。它还会阻止应用访问网络,并延迟其作业、同步和标准闹钟。
- 支持文本选择
如上图所示,当用户在应用中选择文本时,可以在浮动工具栏中显示文本选择操作。
- 指纹身份验证
Android 6 中引入了指纹认证API,该 api 的相关示例可以见 BiometricAuthentication
更多关于 Android 6 的特点可以看 Android 6.0 Marshmallow 官方文档
Android 7 Nougat
Android 7有两个版本,分别是 7.0 和 7.1,分别对应 API 24 和 API 25。Android 7 的API及其行为的变更有:
- 多窗口支持
如上图所示,在 Android 7中,引入了多窗口的支持,允许用户屏幕上同时弹出两个应用。
- 增强了通知的功能
在 Android 7中重新设计了通知,让其变得更简单。更新功能有:
- 直接回复,可以添加直接在通知中回复消息或输入其他文字的操作。
- 系统可以将消息分组 (例如按消息主题),以及显示相应群组
- 重新设置了通知模板样式
- 加强了休眠模式
在 Android 6中,需要设备处于静止状态才会进入休眠模式。而在 Android 7中,只要屏幕关闭一段时间且设备未接通电源,就会进入休眠模式,并对应用施加 CPU 和网络限制。 这意味着,即使用户随身携带设备,也可以节省电量 。
- 移除 CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和 ACTION_NEW_VIDEO 三个隐式广播
后台进程可能会耗费大量内存和电池电量。例如,某一隐式广播可能会启动许多已注册监听它的后台进程,即使这些进程可能并没有执行很多任务。这会对设备性能和用户体验产生重大影响。
因此在 Android 7 中移除了 CONNECTIVITY_ACTION(用于通知网络连接状态的变化)、ACTION_NEW_PICTURE(用于通知新图片的添加) 和 ACTION_NEW_VIDEO(用于通知新视频的添加) 这三个隐式广播。其中 CONNECTIVITY_ACTION 可以通过动态注册广播接收到,其他两个则静态和动态注册的都无法收到。
- SurfaceView
在 Android 7中,对 SurfaceView 做了优化,让其电量的消耗更少。因此从 Android 7开始,建议使用 SurfaceView 而不是 TextureView。
- Vulkan
Vulkan 是新一代的 3D 渲染库,提供了更高性能的3D图形渲染。在 Android 7 中我们可以使用它来代替 OpenGL ES。
- Art 支持 AOT 和 JIT 结合使用
JIT 是一种动态编译技术,在应用运行时将字节码编译为机器码。AOT 是一种预先编译技术,在应用安装时将字节码(DEX 文件)直接编译为机器码
在 Android 5 以前,Dalvik 虚拟机使用 JIT。而在 Android 5 中,替换成了 ART 虚拟机,ART 虚拟机则依赖 AOT 编译。
在 Android 7 及其以后,支持 AOT 与 JIT 结合使用。即安装时部分代码进行 AOT 编译,加快启动速度。运行时 JIT 编译热点代码。设备空闲时,ART会根据 JIT 的热点代码进行 AOT 编译。
AOT 与 JIT 结合使用的最大好处是,加快了应用程序安装和系统更新的速度。比如之前大型应用在 Android 6中需要几分钟安装,而现在只需要几秒即可。
- 支持应用快捷方式
- 支持签名方案 v2
Android 7.0 引入了 APK Signature Scheme v2,这是一种新的应用签名方案, 可缩短应用安装时间,增强防范未经授权的行为 对 APK 文件的更改。
更多关于 Android 7 的特点可以看 Android 7.0 Nougat 官方文档
Android 8 Oreo
Android 8 有两个版本,分别是 8.0 和 8.1,分别对应 API 26 和 API 27。Android 8 的API及其行为的变更有:
- 画中画模式
如图所示,Android 8.0 支持 activity 在画中画(PIP)模式中运行,主要应用于视频播放。
- 通知
Android 8.0 中对通知进行了重新设计,通知修改有:
- 通知渠道:是一种将通知分类管理的机制。开发者可以为不同类型的通知创建不同的渠道,用户可以根据渠道单独管理通知的行为(如声音、振动、重要性等)。
- 通知圆点:提醒用户有未读通知,提升通知的可见性。
- 通知延后:通知延后允许用户将某个通知暂时隐藏,并在指定的时间后重新显示。
- 通知超时:允许开发者设置通知的显示时间,超过时间后通知会自动消失。
在 Android 8.1 中,应用每秒只能发出一次通知提醒。如果一秒内有两次通知,那么只有第一次的通知会有提示音提醒一次,后面的会正常通知但是没有提示音提醒。
- 可下载字体
Android 8.0 允许开发者从供应商获取可下载字体资源,而无需将字体绑定到 APK 中。供应商和 Android 支持库负责下载字体,并将这些字体分享到各个 App 中。同样的操作也可用于获取表情资源,让应用不再止步于设备内置表情包。
由于国内手机厂商比较多,没有一个统一的Android手机生态(众所周知的原因,Google Play服务国内无法使用),所以必须自己搭建一套字体提供程序,因此比较麻烦。
如果想要使用可下载字体功能,具体可见 官方文档
- 自适应图标
自适应图标是 Android 8.0 引入的一项重要特性,其主要作用是:统一应用图标的外观,确保在不同设备上显示一致;支持动态效果,提升用户体验;提升主屏幕的视觉一致性。效果如下所示:
- 固定快捷方式
在 Android 8中可以把快捷方式固定在桌面上上,如下图所示:
- Neural Networks API
Android 8.1 推出了神经网络 API,具体可以看Neural Networks API
- SharedMemory API
SharedMemory
是 Android 8.1 中新引入的 api,用于在进程之间共享内存。相对 MemoryFile
,SharedMemory
能更灵活地访问和控制共享内存区域。
更多关于 SharedMemory
,可以看 Ashmem(Android共享内存)使用方法和原理
- Bitmap内存的存放位置变更
在Android 8.0以前,图片的宽高数据和像素数据都保存在Java层。从Android 8.0开始,Java层只保存图片的宽高数据,图片的像素数据保存在Native层,不再占用Java Heap内存。
- 后台执行限制
Android 8.0 会限制后台应用可以执行的操作。应用在两个方面受到限制:
- 后台服务限制:当应用处于空闲状态时,其对后台服务的使用受到限制。这不适用于对用户更明显的前台服务。
- 广播限制:除了少数例外情况外,应用无法使用其清单注册隐式广播。它们仍然可以在运行时注册这些广播,并且可以使用清单注册显式广播和专门针对其应用的广播。
具体的限制内容可以看 后台执行限制
- 后台位置限制
为降低耗电量,Android 8.0 会对应用在后台运行时检索用户当前位置信息的频率进行限制。在这些情况下,应用每小时只能接收几次位置信息更新。具体的限制内容可以看 后台位置限制
更多关于 Android 8 的特点可以看 Android 8 官方文档
Android 9.0 Pie (API 28)
Android 9 的API及其行为的变更有:
- 室内定位
在 Android 9 中添加了 Wifi RTT 的支持,应用可以使用 RTT API 来实现室内定位的功能。
- 刘海屏支持
在 Android 9中提供了无边框屏幕、刘海屏的支持。我们可以提供 getDisplayCutout
来确定是否有刘海屏的存在。使用 DisplayCutout
类则可以让我们找出非功能区域的位置和形状。
- 通知增强
- 增强即时通讯体验
- 可以屏蔽渠道组
- 新增广播类型
在 Android 9 之前,已暂停的应用发出的通知会被取消。 从 Android 9 开始,已暂停的应用发出的通知将一直隐藏,直到 应用恢复运行。
具体见 Android 9 通知增强
- 多摄像头支持
在 Android 9 中,支持同时访问多个摄像头。
- 针对非 SDK 接口的限制
从 Android 9(API 级别 28)开始,Android 平台对应用能使用的非 SDK 接口实施了限制。只要应用引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,这些限制就适用。
更多信息可以看 针对非 SDK 接口的限制
- 签名方案v3
Android 9 增加了对 APK 签名方案 v3 的支持。v3支持密钥轮换,并增强了安全性。V3 签名方案与 V1 和 V2 完全兼容,即使设备不支持 V3,仍然可以使用 V1 或 V2 进行验证
- 旋转锁定
Android 9 增加了新的旋转锁定的旋转模式。如下图所示:
更多旋转相关信息可以看屏幕旋转更改
- ImageDecoder
Android 9 引入了 ImageDecoder
类,它提供了一种现代化的图像解码方法。
- 文本API提供了更多支持
- 改进了 PrecomputedText 类
- 提供了
Magnifier
,用于实现放大镜功能 - Android 9 增强了 TextClassifier 类, 该模型利用机器学习来识别所选文本中的某些实体, 提供操作建议。例如,TextClassifier 可让应用检测用户已选择电话号码。这样应用就可以让用户使用该号码拨打电话。
- 前台服务
在 Android 9中,前台服务需要申请 FOREGROUND_SERVICE
权限
- 隐私权变更
为了加强用户隐私保护,Android 9 引入了多项行为变更,例如限制后台应用对设备传感器的访问权限、限制从 Wi-Fi 扫描检索的信息,以及与通话、手机状态和 Wi-Fi 扫描相关的新权限规则和权限组。
更多关于隐私变更的信息,可以看 隐私变更
- 电源管理
在 Android 9中,引入了应用待机分组机制,将应用根据用户的使用模式分为不同的优先级组(Buckets),每个组有不同的资源限制和唤醒策略。
同时 Android 9 对省电模式进行了改进,比如系统会更积极地将应用置于应用待机模式,而不是等待应用进入空闲状态。
应用待机分组包括:
- 活跃(Active) :用户正在使用的应用。
- 工作集(Working Set) :用户经常使用但当前未在前台的应用。
- 常用(Frequent) :用户定期使用但不频繁的应用。
- 罕见(Rare) :用户很少使用的应用。
- 限制(Restricted) :长时间未使用且可能被限制后台活动的应用。
更多关于 Android 9 的特点可以看 Android 9 官方文档
Android 10 (API 29)
Android 10 的API及其行为的变更有:
- 可折叠设备的支持
在 Android 10 中,提供了对可折叠设备的支持。我们可以使用 Jetpack WindowManager 库为可折叠设备的窗口功能(如折叠边或合页)提供了一个 API surface,让应用具备折叠感知能力。
关于折叠屏的适配具体可见 了解可折叠设备
- 5G
Android 10 新增了针对 5G 的平台支持。可以使用 ConnectivityManager 来检测设备是否具有高带宽连接,还可以检查连接是否按流量计费。
- 深色主题
Android 10 新增了一个系统级的深色主题,非常适合光线较暗的场景并能帮助节省电量。
- 手势导航
Android 10 引入了全手势导航模式,该模式不显示通知栏区域,允许应用使用全屏来提供更丰富、更让人沉浸的体验。它通过边缘滑动(而不是可见的按钮)保留了用户熟悉的"返回""主屏幕"和"最近用过"导航。
- Thermal API
当设备过热时,会可能影响到 CPU 和 GPU 的运行。在 Android 10 中,应用和游戏可以使用 Thermal API监控设备变化情况,并在设备过热时采取措施,使设备恢复到正常温度。
- 共享内存
以 Android 10 为目标平台的应用无法直接使用 ashmem (/dev/ashmem),而必须通过 NDK 的 ASharedMemory 类访问共享内存。
此外,应用无法直接对现有 ashmem 文件描述符进行 IOCTL,而必须改为使用 NDK 的 ASharedMemory
类或 Android Java API 创建共享内存区域。这项变更可以提高使用共享内存时的安全性和稳健性,从而提高 Android 的整体性能和安全性。
- 隐私权变更
在 Android 10 中对隐私权又做了一次变更,具体变更可以看 Android 10 中的隐私权
- 前台服务类型
Android 10 引入了 foregroundServiceType XML 清单属性,为前台服务定义对应的服务类型。比如 dataSync
是指从网络下载文件;mediaPlayback
是指播放音乐、有声读完等。所有前台服务类型可以看 前台服务类型
更多关于 Android 10 的特点可以看 Android 10 官方文档
Android 11 (API 30)
- 隐私设置
Android 11 引入了一些变更和限制来加强用户隐私保护,其中包括:
- 强制执行分区存储:对外部存储目录的访问仅限于应用专用目录,以及应用已创建的特定类型的媒体。
- 自动重置权限:如果用户几个月未与应用互动,系统会自动重置应用的敏感权限。
- 在后台访问位置信息的权限:用户必须转到系统设置,才能向应用授予在后台访问位置信息的权限。
- 软件包可见性:当应用查询设备上已安装应用的列表时,系统会过滤返回的列表。
如需了解详情,可以看隐私设置
- 增加 APk 签名方案 v4
Android 11 添加了对 APK 签名方案 v4 的支持。注意 targetSdkVersion 为 Android 11 的应用不支持 v1 签名的应用,需要签名版本在 v2 及以上。
- 无线调试支持
Android 11 支持通过 Android 调试桥 (adb) 以无线方式部署和调试应用。
- apk 增量安装
我们使用 adb install --incremental
可以支持 apk 增量更新。需要注意 apk 增量需要 v4 签名方案支持。
- NDK Thermal API
native 版本的监控设备是否过热的 API,具体可以看 NDK Thermal
- IME 新API
Android 11 引入了新的 API 以改进输入法 (IME) 的转换,例如屏幕键盘。这些 API 可让我们更轻松地调整应用内容,并与 IME 的出现和消失以及状态和导航栏等其他元素保持同步。
- Frame rate API
Android 11 提供了一个 API,可让应用告知系统其预期帧速率,从而减少支持多个刷新率的设备上的抖动。有关如何使用此 API 的信息,请参阅帧速率指南。
- 应用退出原因
Android 11 引入了 ActivityManager.getHistoricalProcessExitReasons()
方法,用于报告近期任何进程终止的原因。该方法可以用来收集崩溃诊断信息,例如进程终止是由于 ANR、内存问题还是其他原因所致。此外,我们还可以使用新的 setProcessStateSummary()
方法存储自定义状态信息,以便日后进行分析。
- ResourcesLoader 和 ResourcesProvider
在 Android 11(API 级别 30)中,ResourcesLoader 和 ResourcesProvider 是用于动态加载和管理资源的新 API。它们为开发者提供了更灵活的方式来加载和访问资源。
- 动态 intent 过滤器
Android 11 引入了 MIME 组,这是一个新的清单元素,可让应用在 intent 过滤器中声明一组动态的 MIME 类型,并在运行时以编程方式对其进行修改。
更多关于 Android 11 的特点可以看 Android 11 官方文档
Android 12 (API 31)
- 生命周期变更
在 Android 12 中,root activity 中按下了 back 按钮,不会 finish 当前的 activity。而是会将该 activity 放到后台。
具体信息见 有关 Android12 中 Activity 生命周期的变化
- 自动更新应用
在 Android 12,增加了 PackageInstaller#setRequireUserAction()
方法,该方法可让安装程序应用执行应用更新而无需用户确认操作。
- 前台服务启动限制
当在后台运行时,不再允许应用启动前台服务。
- 应用启动画面 API
Android 12 引入了全新的应用启动画面 API ,可为所有应用启用可自定义的应用启动动画。
- 应用存储访问权限
现在,应用可以创建自定义 activity,让用户可以管理设备上的应用数据,并将此 activity 提供给文件管理器。具体可以看应用存储访问权限
- 游戏模式
Android 12 引入了一个新的游戏模式 ,可让用户优化游戏体验以提升性能或延长电池续航时间。
更多关于 Android 12 的特点可以看 Android 12 官方文档
Android 13 (API 33)
- ART 优化
在 Android 13(API 级别 33)及更高版本中,ART 可大大加快在原生代码之间切换的速度,JNI 调用速度现在最高可提高 2.5 倍。我们还重新设计了运行时引用处理,使其大部分都为非阻塞处理,从而进一步减少了卡顿。此外,我们还可以使用 Reference.refersTo() 公共 API 更快地回收无法访问的对象。
- 开发者可降级权限
从 Android 13 开始,应用可以撤消未使用的运行时权限。
-
APK 签名方案 v3.1 Android 13 可支持 APK 签名方案 v3.1,此方案在现有的 APK 签名方案 v3 的基础上进行了改进,此方案解决了 APK 签名方案 v3 的一些已知问题。
-
可编程的着色器
从 Android 13 开始,系统支持可编程 RuntimeShader
对象,其行为通过 Android 图形着色语言 (AGSL) 定义。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。
Android 在内部使用这些着色器来实现涟漪效果、模糊和拉伸滚动。通过 Android 13 及更高版本,我们可以为应用创建类似的高级效果。
更多关于 Android 13 的特点可以看 Android 13 官方文档
Android 14 (API 34)
- 限制最低可安装目标的 API 级别
在 Android 14,用户无法安装 targetSdkVersion
低于 23
的应用。
- 对隐式 intent 的限制
对于以 Android 14(API 级别 34)或更高版本为目标平台的应用,Android 会限制应用向内部应用组件发送隐式 intent。详情看对隐式 intent 和待处理 intent 的限制
- 应用只能终止自己的后台进程
从 Android 14 开始,当您的应用调用 killBackgroundProcesses()
时,该 API 只能终止自己应用的后台进程。如果我们传入其他应用的包名,此方法将不会对该应用的后台进程产生任何影响
- 必须提供前台服务类型
如果应用以 Android 14(API 级别 34)或更高版本为目标平台,则必须为应用中的每个前台服务指定至少一个前台服务类型 。
- 屏幕截图检测
如果用户在应用 activity 可见时截取屏幕截图,屏幕截图检测API 会调用回调并显示消息框消息。
更多关于 Android 14 的特点可以看 Android 14 官方文档
Android 15
- 支持 16 KB 页面大小
从 Android 15 开始,Android 系统支持配置为使用 16 KB 页面大小的开发设备。详细信息可以看支持 16 KB 页面大小
- 私密空间
私密空间是 Android 15 中推出的一项新功能,可让用户在设备上创建一个单独的空间,在额外的身份验证层保护下,防止敏感应用遭到窥探。
- 最低可安装目标API级别
在 Android 15中,用户无法安装 targetSdkVersion 低于 24 的应用。
- ApplicationStartInfo API
Android 15 上的 ApplicationStartInfo
API API 有助于深入了解应用启动,包括启动状态、在启动阶段所花的时间、在实例化 Application
类时应用的启动方式等。
- 详细的应用大小信息
Android 15 添加了 StorageStats.getAppBytesByDataType([type])
API,可让我们深入了解应用如何使用所有这些空间,包括 APK 文件分块、AOT 和加速相关代码、dex 元数据、库和引导式配置文件。详情可以看详细的应用大小信息
- 应用管理的性能分析
Android 15 包含 ProfilingManager
类,可让我们从应用中收集性能分析信息。详情可以看应用管理的性能分析
- 屏幕录制检测
Android 15 添加了屏幕录制检测 的支持,以检测是否正在录制应用。
更多关于 Android 15 的特点可以看 Android 15 官方文档
Android 16
Android 16 目前还是 Beta 状态,具体可以看 Android 16 官网