Android各版本差异性

Android 6(api 23)

  • 指纹识别
  • 运行时权限:动态申请(重点)
  • 移除对Apache HTTP client的支持,建议使用HttpURLConnection。
  • 休眠和应用待机模式(Doze and App Standby)
  • 硬件标识符访问权:WifiInfo.getMacAddress() 返回常量值 02:00:00:00:00:00

Android7(api 24)

  • 应用间共享文件规则
  • 禁止使用file://URI, 否则抛出FileUriExposedException异常应该通过content://URI,并授权URI 临时访问权限
  • FileProvider
  • Apk签名Scheme V2
  • V1签名不会校验Apk文件的注释区V2签名会校验Apk文件的注释区是否修改V2签名增加一块签名区块,签名区块可以根据固定的id,获取签名信息签名区块不会校验是否修改
  • 画中画、分屏多任务、通知栏快速回复、夜间模式
  • 后台优化:
  • 删除3个隐式广播(CONNECTIVITY_ACTION、ACTION_NEW_PICTURE、ACTION_NEW_VIDEO)

Android8(api 26)

  • 运行时权限:系统只会授予应用明确请求的权限
  • 通知变更(channel)
  • 自适应图标
  • 悬浮窗适配
  • 透明主题的Activity:8.0上的Bug : 只有全屏不透明的Activity才可以设置方向 ; 8.1修复
  • 后台服务、广播限制规则;
  • 1.后台服务限制处于空闲状态时,应用可以使用的后台服务存在限制。 这些限制不适用于前台服务,因为前台服务更容易引起用户注意
  • 2.广播限制除了有限的例外情况,无法再使用清单注册隐式广播
  • 后台位置信息限制
  • 为降低耗电量,8.0开始对后台应用获取用户当前位置信息的频率进行限制,应用每小时仅能接收几次位置信息更新,会出现后台应用定位收不到定位信息。

Android9(api 28)

  • 新特性
  • 刘海屏的支持
  • 利用 Wi-Fi RTT 进行室内定位
  • 通知栏功能增强(支持Bubble)
  • 多摄像头支持
  • Non-SDK接口使用
  • 9.0开始,无法再通过反射,JNI间接地使用非SDK的API接口了
  • 挖孔屏适配
  • 有状态栏的页面,不会受挖孔屏特性的影响全屏显示的页面,系统挖孔屏方案会把应用界面下移,避开挖空区域,进行显示
  • 不允许共享WebView数据目录
  • 不能再跨进程共享单个WebView数据目录,否则会崩溃
  • 移除对 Build.serial 的直接访问
  • 需要 Build.serial属性字段的话,必须请求 READ_PHONE_STATE 权限然后使用 9.0 新增的新 Build.getSerial() 函数来进行获取
  • SELinux 禁止访问应用的数据目录
  • 不允许直接通过路径访问其他应用的数据目录
  • 可以使用进程间通信 (IPC) 机制(包括通过传递 FD)共享数据

Android 10 ( api29)

  • 定义媒体权限集合
  • 访问共享集合,需通过 MediaStore API
  • MediaStore.ImagesMediaStore.VideoMediaStore.AudioMediaStore.Downloads
  • 应用的私有目录访问变更
  • 为每个应用程序提供了一个独立的在外部存储设备的存储沙箱,没有其他应用可以直接访问您应用的沙盒文件。由于文件是私有的,因此访问这些文件不再需要任何权限。
  • 获取外部存储私有文件的最佳位置:即Context.getExternalFilesDir返回的位置,因为此位置在所有Android版本中表现一致;使用此方法时,请传入与要创建或打开的文件类型对应的媒体环境。例如,要访问或保存app-private图像,请调用Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
  • ACCESS_MEDIA_LOCATION
  • 使用这个权限,可以获取照片中的位置信息
  • Activity后台活动限制
  • 对应用未经通知用户就启动App,进行了极大地限制,只有在满足以下一个或多个条件时才能启动Activity:
  • 1. App具有可见Activity窗口
  • 2.位于前台的另一个App发送属于该应用程序的PendingIntent
  • 3.系统发送属于该App的PendingIntent (比如:点击通知消息)
  • 4.系统向应用程序发送广播 (比如:SECRET_CODE_ACTION)
  • 设备位置权限的访问控制
  • 用户可以更好地控制应用何时可以访问设备位置,运行的应用程序请求位置访问时,会通过对话框的形式给用户进行授权提示。
  • 允许应用程序降级
  • 对数据和标识符的更改
  • 1.获取联系人信息,结果不再按交互频率排序
  • 2.MAC地址随机化,默认传输随机的MAC 地址
  • 3.唯一标识符:需要 READ_PRIVILEGED_PHONE_STATE 权限,才能访问设备的不可重置标识符,包括 IMEI、序列号
  • 4.访问剪贴板数据:除默认输入法程序外,没有焦点的应用无法访问剪贴板数据 : clipManager.hasPrimaryClip return false
  • 5.访问USB串行需要用户许可:只能在用户授予您访问USB设备权限后才能读取序列号
  • 6.相机和连接相关更改:调用getCameraCharacteristics()方法获取返回的信息的广度,必须具有 CAMERA 权限才能访问getCameraCharacteristics()方法的返回值中包含的设备元数据
  • 启用、禁用Wi-Fi的限制
  • 1.无法启用、停用Wi-Fi2.WifiManager.setWifiEnabled() 方法始终返回false3.只能使用设置面板提示用户启用、禁用Wi-Fi

Android 11(api 30)

  • 分区存储强制执行
  • 分区存储,在Android10就已经推行了,简单的说,就是应用对于文件的读写只能在沙盒环境,也就是属于自己应用的目录里面读写。其他媒体文件可以通过MediaStore进行访问。
  • 媒体文件访问权限
  • 为了在保证用户隐私的同时可以更轻松地访问媒体,Android 11 增加了以下功能。执行批量操作和使用直接文件路径和原生库访问文件
  • 软件包可见性
  • 如果你想去获取其他应用的信息,比如包名,名称等等,不能直接获取了,必须必须在清单文件中添加元素,告知系统你要获取哪些应用信息或者哪一类应用
  • 所有文件访问权限
  • 应用可通过执行以下操作,向用户请求名为“所有文件访问权限”的特殊应用访问权限,在清单中声明MANAGE_EXTERNAL_STORAGE权限,使用ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 作为Action, 将用户引导至一个系统设置页面,在该页面上,用户可以为您的应用启用以下选项:授予所有文件的管理权限。如需确定您的应用是否已获得 MANAGE_EXTERNAL_STORAGE 权限,请调用Environment.isExternalStorageManager()。
  • 电话号码相关权限
  • TelecomManager 类中的 getLine1Number() 方法TelecomManager 类中的 getMsisdn() 方法当用到这两个API的时候,原来的READ_PHONE_STATE权限不管用了,需要READ_PHONE_NUMBERS权限才行
  • 媒体intent操作需要系统默认相机
  • 5G
  • 需要 APK 签名方案 v2
  • 后台位置信息访问权限
  • 数据访问审核
  • 用户可以选择权限单次授权(仅此一次)
  • 我们每次使用的时候都去判断权限,没有就去申请即可。

Android 12(API 31)

三方卡片内容: https://developer.android.google.cn/about/versions/12?hl=zh-cn

  • 应用启动页 SplashScreen(影响所有应用);
  • 从Android 12开始,所有的App在每次启动时(特指冷启动与温启动),系统都会为我们加上一个默认的启动画面
  • 应用图标 +图标背景+前景遮罩+窗口背景
  • 启动画面允许我们一定程度的自定义,但总体都无法跳脱出以上4个元素,且无法去除。
  • 适配:方案
  • 设置除窗口背景之外的元素都为透明
  • 改用SplashScreen API定制系统启动画面:可定制程度低,可能无法满足产品的需求;
  • 麦克风和摄像头切换开关
  • 声明 android:exported
  • 应用组件需显示声明 android:exported
  • 从 Andorid 12 开始,当您的应用程序将目标版本设置为31或更高版本(targetSdkVersion 31)时,若应用程序组件(Activity、Service、Receiver、Provider)在配置清单manifest中未显示声明 android:exported 属性,则在进行应用开发或打包时,将会出现如下错误 : As of Android 12, android:exported must be set; use true to make the activity available to other apps, and false otherwise. For launcher activities, this should be set to true.
  • 通知栏变更
  • Notification通知栏布局样式再次调整
  • 前台服务:
  • 将禁止从后台启动前台服务
  • 以下情况可启动前台服务:1.可见的 Activity 或窗口;2.用户操作,如通知、小部件等等;3.特定的广播和回调;4.STICKY 类型的服务可在崩溃或由于低内存而停止运行的情况下重启;
  • 蓝牙权限:
  • Android 12 引入了 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限。这些权限可让以 Android 应用更轻松地与蓝牙设备互动,不再需要申请设备位置信息相关权限。Android 12 开始,Google官方将蓝牙扫描与位置权限进行了分离,因为官方发现:在隐私层面上,很难向终端用户解释位置权限与蓝牙的关系。
  • 精确位置
  • 从 Andorid 12 开始,当您的应用程序将目标版本设置为31或更高版本(targetSdkVersion 31)时,若应用程序请求设备的精确位置,需同时请求 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限。发出精确位置申请后,用户侧设备将弹出动态授权申请弹窗:
  • 待处理 intent 可变性
  • 简单讲,就是以Android 12为目标平台的App,在构建PendingIntent时,需要指定Flag为FLAG_IMMUTABLE(建议)或FLAG_MUTABLE二者之一
  • 精确的闹钟权限
  • 通知 trampoline 限制
  • 简单讲,就是我们之前在配置通知(Notification)的点按行为时,可能会通过PendingIntent来启动一个Service或BrocastReceiver。而以Android 12为目标平台的App,如果尝试在Service或BrocastReceiver中内调用 startActivity(),系统会阻止该Activity启动,并在 Logcat 中显示以下消息:
  • 适配:排查哪个Service或BrocastReceiver有此行为
  • 可在Terminal终端执行以下adb命令,该命令会在你点按通知后,识别哪个Service或BrocastReceiver调用了startActivity(),并输出相关信息到Logcat,可以通过关键字“NotifInteractionLog”进行过滤:adb shell dumpsys activity service \ com.android.systemui/.dump.SystemUIAuxiliaryDumpService
  • 考虑在配置通知(Notification)的点按行为时选择直接启动Activity

Android 13(API 32)

Android13官方文档

  • 细分媒体权限:将 READ_EXTERNAL_STORAGE 细分为IAMGES、VIDEO、AUDIO权限(若设置 targetSdk>=33 则此项必需适配!)
  • WebView调整:废弃setAppCacheEnabled与setForceDark方法;(若设置 targetSdk>=33 则此项必需适配!)
  • 静态广播注册:注册静态广播时,需设置对其他应用的可见性(若设置 targetSdk>=33 则此项必需适配!)
  • 通知权限:新增运行时通知权限:POST_NOTIFICATIONS(若设置 targetSdk>=33 则此项必需适配!)
  • Wi-Fi :新增 NEARBY_WIFI_DEVICES 运行时权限(若设置 targetSdk>=33 则此项必需适配!)
  • 身体传感器后台权限:新增 BODY_SENSORS_BACKGROUND 运行时权限(若设置 targetSdk>=33 则此项必需适配!)
  • 剪切板内容隐藏:新增内容隐藏API(根据业务需求,选择性适配!)
  • 非 SDK 接口的限制(若设置 targetSdk>=33 则此项必需适配!)

Android 14(API 33)

Android 14 功能和变更列表,官方介绍