Android 9 为企业应用提供的功能

本页将简要介绍 Android 9 中提供的企业 API、功能和行为变更。

工作资料界面

Android 9(API 级别 28)在默认启动器中添加了界面变更,以帮助用户区分个人应用和工作应用。支持此功能的设备制造商可以在单独的工作标签页和个人标签页中呈现用户的应用。此外,我们还在启动器的工作标签页中添加了开关,让设备用户可以更轻松地开启和关闭工作资料。

图 1. 默认启动器的个人标签页和工作标签页(带有工作资料切换按钮)

在配置工作资料和受管理设备时,Android 9 包含动画图示,可帮助设备用户了解这些功能。

跨资料切换应用

Android 9 包含一些 API,用于以不同的资料启动另一个应用实例,以帮助用户在帐号之间切换。例如,电子邮件应用可以提供一个界面,让用户能够在个人资料和工作资料之间切换,以便访问两个电子邮件帐号。所有应用都可以调用这些 API 来启动同一应用的主 activity(如果该应用已安装在另一个资料中)。如需向您的应用添加跨资料帐号切换功能,请按照以下步骤调用 CrossProfileApps 类的方法:

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

确认您要启动的主 activity 已在应用的清单文件中声明,具有 ACTION_MAIN intent 操作,并且包含 CATEGORY_LAUNCHER intent 类别。

以编程方式启用或停用工作资料

默认启动器(或具有 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() 将应用从锁定任务模式许可名单中移除。

启用系统界面功能

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

启用锁定任务模式后,您可以调用 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 Management 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 来阻止用户将个人数据分享到设备上的工作资料中。此限制可防止下列 Intent 处理和共享:

  • 个人资料应用与工作资料应用分享数据和文件。
  • 工作资料应用从个人资料中选择内容(例如图片或文件)。

设置此限制后,您的 DPC 仍然可以通过调用 addCrossProfileIntentFilter() 允许跨资料 activity intent。

硬件保护的密钥和机器证书

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 调试桥 (adb) 工具无法访问工作资料中的目录和文件。

支持更多生物识别选项

Android 9 增加了对工作资料锁定屏幕中的生物识别硬件身份验证的精细控制。使用 KEYGUARD_DISABLE_FACEKEYGUARD_DISABLE_IRIS 调用现有的 DevicePolicyManager.setKeyguardDisabledFeatures() 方法。如需停用设备提供的所有生物识别身份验证方法,请添加 KEYGUARD_DISABLE_BIOMETRICS

弃用设备管理政策

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

一些应用利用设备管理员进行用户设备管理。例如,锁定和擦除丢失的设备。为了启用此功能,以下政策仍可使用:

如需详细了解这些变更,请参阅设备管理员弃用

简化了二维码注册流程

内置二维码库

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

二维码配置方法支持使用以下配置 extra 来指定 Wi-Fi 详细信息:

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

二维码配置方法支持通过配置 extra 在设备上设置时间和时区:

擦除数据选项

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

如需从嵌入式 eUICC SIM 卡中移除订阅数据,请调用 wipeData(),并在 flags 参数中添加 WIPE_EUICC

适用于关联商家资料所有者的方法

关联商家资料所有者可以使用以下方法: