一、Android 11:
分区存储强制执行
Android 11在分区存储基础上限制了应用访问其他应用的文件
分区存储将存储空间分为两部分:
-
公共目录 :
Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等
公共目录的文件在App卸载后,不会删除, 可以通过SAF、MediaStore接口访问。 如果拥有权限,也能通过路径直接访问 -
应用专属目录:
只能自己直接访问, App卸载,数据会清除。
应用更新为以 Android 11 为目标平台后,将无法使用requestLegacyExternalStorage.
所有文件访问权限 MANAGE_EXTERNAL_STORAGE,用来获取所有文件的管理权限。
例:
//判断是否获取MANAGE_EXTERNAL_STORAGE权限:
val isHasStoragePermission= Environment.isExternalStorageManager()
电话号码相关权限
如果应用以 Android 11 或更高版本为目标平台,并且需要访问以下列表中显示的电话号码 API,则必须请求 READ_PHONE_NUMBERS 权限,而不是 READ_PHONE_STATE 权限。
TelephonyManager 类和 TelecomManager 类中的 getLine1Number() 方法。
TelephonyManager 类中不受支持的 getMsisdn() 方法。
如果应用声明 READ_PHONE_STATE 以调用前面列表中的方法以外的方法,可以继续在所有 Android 版本中请求 READ_PHONE_STATE。不过,如果仅对前面列表中的方法使用 READ_PHONE_STATE 权限,请按以下方式更新您的清单文件:
更改 READ_PHONE_STATE 的声明,以使应用仅在 Android 10(API 级别 29)及更低版本中使用该权限。
例:
< uses-permission android:name="READ_PHONE_STATE" android:maxSdkVersion="29" />
<uses-permission android:name="READ_PHONE_NUMBERS" />
自定义消息框视图被屏蔽
出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的消息框是以 Android 11 或更高版本为目标平台的应用从后台发送的,系统会屏蔽这些消息框。请注意,仍允许使用文本消息框;此类消息框是使用 Toast.makeText() 创建的,并不调用 setView()。
如果您的应用仍尝试从后台发布包含自定义视图的消息框,系统不会向用户显示相应的消息,而是会在 logcat 中记录以下消息:
W/NotificationService: Blocking custom toast from package
due to package not in the foreground
媒体intent操作需要系统默认相机
从 Android 11 开始,只有预装的系统相机应用可以响应以下 intent 操作:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
也就是说,如果我调用intent唤起照相机,使用VIDEO_CAPTURE的action,只有系统的相机能够响应,而第三方的相机应用不会响应了。
软件包可见性
Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式。使用 元素,应用可以定义一组自身可访问的其他软件包。通过告知系统应向应用显示哪些其他软件包,此元素有助于鼓励最小权限原则。此外,此元素还可帮助 Google Play 等应用商店评估应用为用户提供的隐私权和安全性。
如果应用以 Android 11 或更高版本为目标平台,您可能需要在应用的清单文件中添加 元素。在 元素中,您可以按软件包名称、intent 签名或提供程序授权指定软件包。
前台服务类型
从 Android 9 开始,应用仅限于在前台访问摄像头和麦克风。为了进一步保护用户,Android 11 更改了前台服务访问摄像头和麦克风相关数据的方式。如果您的应用以 Android 11 为目标平台并且在某项前台服务中访问这些类型的数据,您需要在该前台服务的声明的 foregroundServiceType 属性中添加新的 camera 和 microphone 类型。
应用某项前台服务需要访问位置信息、摄像头和麦克风,那么就要在清单文件中这样添加:
<manifest ...>
<service ...
android:foregroundServiceType="location|camera|microphone" />
</manifest>
二、Android 12:(API30-31)
供应商启动分区变更
Android 12 开始支持通过 fastboot 命令从设备中提取整个 vendor_boot 映像,从而刷写供应商 ramdisk。该命令会提示主机端 fastboot 工具读取供应商启动头文件、重置映像并刷写新映像。这包括对引导加载程序和 fastbootd 变更的支持,用于获取分区大小和偏移等必要数据。
SplashScreen
从 Android 12 开始,在搭载 Android 12 或更高版本的设备上运行时,所有应用都将拥有启动动画。这包括启动时的进入应用动作、显示应用图标的启动画面,以及向应用本身的过渡
- 应用图标应该是矢量可绘制对象(AVD XML),它可以是静态或动画形式。虽然动画的时长可以不受限制,但我们建议不超过1000 毫秒。默认情况下,使用启动器图标。
- 可以选择添加图标背景;在图标与窗口背景之间需要更高的对比度时图标背景很有用。如果您使用一个自适应图标,当该图标与窗口背景之间的对比度足够高时,就会显示其背景。
- 与自适应图标一样,前景的三分之一被遮盖。
- 窗口背景由不透明的单色组成。如果窗口背景已设置且为纯色,则未设置相应的属性时默认使用该背景。
更安全的组件导出
以Android 12为目标平台的App,如果其包含的四大组件中使用到了Intent过滤器(intent-filter),则必须显式声明 android:exported 属性
,否则App将无法在Android 12及更高系统版本的设备上安装。
定位权限:大概位置
如果应用请求 ACCESS_COARSE_LOCATION,但未请求 ACCESS_FINE_LOCATION,则此变更不会影响您的应用。
如果应用请求 ACCESS_FINE_LOCATION 运行时权限,您还应请求ACCESS_COARSE_LOCATION 权限,以便处理用户授予应用大致位置访问权限的情形。
PendingIntent可变性
如果应用程序以Android 12为目标平台,必须为应用创建的每个 PendingIntent 对象指定可变性
。这项额外的要求可提高应用的安全性。因为三方app可以通过劫持PendingIntent,然后改写里面的action、category、data等,造成重定向攻击。
适配的具体就是在创建 PendingIntent时,使用 PendingIntent.FLAG_MUTABLE 或 PendingIntent.FLAG_IMMUTABLE 标志。否则运行时会报 IllegalArgumentException。
蓝牙权限
如果应用程序面向Android 12或更高版本,使用蓝牙功能时需要应用程序的清单文件中声明以下权限:
BLUETOOTH_SCAN:允许蓝牙设备扫描。
BLUETOOTH_CONNECT:允许蓝牙设备连接。
BLUETOOTH_ADVERTISE:允许当前蓝牙设备可以被其他蓝牙设备发现。
对于以前的与蓝牙相关的权限声明,设置android:maxSdkVersion到30。此应用兼容性步骤可帮助系统仅授予您的应用在运行Android 12 的设备上安装时所需的蓝牙权限。
<manifest ...>
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 只有当您的应用程序使用蓝牙扫描结果来获取物理位置时才需要 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
...
</manifest>
如果应用程序使用蓝牙扫描结果来获取物理位置,请声明ACCESS_FINE_LOCATION。以前版本中(6.0 ~ 11)是必须申请定位权限,才可以进行蓝牙扫描。
在Android 12上,如果你的应用程序不使用蓝牙扫描结果来获取物理位置。可以添加android:usesPermissionFlags 属性到您的 BLUETOOTH_SCAN 权限声明,并将该属性的值设置为 neverForLocation。
系统提醒窗口的限制
为了提高 Android 生态系统的安全性,Android 12 加大了获取 SYSTEM_ALERT_WINDOW 权限的难度,并允许第三方应用阻止来自其他第三方应用的叠加层。
在 Android 12 中,系统不会向预安装应用自动授予 SYSTEM_ALERT_WINDOW 应用操作权限。此权限必须由用户明确授予后才能供预安装应用使用。系统应用仍会默认获得该权限。
第三方应用可以选择不在其上绘制应用叠加层。这提供了一种防范 cloak and dagger 式攻击的保护机制。此功能可供所有应用使用,以便让银行应用等安全敏感应用能够保护自身。如需使用此功能,应用必须在其清单中声明 HIDE_OVERLAY_WINDOWS 权限。
HIDE_NON_SYSTEM_OVERLAY_WINDOWS(signature|privileged) 已废弃,取而代之的是 HIDE_OVERLAY_WINDOWS。
虚拟 A/B 更新
Android 12 提供了快照分区上的虚拟 A/B 压缩选项。在 Android 12 中,可以对引导加载程序不使用的可更新分区拍摄快照以节省空间。这些快照也可以压缩。针对 Android 12 在 build 中启用快照压缩可以节省 /data 分区上的空间。
Android 13:(API33)
对通用启动分区的更改
对于发布时搭载 Android 13 的设备,通用 ramdisk 将从 boot 映像中移除,并放置在单独的 init_boot 镜像中。
任务管理器
在 Android 13 中,一项新的系统界面选项(称为任务管理器)会通知用户后台应用的前台服务的状态和所使用的资源,并且可让用户停止这些应用
细化的媒体权限
如果应用以 Android 13 或更高版本为目标平台,并且需要访问其他应用已经创建的媒体文件,必须请求以下一项或多项细化的媒体权限,而不是READ_EXTERNAL_STORAGE 权限:
媒体类型 | 请求权限 |
---|---|
图片和照片 | READ_MEDIA_IAMGES |
视频 | READ_MEDIA_VIDEO |
音频文件 | READ_MEDIA_AUDIO |
如果用户之前向您的应用授予了 READ_EXTERNAL_STORAGE 权限,系统会自动向您的应用授予细化的媒体权限。否则,当应用请求上表中显示的任何权限时,系统会弹出对话框。
<manifest ...>
<!-- Required only if your app targets Android 13. -->
<!-- Declare one or more the following permissions only if your app needs
to access data that's protected by them. -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- Required to maintain app compatibility. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<application ...>
...
</application>
</manifest>
通知运行时权限
在AndroidManifest.xml中对发送通知权限进行声明:
<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application ...>
...
</application>
</manifest>
POST_NOTIFICATIONS权限只有在应用程序的targetSdk指定成33或更高时才会有用。
要确认用户是否已启用通知,请调用 areNotificationsEnabled()。
静态广播注册
从Android 13开始,以Android13(API 33+)为目标平台的应用,注册静态广播时,需设置对其他应用的可见性
:
若对其他应用可见,广播注册时设置:Context.RECEIVER_EXPORTED
若仅应用内使用,广播注册时设置:Context.RECEIVER_NOT_EXPORTED
目前该增强措施并非默认生效,开发者需启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED兼容性框架,并在动态注册广播时指定是否接受其他应用的广播。
如果启用了 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改,则必须为每个广播接收器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。否则,当您尝试注册广播接收器时,系统会抛出 SecurityException。
Android 14: (API34)
WindowManager 扩展
Android 14 添加了以下支持:双显示屏模式、加载时的性能影响
和 WindowManager 扩展中的 COMMON_STATE_USE_BASE_STATE 设备专用状态标识符。
对照片和视频进行独立授权
Android 14 引入了所选照片访问权限,可让用户授权应用访问其媒体库中的特定图片和视频,而不是授予对指定类型的所有媒体内容的访问权限。即独自设置 READ_MEDIA_IMAGES 或 READ_MEDIA_VIDEO,注意这两个权限仅在Android13及以上才能运行。
新增了一个 READ_MEDIA_VISUAL_USER_SELECTED 权限,归于 Dangerous 等级。用于在用户点击自定义的相片挑选器需求请求拜访相片和视频的权限时运用,这样就不必去请求 READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 这两个权限了。
限制前台服务
argetSdkVersion 34 的情况下,必须为应用内的每个前台服务(foreground-services) 指定至少一种前台服务类型。
前台服务类型是在 Android 10 引入的,通过 android:foregroundServiceType 可以指定
如果以 Android 14 为目标平台的应用未在清单中定义给定服务的类型,系统会在调用 startForeground() 时引发 MissingForegroundServiceTypeException。
最低可安装的目标 API 级别
从 Android 14 开始,targetSdkVersion 低于 23 (Android 6.0)的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安全性和隐私性。
在 BluetoothAdapter 中强制执行 BLUETOOTH_CONNECT 权限
对于以 Android 14(API 级别 34)为目标平台的应用,Android 14 会在调用 BluetoothAdapter getProfileConnectionState() 方法时强制执行 BLUETOOTH_CONNECT 权限。
此方法已需要 BLUETOOTH_CONNECT 权限,但未被强制执行。请确保应用在应用的 AndroidManifest.xml 文件中声明 BLUETOOTH_CONNECT(如以下代码段所示),并在调用 getProfileConnectionState 之前检查用户是否已授予权限。
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
对隐式 intent 和待处理 intent 的限制
对于以 Android 14 为目标平台的应用,Android 会通过以下方式限制应用向内部应用组件发送隐式 intent:
1. 隐式 intent 只能传送到导出的组件。应用必须使用显式 intent 传送到未导出的组件,或将该组件标记为已导出。
2. 如果应用通过未指定组件或软件包的 intent 创建可变待处理 intent,系统现在会抛出异常。
3. 这些变更可防止恶意应用拦截意在供应用内部组件使用的隐式 intent。
注册的广播接收器必须指定导出行为
以 Android 14 为目标平台并使用上下文注册的接收器的应用和服务必须指定以下标志,以指明接收器是否应导出到设备上的所有其他应用:RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。
val filter = IntentFilter(APP_SPECIFIC_BROADCAST)
val listenToBroadcastsFromOtherApps = false
val receiverFlags = if (listenToBroadcastsFromOtherApps) {
ContextCompat.RECEIVER_EXPORTED
} else {
ContextCompat.RECEIVER_NOT_EXPORTED
}
ContextCompat.registerReceiver(context, br, filter, receiverFlags)
如果应用仅通过 Context#registerReceiver 方法(例如 Context#registerReceiver()针对 系统广播 注册接收器,那么它在注册接收器时不应指定标志。
GNSS
Android 14 引入了以下 GNSS 功能和 API,它们通过 GNSS AIDL HAL 接口使用:
GnssCapabilities.getGnssSignalTypes:返回 GNSS 芯片组支持的 GNSS 信号类型的列表。
GnssCapabilities.hasAccumulatedDeltaRange:确定 GNSS 芯片组是否支持累计增量范围。
GnssMeasurementsEvent.isFullTracking:指示 GNSS 引擎是否处于全面跟踪模式。
发布时搭载 Android 14 的设备必须使用 GNSS AIDL HAL。对于升级到 Android 14 的设备,GNSS 框架支持 HIDL HAL,但新的 GNSS 功能只能通过 GNSS AIDL HAL 接口使用。
Android 15:
对启动前台服务的 BOOT_COMPLETED 广播接收器的限制
Android15 对BOOT_COMPLETED类型的广播接收方启动前台服务有了新的限制。如果 BOOT_COMPLETED 广播接收方尝试启动除 LOCATION、CONNECTED_DEVICE、REMOTE_MESSAGING、HEALTH、SYSTEM_EXEMPTED 和 SPECIAL_USE 类型以外的前台服务,系统则会抛出ForegroundServiceStartNotAllowedException 异常。此外,持有SYSTEM_ALERT_WINDOW权限的应用现在需要有一个可见的悬浮窗才能从后台启动前台服务。否则,系统也会抛出异常。
应该注意不要监听BOOT_COMPLETED来启动除 LOCATION、CONNECTED_DEVICE、REMOTE_MESSAGING、HEALTH、SYSTEM_EXEMPTED 和 SPECIAL_USE 类型以外的前台服务。持有SYSTEM_ALERT_WINDOW权限的应用需要首先启动一个TYPE_APPLICATION_OVERLAY类型的悬浮窗并保证悬浮窗可见,才能启动前台服务。开发者可以调用View.getWindowVisibility()来查看悬浮窗的可见性,也可以监听View.onWindowVisibilityChanged()回调。
对请求音频焦点的限制
15之前, 应用可以无任何限制的申请音频焦点。Android 15针对此做出了规范。面向 Android 15 的应用必须是前台应用或运行与音频相关的前台服务( mediaPlayback, camera, microphone, 或 phoneCall) 才能请求音频焦点
。 如果应用程序在不满足这些要求之一时尝试请求焦点,则调用将返回 AUDIOFOCUS_REQUEST_FAILED。
安全的后台Activity启动
15继续加强对后台启动activity的管控,以提高安全性:
- 栈顶应用如果在AndroidManifest.xml 文件中设置allowCrossUidActivitySwitchFromBelow为false,可以阻止自己UID 不匹配的应用启动activity。
- PendingIntent的创建者可以通过ActivityOptions#setPendingIntentCreatorBackgroundActivityStartMode(int state)方法来赋予PendingIntent后台启动activity的权力。
- PendingIntent的发送者也可以通过ActivityOptions#setPendingIntentBackgroundActivityStartMode(int state)方法来赋予PendingIntent后台启动activity的权力。
- 防止其他应用的 activity 随意启动到您自己的task中。
- 防止不可见的窗口被用于后台启动。
系统电源政策
电源状态转换时自动应用的默认电源政策在电源政策组中指定。供应商可以定义以下状态的默认电源政策:“等待 VHAL”“开启”和“等待 VHAL 完成”(进入深度休眠或开始关闭)。
AAOS 支持两项系统电源政策,即没有用户互动和挂起准备。系统电源政策在设备进入静音模式、车库模式、挂起到 RAM 或挂起到磁盘时应用。
在系统层中运行的汽车电源政策守护程序通过订阅两个属性来监听 VHAL 发出的请求:
POWER_POLICY_REQ,VHAL 将电源政策 ID 写入此属性。
POWER_POLICY_GROUP_REQ,VHAL 将电源政策组 ID 写入此属性。
除 VHAL 外的其他模块可以更改系统中的当前电源政策。在这种情况下,汽车电源政策守护程序会更新 CURRENT_POWER_POLICY 属性,以向 VHAL 通知此更改。
适用于高清和 DAB 电台的内容
Android 15 在广播电台 HAL 中改进了高清电台支持,并提供了一个未捆绑电台应用作为参考。
动态权限管理
Android 15 增强了权限管理,要求开发者动态请求隐私权限(如蓝牙、位置)。
后台任务优化
增强了后台任务管理,推荐使用 WorkManager 来执行可延迟或后台任务。
动态性能
Android 15 引入动态性能功能,可根据设备负载动态调整任务优先级,实现资源分配优化。
通知冷却时间
提供通知冷却时间功能,可限制短时间内重复通知。