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

相关推荐
深海呐3 小时前
Android AlertDialog圆角背景不生效的问题
android
ljl_jiaLiang3 小时前
android10 系统定制:增加应用使用数据埋点,应用使用时长统计
android·系统定制
花花鱼3 小时前
android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
android
落落落sss4 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
消失的旧时光-19436 小时前
kotlin的密封类
android·开发语言·kotlin
服装学院的IT男8 小时前
【Android 13源码分析】WindowContainer窗口层级-4-Layer树
android
CCTV果冻爽9 小时前
Android 源码集成可卸载 APP
android
码农明明9 小时前
Android源码分析:从源头分析View事件的传递
android·操作系统·源码阅读
秋月霜风10 小时前
mariadb主从配置步骤
android·adb·mariadb
Python私教11 小时前
Python ORM 框架 SQLModel 快速入门教程
android·java·python