Android各版本差异性

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 功能和变更列表,官方介绍

相关推荐
每次的天空12 分钟前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭39 分钟前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日2 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安2 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑2 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟6 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡7 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi007 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil9 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你9 小时前
Android View的绘制原理详解
android