lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Android P 中面向企业应用的新功能

本页面概述 Android P Developer Preview 中提供的新企业 API、功能和行为变更。

工作用描述文件用户界面

Android P 在默认启动器中加入了界面变更,以帮助用户分隔个人和工作应用。 支持这一变更的设备制造商现在可以在独立的工作和个人标签中呈现用户的应用。 我们还在启动器的工作标签中加入了一个开关,以简化设备用户打开和关闭工作用描述文件的操作。

在配置工作用描述文件和托管设备时,Android P 加入了新的动画图示来帮助设备用户了解这些功能。

跨描述文件切换应用

Android P 加入了一些新的 API,用于以不同的描述文件启动另一个应用实例,以帮助用户在帐号之间切换。 例如,电子邮件应用可以提供一个界面,让用户可以在个人描述文件与工作用描述文件之间切换,以便访问两个电子邮件帐号。 所有应用都可以调用这些 API 来启动同一应用的主 Activity,前提是应用在另一描述文件中已经安装。 要为您的应用添加跨描述文件帐号切换,请按以下步骤调用新增 CrossProfileApps 类的函数:

  1. 调用 getTargetUserProfiles() 以获取您在启动另一应用实例时可以使用的描述文件列表。 该函数检查确认各描述文件中是否已安装该应用。
  2. 调用 getProfileSwitchingIconDrawable() 以获得可用于表示另一描述文件的图标。
  3. 调用 getProfileSwitchingLabel() 以获得提示用户切换描述文件的本地化文本。
  4. 调用 startMainActivity() 在另一描述文件中启动应用实例。

通过 ACTION_MAIN Intent 操作检查确认,您想启动的主 Activity 已导出到应用的 manifest 文件,并且包括 CATEGORY_LAUNCHER Intent 类别。

以编程方式打开或关闭工作用描述文件

默认启动器(或拥有 MANAGE_USERSMODIFY_QUIET_MODE 权限的应用)现在可以通过调用 UserManager.requestQuietModeEnabled() 来打开或关闭工作用描述文件。 您可以通过检查返回值来了解用户是否需要在状态变化前确认其凭据。 由于变更可能不会立即发生,因此请侦听 ACTION_MANAGED_PROFILE_AVAILABLEACTION_MANAGED_PROFILE_UNAVAILABLE 广播,以了解何时更新界面。

您的应用可以通过调用 UserManager.isQuietModeEnabled() 来检查工作用描述文件的状态。

将任何应用锁定到设备

从 Android P 开始,设备所有者和描述文件所有者可通过将应用转入锁定任务模式,将任何应用锁定到设备屏幕。 以前,应用开发者必须在其应用中添加对锁定任务模式的支持。 Android P 还扩展了锁定任务 API 的范围,以覆盖附属和非附属用户的描述文件所有者。 请按以下步骤将应用锁定到屏幕:

  1. 调用 DevicePolicyManager.setLockTaskPackages() 以将应用加入锁定任务模式白名单。
  2. 调用 ActivityOptions.setLockTaskEnabled() 以在锁定任务模式下启动加入白名单的应用。

要停止应用使用锁定任务模式,请使用 DevicePolicyManager.setLockTaskPackages() 从锁定任务模式白名单中移除应用。

启用系统界面功能

启用锁定任务模式时,设备所有者可以通过调用 DevicePolicyManager.setLockTaskFeatures() 并传递以下功能标志的位字段,在设备上启用某些系统界面功能:

启用锁定任务模式时,您可以调用 DevicePolicyManager.getLockTaskFeatures() 来获取设备上可用功能的列表。 当设备退出锁定任务模式时,将恢复到其他设备规范所规定的状态。

禁止显示错误对话框

在零售演示或公共信息显示等某些环境中,您可能不想向用户显示错误对话框。 设备政策控制器 (DPC) 可通过添加 DISALLOW_SYSTEM_ERROR_DIALOGS 用户限制,禁止在应用崩溃或失去响应时显示系统错误对话框。 此限制由设备所有者应用时会影响所有对话框;由描述文件所有者应用时,只会禁止显示工作用描述文件中显示的错误对话框。

在专用设备上支持多名用户

Android P 为专用设备(也称为 COSU 设备)引入了短暂用户这一概念。 短暂用户是短期用户,专用于多名用户共用一台专用设备的情况。 这包括图书馆自助登记机或酒店业自助入住机等设备上的公共用户会话,以及设备上一组固定用户(例如轮班工人)之间的持久性会话。

短暂用户应在后台创建。 他们创建时的身份是设备上的次要用户,当他们被停止、切换或设备重新启动时会被移除(连同关联的应用和数据)。 要创建短暂用户,设备所有者可以:

  1. 在调用 DevicePolicyManager.createAndManageUser() 时设置 MAKE_USER_EPHEMERAL 标志。
  2. 调用 DevicePolicyManager.startUserInBackground() 以在后台启动短暂用户。

接收事件通知

DeviceAdminReceiver 现在接收下列事件的通知:

向用户显示事件消息

设备所有者可以配置在用户开始和结束会话时向其显示的消息:

退出和停止用户

设备所有者可以使用 DevicePolicyManager.setLogoutEnabled() 来指定是否为次要用户启用退出。 要检查是否启用了退出,请调用 DevicePolicyManager.isLogoutEnabled()

次要用户的描述文件所有者可以调用 DevicePolicyManager.logoutUser() 来停止次要用户并切换回主要用户。

设备所有者可以使用 DevicePolicyManager.stopUser() 来停止指定的次要用户。

软件包缓存

为精简具有一组固定用户的共享设备(例如供轮班工人使用的设备)上的用户配置,现在可以缓存多用户会话所需的软件包:

  1. 调用 DevicePolicyManager.setKeepUninstalledPackages() 以指定以 APK 形式保留的软件包列表。 要获取这些软件包的列表,请调用 DevicePolicyManager.getKeepUninstalledPackages()
  2. 调用 DevicePolicyManager.installExistingPackage() 以安装通过 setKeepUninstalledPackages() 在卸载后保留下来的软件包。

注:如果描述文件所有者调用 DevicePolicyManager.installExistingPackage(),用户必须是设备的附属用户。 要检查确认用户附属于设备,请使用 DevicePolicyManager.isAffiliatedUser()

新增函数和常量

Android P 还加入了下列新函数和常量,为共享设备上的用户会话提供进一步支持:

清除软件包数据并移除帐号

设备所有者和描述文件所有者可以调用 clearApplicationUserData() 来清除给定软件包的用户数据。 要从 AccountManager 移除帐号,设备和描述文件所有者现在可以调用 removeAccount()

新的用户限制和增强的设置控制

Android P 引入了一组针对 DPC 的新用户限制,以及在设备上配置 APN、时间和时区以及系统设置的功能。

配置 APN

设备所有者可以使用 DevicePolicyManager 类的下列新函数在设备上配置 APN:

配置时间和时区

设备所有者可以使用 DevicePolicyManager 类中的下列新函数在设备上设置时间和时区:

对重要设置强制执行用户限制

描述文件所有者和设备所有者可以通过 DevicePolicyManager.addUserRestriction(),使用下列新增的 UserManager 字段阻止或停用重要设置:

如果在设备上强制执行了 DISALLOW_CONFIG_BRIGHTNESSDISALLOW_CONFIG_SCREEN_TIMEOUT,设备所有者仍然可以利用新增的 API DevicePolicyManager.setSystemSetting() 在设备上设置屏幕亮度屏幕亮度模式屏幕超时 设置。

按流量计费的数据

设备所有者和描述文件所有者可以防止应用使用设备的按流量计费数据网络。 当用户由于费用、流量限制或电池和性能问题而对严重流量消耗敏感时,便可将网络视为按流量计费网络。 为防止应用使用按流量计费网络,请调用 DevicePolicyManager.setMeteredDataDisabled() 以传递软件包名称列表。 要获取当前受限的应用,请调用 DevicePolicyManager.getMeteredDataDisabled()

如需了解有关 Android 中按流量计费数据的更多信息,请阅读优化网络流量消耗

迁移 DPC

设备政策控制器 (DPC) 可将其设备或工作用描述文件的所有权转让给其他 DPC。 您可以通过转让所有权将一些功能转移到 Android Management API,从您的旧版 DPC 迁移设备,或帮助 IT 管理员迁移到您的 EMM。 由于您只是改变 DPC 所有权,因此无法利用此功能来改变管理类型,例如从托管设备迁移至工作用描述文件或反向迁移。

您可以利用应用 manifest 文件来指示您的 DPC 版本支持迁移。 目标 DPC 指示,它可以通过加入名为 android.app.support_transfer_ownership 的元数据元素(SUPPORT_TRANSFER_OWNERSHIP_META_DATA 的原始值)和值 true 接收所有权。 下例展示了如何在您的 DPC 应用 manifest 文件中执行此操作:

<receiver name="..." android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data
        android:name="android.app.device_admin"
        android:resource="@xml/..." />
    <meta-data
        android:name="android.app.support_transfer_ownership"
        android:value="true" />
</receiver>

Android 通过所有权转让保持源 DPC 的系统和用户策略—DPC 不需要迁移这些内容。 源 DPC 可以在 PersistableBundle 中利用键-值对向目标 DPC 传递自定义数据。 转让成功后,目标 DPC 可通过调用 DevicePolicyManager.getTransferOwnershipBundle() 获取该数据。

转让托管设备或工作用描述文件所有权的步骤相同:

  1. 源 DPC 调用 transferOwnership() 以开始转让。
  2. 系统使目标 DPC 成为活动管理员并将其设置为托管设备或工作用描述文件的所有者。
  3. 目标 DPC 接收回调 onTransferOwnershipComplete(),并且可以利用 bundle 参数中的值进行自我配置。
  4. 如果转让出错,系统会将所有权交还给源 DPC。 如果您的源 DPC 需要确认所有权转让成功,请调用 isAdminActive() 以检查确认源 DPC 不再是活动管理员。

当工作用描述文件所有者发生变化时,所有运行在该描述文件中的应用都会收到 ACTION_PROFILE_OWNER_CHANGED 广播。 当设备所有者发生变化时,所有运行在托管设备上的应用都会收到 ACTION_DEVICE_OWNER_CHANGED 广播。

全托管设备上的工作用描述文件

两个以设备所有者和描述文件所有者身份运行的 DPC 实例的转让分两个阶段完成。 当个人描述文件和工作用描述文件是附属性质时,请按以下顺序完成转让:

  1. 首先,转让工作用描述文件的所有权。
  2. 等待 DeviceAdminReceiver 回调 onTransferAffiliatedProfileOwnershipComplete(),以确认工作用描述文件已转让给目标 DPC。
  3. 最后,将托管设备的所有权转让给目标 DPC。

推迟无线 (OTA) 更新

警告:推迟 OTA 更新可能阻止设备接收关键更新。

设备所有者可以将设备的 OTA 系统更新推迟长达 90 天,以在关键时期(例如节假日)冻结运行在这些设备上的操作系统版本。 系统会在任何定义的冻结期后强制执行 60 天缓冲期,以防止无限期冻结设备。

在冻结期内:

  • 设备不会收到任何有关即将到来的 OTA 更新的通知。
  • 设备不会向操作系统安装任何 OTA 更新。
  • 设备用户无法在 Settings 中手动检查有无 OTA 更新。

要设置冻结期,请调用 SystemUpdatePolicy.setFreezePeriods()。 由于冻结期每年重复,因此该时期的开始和结束日期使用从年初开始计算天数的整数表示。 开始日期必须始于任何之前冻结期结束后至少 60 天。 设备所有者可以调用 SystemUpdatePolicy.getFreezePeriods() 以获取之前在系统更新政策对象上设置的冻结期列表。 DevicePolicyManager.getSystemUpdatePolicy() 已进行了更新,以返回设备所有者设置的任何冻结期。

限制共享到工作用描述文件中

描述文件所有者可以通过添加用户限制 DISALLOW_SHARE_INTO_MANAGED_PROFILE 防止用户在设备上将个人数据共享到工作用描述文件中。 此限制可防止下列 Intent 处理和共享:

  • 个人描述文件应用与工作用描述文件应用共享数据和文件。
  • 工作用描述文件应用从个人描述文件中选取项目—例如,图片或文件。

设置此限制后,您的 DPC 仍可通过调用 addCrossProfileIntentFilter() 允许跨描述文件 Activity Intent。

硬件保护密钥和机器证书

Android P 新增了一些 API 来帮助您处理密钥和证书,让您可以组合使用密钥和证书来安全地识别设备。 运行在描述文件所有者或设备所有者模式下的 DPC 或授权证书安装程序现在可以完成下列任务:

  • 在 Android 设备的安全硬件(例如可信执行环境 [TEE] 或安全元素 [SE])中生成密钥和证书。 生成的密钥永远不会离开安全硬件,可通过 Android KeyChain 使用。 调用 DevicePolicyManager.generateKeyPair() 以提供算法(请参阅 KeyPairGenerator)以及您想认证的任何硬件 ID(例如序列号或 IMEI)。 如需了解有关安全硬件变更的更多信息,请阅读安全性更新
  • 将证书与现有的设备生成密钥关联。 调用 DevicePolicyManager.setKeyPairCertificate() 以提供现有密钥和证书链的别名—从叶证书开始,按顺序加入信任链。
  • 使用前确认安全硬件对密钥进行了保护。 要检查哪些机制保护了密钥,请执行密钥认证中的步骤。
  • 设备所有者和授权证书安装程序可能收到一份签署的声明,其中包含设备的硬件 ID 以及 Android 系统版本。 调用 DevicePolicyManager.generateKeyPair(),调用时在 idAttestationFlags 参数中传递一个或多个 ID_TYPE_BASE_INFOID_TYPE_SERIALID_TYPE_IMEIID_TYPE_MEID。 返回的证书包括认证记录中的硬件 ID。 如果您不希望包括软件 ID,请传递 0。 描述文件所有者只能接收制造商信息(通过传递 ID_TYPE_BASE_INFO)。
  • 通过调用 DevicePolicyManager.setKeyPairCertificate() 并为 isUserSelectable 参数传递 false,防止设备用户误用企业密钥。 系统未在选取器面板中包括可取消选择的证书。 在您的 DeviceAdminReceiver.onChoosePrivateKeyAlias() 回调函数中,返回企业密钥的别名,以便系统自动代表用户选择证书。

企业可以通过组合使用这些新增 API 安全地识别设备并确认其完整性,然后再提供访问权:

  1. Android 设备在安全硬件中生成新的私钥。 由于私钥永远不会离开安全硬件,因此始终保持机密状态。
  2. 设备利用该密钥创建并向服务器发送证书签名请求 (CSR)。 CSR 包括包含设备 ID 的认证记录。
  3. 服务器验证证书链(始于 Google 证书)并从认证记录中提取设备元数据。
  4. 服务器确认安全硬件对私钥实施了保护,并且设备 ID 与企业的记录相符。 服务器还可检查确认 Android 系统和补丁程序版本符合任何要求。
  5. 服务器根据 CSR 生成证书并将证书发送给设备。
  6. 设备将证书与私钥(留在安全硬件内)配对,从而使应用能够连接到企业服务。

密码黑名单

DPC 运行在设备所有者或描述文件所有者模式下时,可以禁止设备用户设置简单或常用密码和 PIN 码。 试图设置禁用密码的用户会看到一则消息,内容是其 IT 管理员已禁用常见密码,并且系统会提示用户尝试其他密码。

DPC 调用 DevicePolicyManager.setPasswordBlacklist() 以设置禁用密码黑名单。 密码黑名单不区分大小写,最多可包括 128k 字符。 每个名单都具有可帮助识别黑名单更新版本的描述性名称。 您的 DPC 可通过调用 DevicePolicyManager.getPasswordBlacklistName() 检查当前活动名单的名称。

要移除密码黑名单,请将 null 传递至 DevicePolicyManager.setPasswordBlacklist()

其他安全性 API、功能和变更

安全性日志和网络日志 ID

Android P 现在于安全性和网络活动日志中加入了 ID。 每发生一个事件,这个数字 ID 就会单调递增,让 IT 管理员可以更方便地在其日志中查找问题。 由于安全性日志和网络日志是独立的集合,因此系统会保留独立的 ID 值。

调用 SecurityEvent.getId()DnsEvent.getId()ConnectEvent.getId() 以获取 ID 值。 每当 DPC 启用日志记录或设备重新启动时,系统就会重置该 ID。 通过调用 DevicePolicyManager.retrievePreRebootSecurityLogs() 获取的安全性日志不包括这些 ID。

安全性日志记录

安全性日志记录现在会为每个 SecurityEvent 指定一个日志级别。 要获取日志级别,请调用 getLogLevel()。 此函数返回的日志级别值可能是下列值之一:LEVEL_INFOLEVEL_WARNINGLEVEL_ERROR

Android P 现在会将下表所列的事件记录在安全性日志 中。 要检查事件的标记,请调用 getTag()。 要获取事件数据,请调用 getData()

标记 | 事件说明 --|-- TAG_CERT_AUTHORITY_INSTALLED | 尝试将新的根证书安装到系统凭据存储空间中。 TAG_CERT_AUTHORITY_REMOVED | 尝试从系统凭据存储空间中移除根证书。 TAG_CRYPTO_SELF_TEST_COMPLETED | 系统完成了加密自检。 TAG_KEYGUARD_DISABLED_FEATURES_SET | 管理员应用停用了设备或工作用描述文件锁定屏幕的功能。 TAG_KEY_DESTRUCTION | 尝试删除加密密钥。 TAG_KEY_GENERATED | 尝试生成新加密密钥。 TAG_KEY_IMPORT | 尝试导入新加密密钥。 TAG_LOGGING_STARTED | 安全性日志记录已开始记录。 TAG_LOGGING_STOPPED | 安全性日志记录已停止记录。 TAG_LOG_BUFFER_SIZE_CRITICAL | 已达安全性日志缓冲区容量的 90%。 TAG_MAX_PASSWORD_ATTEMPTS_SET | 管理员应用设置了允许的不正确密码尝试次数。 TAG_MAX_SCREEN_LOCK_TIMEOUT_SET | 管理员应用设置了最长屏幕锁定超时。 TAG_MEDIA_MOUNT | 设备装载了可移动存储介质。 TAG_MEDIA_UNMOUNT | 设备卸载了可移动存储介质。 TAG_OS_SHUTDOWN | Android 系统已关机。 TAG_OS_STARTUP | Android 系统已启动。 TAG_PASSWORD_COMPLEXITY_SET | 管理员应用设置了密码复杂性要求。 TAG_PASSWORD_EXPIRATION_SET | 管理员应用设置了密码失效持续时间。 TAG_PASSWORD_HISTORY_LENGTH_SET | 管理员应用设置了密码历史记录长度,以防止用户重复使用旧密码。 TAG_REMOTE_LOCK | 管理员应用锁定了设备或工作用描述文件。 TAG_USER_RESTRICTION_ADDED | 管理员应用设置了用户限制。 TAG_USER_RESTRICTION_REMOVED | 管理员应用移除了用户限制。 TAG_WIPE_FAILURE | 尝试擦除设备或工作用描述文件失败。

工作用描述文件锁定屏幕密码

从 Android P 开始,描述文件所有者可以利用 DISALLOW_UNIFIED_PASSWORD 用户限制要求用户为其工作用描述文件设置单独的锁定屏幕密码。 要检查用户是否为其设备和工作用描述文件设置了相同的锁定屏幕密码,请调用 DevicePolicyManager.isUsingUnifiedPassword()

如果设备有单独的工作用描述文件锁定屏幕,则 DevicePolicyManager.setMaximumTimeToLock() 现在只会为工作用描述文件而不是整个设备设置锁定屏幕超时。

开发者工具访问权

为帮助保留工作用描述文件中的工资数据,Android 调试桥 (adb) 工具无法访问工作用描述文件中的目录和文件。

弃用设备管理器政策

Android P 将下列政策标记为使用设备管理器的 DPC 的已弃用政策。 在 Android P 中,这些政策仍可像以前那样正常工作。 从 Android Q 版本开始,设备管理器调用这些政策时将引发 SecurityException。

一些应用利用设备管理器进行用户设备管理。 例如,锁定并擦除丢失的设备。 为支持此目的,下列政策仍可使用:

如需了解有关这些变更的详细信息,请阅读设备管理器弃用

精简了 QR 码登记

内置 QR 码库

Android P 自行捆绑了一个 QR 码库,以精简 QR 码设备配置。 IT 管理员不再需要手动输入 Wi-Fi 详细信息来设置设备。 从 Android P 开始,可在 QR 码内包含这些 Wi-Fi 详细信息。 当 IT 管理员使用公司所有的设备扫描 QR 码时,设备会自动连接到 Wi-Fi 并进入配置流程,无需任何额外的手动输入。

QR 码配置方法现在支持使用下列配置 extra 来指定 Wi-Fi 详细信息:

利用配置 extra 设置日期和时区

QR 码配置方法现在支持使用配置 extra 在设备上设置时间和时区:

用户移除说明

移除工作用描述文件或次要用户时,设备管理器可以向用户显示个性化消息。 该消息有助于设备用户了解,其 IT 管理员移除了工作用描述文件或次要用户。 调用 wipeData(int, CharSequence) 并提供简短的说明性消息。 当调用者是主要用户或设备所有者时,系统不会显示消息,并开始恢复设备的出厂设置。

面向附属描述文件所有者的新函数

下列函数现在可供附属描述文件所有者使用:

了解详情

要了解可能影响您的应用的其他变更,请阅读 Android P 行为变更