Android11新功能和行为变更

273 阅读6分钟

新功能

应用进程退出原因

在 Android 11 中,新增了 ActivityManager.getHistoricalProcessExitReasons() 方法,用于报告最近任何进程终止的原因。应用可以使用此方法收集崩溃诊断信息,例如进程终止是否由于 ANR、内存问题等原因。此外,还可以使用 setProcessStateSummary() 方法存储自定义状态信息,便于后续分析。

APK 签名方案 v4

Android 11 支持 APK 签名方案 v4。此方案在单独的文件(apk-name.apk.idsig)中生成新的签名,但其他方面与 v2 和 v3 类似,对 APK 没有任何更改。此方案支持 ADB 增量 APK 安装,从而加快 APK 安装速度。

更多功能请参考官方文档:Android 11 功能和API

行为变更

所有应用行为变更

Android 11 平台包含一些可能影响您的应用的行为变更。以下变更将影响在 Android 11 上运行的所有应用,无论其 targetSdkVersion 是什么。您应该测试您的应用,并根据需要进行修改,以适当地支持这些变更。

JobScheduler API 调用限制调试

Android 11 提供了调试支持,帮助应用确定可能超过特定速率限制的 JobScheduler API 调用。开发者可以利用此服务发现潜在的性能问题。对于设置为 debuggable 的应用,超出速率限制的 JobScheduler API 调用将返回 RESULT_FAILURE。合理的用例不会受到此限制的影响。

隐私权

  • 单次授权:用户可以选择授予位置信息、麦克风和摄像头的临时访问权限。
  • 权限对话框的可见性:一再拒绝某项权限表示用户希望“不再询问”。
  • 数据访问审核:深入了解应用在何处访问私密数据,无论是在应用自己的代码中,还是在依赖库的代码中。
  • 系统提醒窗口权限:根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW 权限。包含 ACTION_MANAGE_OVERLAY_PERMISSION intent 操作的 intent 始终会将用户转至系统设置中的屏幕。
  • 永久 SIM 卡标识符:在 Android 11 及更高版本中,使用 getIccId() 方法访问不可重置的 ICCID 受到限制。该方法会返回一个非 null 的空字符串。建议使用 getSubscriptionId() 方法来唯一标识设备上安装的 SIM 卡。订阅 ID 对于给定 SIM 卡在设备恢复出厂设置前保持不变。

更多

更多行为变更请参考Android 11 所有应用的行为变更

API 30+ 为目标应用的行为变更

现在需要 APK 签名方案 v2

对于以 Android 11(API 级别 30)为目标平台,且目前仅使用 APK 签名方案 v1 签名的应用,现在必须使用 APK 签名方案 v2 或更高版本进行签名。用户无法在 Android 11 设备上安装或更新仅通过 APK 签名方案 v1 签名的应用。您可以使用 Android Studio 或 apksigner 工具在命令行中验证应用是否已使用 APK 签名方案 v2 或更高版本进行签名。

隐私

Android 11 引入了一些变更和限制,以加强用户隐私保护:

  • 强制执行分区存储:对外部存储目录的访问仅限于应用专用目录及应用已创建的特定类型的媒体。
  • 自动重置权限:如果用户几个月未与应用互动,系统会自动重置应用的敏感权限。
  • 在后台访问位置信息的权限:用户必须转到系统设置,才能向应用授予在后台访问位置信息的权限。
  • 软件包可见性:应用不能再查看设备上安装的所有应用,需要在 manifest 文件中声明应用需要查询的特定应用。

更多

更多行为变更请参考官方文档:Android 11 行为变更

隐私权

强制执行分区存储机制

以 Android 11 或更高版本为目标平台的应用将受分区存储行为的影响。

详细了解分区存储功能变更

单次授权

用户可以授予对位置信息、麦克风和摄像头的临时访问权限。

自动重置权限

如果用户在 Android 11 或更高版本上几个月未与应用互动,系统会自动重置应用的敏感权限。

后台位置信息访问权限

Android 11 更改了用户向应用授予后台位置信息权限的方式。

建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。如果同时请求前台和后台位置信息权限,系统会忽略该请求,且不会向应用授予其中的任一权限。

更多内容请查看在运行时请求位置信息访问权限

软件包可见性

为了保护用户隐私,应用不能再查看设备上安装的所有应用。需要在 manifest 文件中声明应用需要查询的特定应用。

适配方案如下:

如果知道要查询或与之交互的特定应用(例如,与应用集成的应用或使用其服务的应用),请将其软件包名称添加到 <queries> 元素内的一组 <package> 元素中:


<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

详细了解软件包可见性

前台服务

Android 11 更改了前台服务访问位置信息、相机和麦克风相关数据的方式。

前台服务类型 camera 和 microphone

如果应用以 Android 11 或更高版本为目标平台,并且在前台服务中访问摄像头或麦克风,必须添加前台服务类型 cameramicrophone

在应用清单中,使用 <service> 元素声明应用的每个前台服务。对于每项服务,请使用 android:foregroundServiceType 属性来声明服务所执行的工作类型。


<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...><application ...><service android:name=".MyMediaPlaybackService" android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service></application></manifest>

如果服务有多个类型,请使用 | 运算符将其分隔。例如,使用摄像头和麦克风的服务按如下方式进行声明:

android:foregroundServiceType="camera|microphone"

对在使用时访问的限制

如果应用在后台运行时启动了某项前台服务,则该前台服务无法访问麦克风或摄像头。此外,除非应用具有在后台访问位置信息的权限,否则该服务无法访问位置信息。

详细了解前台服务的变更

更多

更多隐私权变更请参考Android 11 中的隐私权