Android 9 中针对企业应用的新增功能

此页面提供了 Android 9 中可用的企业 API、功能和行为更改的概述。

工作配置文件用户界面

Android 9(API 级别 28)在默认启动器中包含用户界面更改,以帮助用户分离个人应用和工作应用。支持此功能的设备制造商可以在单独的工作和个人选项卡中呈现用户的应用。我们还通过在启动器的工作选项卡中包含一个开关,使设备用户更容易打开和关闭工作配置文件。

图 1. 默认启动器的个人选项卡和工作选项卡以及工作配置文件开关

在预配工作配置文件和托管设备时,Android 9 包含动画插图,以帮助设备用户了解这些功能。

在配置文件之间切换应用

Android 9 包含用于在不同配置文件中启动应用的另一个实例的 API,以帮助用户在帐户之间切换。例如,电子邮件应用可以提供一个 UI,让用户在个人配置文件和工作配置文件之间切换以访问两个电子邮件帐户。如果同一应用已安装在另一个配置文件中,则所有应用都可以调用这些 API 来启动该应用的主 Activity。若要向您的应用添加跨配置文件帐户切换功能,请按照以下步骤调用 CrossProfileApps 类的 方法

  1. 调用 getTargetUserProfiles() 以获取可以在其中启动应用另一个实例的配置文件列表。此方法会检查应用是否已安装在这些配置文件中。
  2. 调用 getProfileSwitchingIconDrawable() 以获取可用于表示另一个配置文件的图标。
  3. 调用 getProfileSwitchingLabel() 获取本地化的提示用户切换资料的文本。
  4. 调用 startMainActivity() 在另一个资料中启动应用的实例。

检查要启动的主 Activity 是否在应用的清单文件中声明,并具有 ACTION_MAIN 意图操作,以及包含 CATEGORY_LAUNCHER 意图类别。

以编程方式打开或关闭工作资料

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

您的应用可以通过调用 UserManager.isQuietModeEnabled() 检查工作资料的状态。

将任何应用锁定到设备

从 Android 9 开始,设备所有者和资料所有者(辅助用户的资料所有者)可以通过将应用置于锁定任务模式,将任何应用锁定到设备的屏幕。以前,应用开发者必须在其应用中添加对锁定任务模式的支持。Android 9 还将锁定任务 API 扩展到非关联辅助用户的资料所有者。请按照以下步骤将应用锁定到屏幕

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

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

启用系统 UI 功能

启用锁定任务模式后,设备所有者和资料所有者可以通过调用 DevicePolicyManager.setLockTaskFeatures() 并传递以下功能标志的位字段来启用设备上的某些系统 UI 功能

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

抑制错误对话框

在某些环境(例如零售演示或公共信息显示)中,您可能不希望向用户显示错误对话框。设备策略控制器 (DPC) 可以通过添加 DISALLOW_SYSTEM_ERROR_DIALOGS 用户限制来抑制崩溃或无响应应用的系统错误对话框。此限制在由设备所有者应用时会影响所有对话框,但在由资料所有者应用时,仅会抑制在主用户或辅助用户中显示的错误对话框。此限制不影响工作资料。

在 Android 9 中,以 沉浸式全屏模式 运行的应用在锁定任务模式下不会显示提醒气泡。提醒气泡是向用户(在首次启动时)显示的面板,说明如何退出沉浸式模式。

支持专用设备上的多个用户

Android 9 引入了临时用户的概念,用于专用设备(以前称为 COSU 设备)。临时用户是短期用户,用于多个用户共享单个专用设备的情况。这包括图书馆或酒店入住亭等设备上的公共用户会话,以及设备上固定用户集之间的持久会话,例如轮班工人。

临时用户应在后台创建。它们作为设备上的辅助用户创建,并在停止、切换或设备重新启动时删除(以及关联的应用和数据)。要创建临时用户,设备所有者可以

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

请注意,面向 Android 9 的应用在调用 createAndManageUser() 时应捕获 UserManager.UserOperationException。调用异常的 getUserOperationResult() 方法以了解未创建用户的原因。

接收事件通知

DeviceAdminReceiver 接收以下事件的通知

向用户显示事件消息

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

注销和停止用户

设备所有者可以使用 DevicePolicyManager.setLogoutEnabled() 指定是否为辅助用户启用注销。要检查注销是否已启用,请调用 DevicePolicyManager.isLogoutEnabled()

辅助用户的资料所有者可以调用 DevicePolicyManager.logoutUser() 以停止辅助用户并切换回主用户。

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

包缓存

为了简化具有固定用户集的共享设备上的用户配置(例如轮班工人的设备),可以缓存多用户会话所需的包

  1. 调用 DevicePolicyManager.setKeepUninstalledPackages() 以指定要作为 APK 保留的包列表。要检索这些包的列表,请调用 DevicePolicyManager.getKeepUninstalledPackages()

  2. 调用 DevicePolicyManager.installExistingPackage() 安装通过 setKeepUninstalledPackages() 删除后保留的包。

其他方法和常量

Android 9 还包含以下方法和常量,以进一步支持共享设备上的用户会话

清除包数据并删除帐户

设备所有者和资料所有者可以调用 clearApplicationUserData() 清除给定包的用户数据。要从 AccountManager 中删除帐户,设备和资料所有者可以调用 removeAccount()

用户限制和对设置的更多控制

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

配置 APN

设备所有者可以使用 DevicePolicyManager 类中的以下方法来配置设备上的 APN

配置时间和时区

设备所有者可以使用 DevicePolicyManager 类中的以下方法来设置设备上的时间和时区

对重要设置实施用户限制

Android 9 添加了用户限制以禁用系统功能和设置。要添加限制,请使用以下 UserManager 常量之一调用 DevicePolicyManager.addUserRestriction()

如果在设备上实施了 DISALLOW_CONFIG_BRIGHTNESSDISALLOW_CONFIG_SCREEN_TIMEOUT,则设备所有者仍然可以使用 API DevicePolicyManager.setSystemSetting() 在设备上设置 屏幕亮度屏幕亮度模式屏幕超时 设置。

计量数据

设备所有者和配置文件所有者可以阻止应用使用设备的计量数据网络。当用户因成本、数据限制或电池和性能问题而对大量数据使用敏感时,网络被视为计量网络。要阻止应用使用计量网络,请调用 DevicePolicyManager.setMeteredDataDisabledPackages() 并传递一个包名列表。要检索当前受限制的应用,请调用 DevicePolicyManager.getMeteredDataDisabledPackages()

要了解有关 Android 中计量数据的更多信息,请阅读 优化网络数据使用

迁移 DPC

设备策略控制器 (DPC) 可以将其对设备或工作配置文件的所有权转移到另一个 DPC。您可能需要转移所有权以将某些功能迁移到 Android 管理 API,从旧版 DPC 迁移设备,或帮助 IT 管理员迁移到您的 EMM。由于您只是更改了 DPC 所有权,因此无法使用此功能更改管理类型,例如,从托管设备迁移到工作配置文件,反之亦然。

您可以使用 设备管理员策略 XML 资源来指示此版本的 DPC 支持迁移。目标 DPC 通过包含名为 <support-transfer-ownership> 的元素来指示它可以接收所有权。以下示例显示了您如何在 DPC 的设备管理员 XML 文件中执行此操作

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <support-transfer-ownership />
    <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
    </uses-policies>
</device-admin>

想要将所有权迁移到新的 DPC 应用的 DPC 可以通过调用 DeviceAdminInfo 方法 supportsTransferOwnership() 来检查目标 DPC 的版本是否支持迁移。在转移所有权之前,源 DPC 负责通过比较应用签名来验证目标 DPC。PackageManager 类包含用于处理代码签名的方法。

Android 通过所有权转移维护源 DPC 的系统和用户策略——DPC 不需要迁移这些策略。源 DPC 可以使用 PersistableBundle 中的键值对将自定义数据传递给目标 DPC。成功转移后,目标 DPC 可以通过调用 DevicePolicyManager.getTransferOwnershipBundle() 来检索此数据。

转移托管设备或工作配置文件的所有权的步骤相同

  1. 源 DPC 检查目标 DPC 的版本是否支持迁移,并确认目标 DPC 的应用签名是否与预期值匹配。
  2. 源 DPC 调用 transferOwnership() 以启动转移。
  3. 系统使目标 DPC 成为 活动管理员 并将其设置为托管设备或工作配置文件的所有者。
  4. 目标 DPC 接收回调 onTransferOwnershipComplete(),并可以使用 bundle 参数中的值进行配置。
  5. 如果转移过程中出现问题,系统会将所有权恢复到源 DPC。如果您的源 DPC 需要确认所有权转移是否成功,请调用 isAdminActive() 以检查源 DPC 是否不再是活动管理员。

当配置文件所有者更改时,在工作配置文件中运行的所有应用都会收到 ACTION_PROFILE_OWNER_CHANGED 广播。当设备所有者更改时,在托管设备上运行的应用会收到 ACTION_DEVICE_OWNER_CHANGED 广播。

完全托管设备上的工作配置文件

以设备所有者和配置文件所有者身份运行的两个 DPC 实例的转移分两个阶段进行。当个人资料和工作配置文件 关联 时,请按以下顺序完成转移

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

推迟无线 (OTA) 更新

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

在冻结期内

  • 设备不会收到任何有关挂起的 OTA 更新的通知。
  • 设备不会将任何 OTA 更新安装到操作系统。
  • 设备用户无法在“设置”中手动检查 OTA 更新。

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

限制共享到工作配置文件

配置文件所有者可以通过添加用户限制 DISALLOW_SHARE_INTO_MANAGED_PROFILE 来阻止用户将个人数据共享到设备上的工作配置文件。此限制阻止以下意图处理和共享

  • 个人资料应用与工作配置文件应用共享数据和文件。
  • 工作配置文件应用从个人资料中选择项目,例如图片或文件。

设置此限制后,您的 DPC 仍然可以通过调用 addCrossProfileIntentFilter() 允许跨配置文件 Activity 意图。

硬件安全密钥和机器证书

Android 9 添加了 API 以帮助您使用密钥和证书,您可以将它们组合起来以安全地识别设备。以配置文件所有者或设备所有者模式运行的 DPC 或 委托证书安装程序 可以完成以下任务

通过结合这些 API,企业可以安全地识别设备并在提供访问权限之前确认其完整性。

  1. Android 设备会在安全硬件中生成一个新的私钥。由于私钥永远不会离开安全硬件,因此它保持秘密。
  2. 设备使用密钥创建并向服务器发送证书签名请求 (CSR)。CSR 包括包含设备 ID 的证明记录。
  3. 服务器验证证书链(根证书为 Google 证书)并从证明记录中提取设备元数据。
  4. 服务器确认安全硬件保护了私钥,并且设备 ID 与企业的记录匹配。服务器还可以检查 Android 系统和补丁版本是否满足任何要求。
  5. 服务器根据 CSR 生成证书,并将证书发送到设备。
  6. 设备将证书与私钥(保留在安全硬件中)配对,使应用程序能够连接到企业服务。

更多安全 API、功能和更改

安全日志和网络日志的 ID

Android 9 在安全和网络活动日志中包含 ID。每个事件的数字 ID 都会单调递增,使 IT 管理员更容易发现日志中的缺口。由于安全日志和网络日志是独立的集合,因此系统会维护独立的 ID 值。

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

安全日志记录

安全日志记录为每个 SecurityEvent 分配一个日志级别。要获取日志级别,请调用 getLogLevel()。此方法返回一个日志级别值,可以是以下之一:LEVEL_INFOLEVEL_WARNINGLEVEL_ERROR

Android 9 将下表中列出的事件记录到 安全日志 中。要检查事件的标签,请调用 getTag()。要检索事件数据,请调用 getData()

标签 事件描述
TAG_CERT_AUTHORITY_INSTALLED 尝试将新的根证书安装到系统的凭据存储中。
TAG_CERT_AUTHORITY_REMOVED 尝试从系统的凭据存储中删除根证书。
TAG_CERT_VALIDATION_FAILURE Wi-Fi 证书在连接期间未能通过验证检查。
TAG_CRYPTO_SELF_TEST_COMPLETED 系统完成了加密自检。
TAG_KEYGUARD_DISABLED_FEATURES_SET 管理员应用禁用了设备或工作配置文件锁屏的功能。
TAG_KEY_DESTRUCTION 尝试删除加密密钥。
TAG_KEY_GENERATED 尝试生成新的加密密钥。
TAG_KEY_IMPORT 尝试导入新的加密密钥。
TAG_KEY_INTEGRITY_VIOLATION Android 检测到加密或身份验证密钥损坏。
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 9 开始,配置文件所有者可以使用 DISALLOW_UNIFIED_PASSWORD 用户限制要求用户为其工作配置文件设置单独的锁屏挑战。要检查用户是否为其设备和工作配置文件设置了相同的锁屏挑战,请调用 DevicePolicyManager.isUsingUnifiedPassword()

如果设备具有单独的工作配置文件锁屏,则 DevicePolicyManager.setMaximumTimeToLock() 只会为工作配置文件设置锁屏超时时间,而不是为整个设备设置。

开发者工具访问

为了帮助将工作数据保存在工作配置文件中,Android Debug Bridge (adb) 工具无法访问工作配置文件中的目录和文件。

支持更多生物识别选项

Android 9 在工作配置文件的锁屏中增加了对生物识别硬件身份验证的细粒度控制。使用 KEYGUARD_DISABLE_FACEKEYGUARD_DISABLE_IRIS 调用现有的 DevicePolicyManager.setKeyguardDisabledFeatures() 方法。要禁用设备提供的全部生物识别身份验证方法,请添加 KEYGUARD_DISABLE_BIOMETRICS

设备管理员策略的弃用

Android 9 将以下列出的策略标记为使用 设备管理员 的 DPC 已弃用。这些策略在 Android 9 中继续像以前一样发挥作用。从 Android 10 版本开始,当设备管理员调用相同的策略时,将抛出 SecurityException。

某些应用程序使用设备管理员进行消费者设备管理。例如,锁定和擦除丢失的设备。以下策略将继续可用以启用此功能

有关这些更改的更多信息,请阅读 设备管理员弃用

简化的二维码注册

内置二维码库

Android 9 捆绑了一个二维码库来简化二维码设备配置。IT 管理员不再需要手动输入 Wi-Fi 详细信息来设置设备。相反,使用 Android 9,可以将这些 Wi-Fi 详细信息包含在二维码中。当 IT 管理员使用公司拥有的设备扫描二维码时,设备会自动连接到 Wi-Fi 并进入配置过程,无需任何其他手动输入。

二维码配置方法支持以下配置额外信息以指定 Wi-Fi 详细信息

使用配置额外信息设置日期和时区

二维码配置方法支持配置额外信息以在设备上设置时间和时区

擦除数据选项

设备管理员可以在删除工作配置文件或辅助用户时向用户显示个性化消息。该消息帮助设备用户了解其 IT 管理员删除了工作配置文件或辅助用户。调用 wipeData(int, CharSequence) 并提供简短的解释性消息。当主要用户或设备所有者调用时,系统不会显示消息并开始设备的出厂重置。

要从嵌入式 eUICC SIM 中删除订阅数据,请调用 wipeData() 并在 flags 参数中包含 WIPE_EUICC

关联配置文件所有者的方法

以下方法可供 关联配置文件 所有者使用