此页面提供了 Android 9 中可用的企业 API、功能和行为更改的概述。
工作配置文件用户界面
Android 9(API 级别 28)在默认启动器中包含用户界面更改,以帮助用户分离个人应用和工作应用。支持此功能的设备制造商可以在单独的工作和个人选项卡中呈现用户的应用。我们还通过在启动器的工作选项卡中包含一个开关,使设备用户更容易打开和关闭工作配置文件。
在预配工作配置文件和托管设备时,Android 9 包含动画插图,以帮助设备用户了解这些功能。
在配置文件之间切换应用
Android 9 包含用于在不同配置文件中启动应用的另一个实例的 API,以帮助用户在帐户之间切换。例如,电子邮件应用可以提供一个 UI,让用户在个人配置文件和工作配置文件之间切换以访问两个电子邮件帐户。如果同一应用已安装在另一个配置文件中,则所有应用都可以调用这些 API 来启动该应用的主 Activity。若要向您的应用添加跨配置文件帐户切换功能,请按照以下步骤调用 CrossProfileApps
类的 方法
- 调用
getTargetUserProfiles()
以获取可以在其中启动应用另一个实例的配置文件列表。此方法会检查应用是否已安装在这些配置文件中。 - 调用
getProfileSwitchingIconDrawable()
以获取可用于表示另一个配置文件的图标。 - 调用
getProfileSwitchingLabel()
获取本地化的提示用户切换资料的文本。 - 调用
startMainActivity()
在另一个资料中启动应用的实例。
检查要启动的主 Activity 是否在应用的清单文件中声明,并具有 ACTION_MAIN
意图操作,以及包含 CATEGORY_LAUNCHER
意图类别。
以编程方式打开或关闭工作资料
默认启动器(或具有 MANAGE_USERS
或 MODIFY_QUIET_MODE
权限的应用)可以通过调用 UserManager.requestQuietModeEnabled()
打开或关闭工作资料。您可以检查返回值以了解用户是否需要确认其凭据才能更改状态。由于更改可能不会立即发生,因此请侦听 ACTION_MANAGED_PROFILE_AVAILABLE
或 ACTION_MANAGED_PROFILE_UNAVAILABLE
广播,以了解何时更新用户界面。
您的应用可以通过调用 UserManager.isQuietModeEnabled()
检查工作资料的状态。
将任何应用锁定到设备
从 Android 9 开始,设备所有者和资料所有者(辅助用户的资料所有者)可以通过将应用置于锁定任务模式,将任何应用锁定到设备的屏幕。以前,应用开发者必须在其应用中添加对锁定任务模式的支持。Android 9 还将锁定任务 API 扩展到非关联辅助用户的资料所有者。请按照以下步骤将应用锁定到屏幕
- 调用
DevicePolicyManager.setLockTaskPackages()
以允许将应用列入锁定任务模式的白名单。 - 调用
ActivityOptions.setLockTaskEnabled()
以将列入白名单的应用启动到锁定任务模式。
要停止锁定任务模式下的应用,请使用 DevicePolicyManager.setLockTaskPackages()
从锁定任务模式白名单中删除该应用。
启用系统 UI 功能
启用锁定任务模式后,设备所有者和资料所有者可以通过调用 DevicePolicyManager.setLockTaskFeatures()
并传递以下功能标志的位字段来启用设备上的某些系统 UI 功能
LOCK_TASK_FEATURE_NONE
LOCK_TASK_FEATURE_SYSTEM_INFO
LOCK_TASK_FEATURE_HOME
LOCK_TASK_FEATURE_NOTIFICATIONS
只能与LOCK_TASK_FEATURE_HOME
结合使用。LOCK_TASK_FEATURE_KEYGUARD
LOCK_TASK_FEATURE_OVERVIEW
只能与LOCK_TASK_FEATURE_HOME
结合使用。LOCK_TASK_FEATURE_GLOBAL_ACTIONS
您可以调用 DevicePolicyManager.getLockTaskFeatures()
获取启用锁定任务模式时设备上可用功能的列表。当设备退出锁定任务模式时,它将恢复到其他设备策略规定的状态。
抑制错误对话框
在某些环境(例如零售演示或公共信息显示)中,您可能不希望向用户显示错误对话框。设备策略控制器 (DPC) 可以通过添加 DISALLOW_SYSTEM_ERROR_DIALOGS
用户限制来抑制崩溃或无响应应用的系统错误对话框。此限制在由设备所有者应用时会影响所有对话框,但在由资料所有者应用时,仅会抑制在主用户或辅助用户中显示的错误对话框。此限制不影响工作资料。
在 Android 9 中,以 沉浸式全屏模式 运行的应用在锁定任务模式下不会显示提醒气泡。提醒气泡是向用户(在首次启动时)显示的面板,说明如何退出沉浸式模式。
支持专用设备上的多个用户
Android 9 引入了临时用户的概念,用于专用设备(以前称为 COSU 设备)。临时用户是短期用户,用于多个用户共享单个专用设备的情况。这包括图书馆或酒店入住亭等设备上的公共用户会话,以及设备上固定用户集之间的持久会话,例如轮班工人。
临时用户应在后台创建。它们作为设备上的辅助用户创建,并在停止、切换或设备重新启动时删除(以及关联的应用和数据)。要创建临时用户,设备所有者可以
- 在调用
DevicePolicyManager.createAndManageUser()
时设置MAKE_USER_EPHEMERAL
标志。 - 调用
DevicePolicyManager.startUserInBackground()
在后台启动临时用户。
请注意,面向 Android 9 的应用在调用 createAndManageUser()
时应捕获 UserManager.UserOperationException
。调用异常的 getUserOperationResult()
方法以了解未创建用户的原因。
接收事件通知
DeviceAdminReceiver
接收以下事件的通知
onUserStarted()
:在用户启动时调用。onUserSwitched()
:在用户切换完成后调用。onUserStopped()
:与onUserRemoved()
一起在用户停止或注销时调用。
向用户显示事件消息
设备所有者可以配置在用户开始和结束其会话时显示给用户的消息
- 使用
DevicePolicyManager.setStartUserSessionMessage()
设置在用户会话开始时显示给用户的消息。要检索消息,请调用DevicePolicyManager.getStartUserSessionMessage()
。 - 使用
DevicePolicyManager.setEndUserSessionMessage()
设置在用户会话结束时显示给用户的消息。要检索消息,请调用DevicePolicyManager.getEndUserSessionMessage()
。
注销和停止用户
设备所有者可以使用 DevicePolicyManager.setLogoutEnabled()
指定是否为辅助用户启用注销。要检查注销是否已启用,请调用 DevicePolicyManager.isLogoutEnabled()
。
辅助用户的资料所有者可以调用 DevicePolicyManager.logoutUser()
以停止辅助用户并切换回主用户。
设备所有者可以使用 DevicePolicyManager.stopUser()
停止指定的辅助用户。
包缓存
为了简化具有固定用户集的共享设备上的用户配置(例如轮班工人的设备),可以缓存多用户会话所需的包
调用
DevicePolicyManager.setKeepUninstalledPackages()
以指定要作为 APK 保留的包列表。要检索这些包的列表,请调用DevicePolicyManager.getKeepUninstalledPackages()
。调用
DevicePolicyManager.installExistingPackage()
安装通过setKeepUninstalledPackages()
删除后保留的包。
其他方法和常量
Android 9 还包含以下方法和常量,以进一步支持共享设备上的用户会话
DevicePolicyManager.getSecondaryUsers()
获取设备上所有辅助用户的列表。DISALLOW_USER_SWITCH
是您可以通过调用DevicePolicyManager.addUserRestriction()
启用的用户限制,以阻止用户切换。LEAVE_ALL_SYSTEM_APPS_ENABLED
是DevicePolicyManager.createAndManageUser()
可用的标志。设置后,在用户配置期间不会禁用系统应用。UserManager.UserOperationException
是在无法创建用户时由DevicePolicyManager.createAndManageUser()
引发的异常——异常包含失败的原因。
清除包数据并删除帐户
设备所有者和资料所有者可以调用 clearApplicationUserData()
清除给定包的用户数据。要从 AccountManager
中删除帐户,设备和资料所有者可以调用 removeAccount()
。
用户限制和对设置的更多控制
Android 9 引入了一套针对 DPC 的用户限制,以及在设备上配置 APN、时间和时区以及系统设置的功能。
配置 APN
设备所有者可以使用 DevicePolicyManager
类中的以下方法来配置设备上的 APN
addOverrideApn()
updateOverrideApn()
removeOverrideApn()
getOverrideApns()
setOverrideApnEnabled()
isOverrideApnEnabled()
配置时间和时区
设备所有者可以使用 DevicePolicyManager
类中的以下方法来设置设备上的时间和时区
对重要设置实施用户限制
Android 9 添加了用户限制以禁用系统功能和设置。要添加限制,请使用以下 UserManager
常量之一调用 DevicePolicyManager.addUserRestriction()
DISALLOW_AIRPLANE_MODE
DISALLOW_AMBIENT_DISPLAY
DISALLOW_CONFIG_BRIGHTNESS
DISALLOW_CONFIG_DATE_TIME
DISALLOW_CONFIG_LOCATION
DISALLOW_CONFIG_SCREEN_TIMEOUT
DISALLOW_PRINTING
如果在设备上实施了 DISALLOW_CONFIG_BRIGHTNESS
和 DISALLOW_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()
来检索此数据。
转移托管设备或工作配置文件的所有权的步骤相同
- 源 DPC 检查目标 DPC 的版本是否支持迁移,并确认目标 DPC 的应用签名是否与预期值匹配。
- 源 DPC 调用
transferOwnership()
以启动转移。 - 系统使目标 DPC 成为 活动管理员 并将其设置为托管设备或工作配置文件的所有者。
- 目标 DPC 接收回调
onTransferOwnershipComplete()
,并可以使用bundle
参数中的值进行配置。 - 如果转移过程中出现问题,系统会将所有权恢复到源 DPC。如果您的源 DPC 需要确认所有权转移是否成功,请调用
isAdminActive()
以检查源 DPC 是否不再是活动管理员。
当配置文件所有者更改时,在工作配置文件中运行的所有应用都会收到 ACTION_PROFILE_OWNER_CHANGED
广播。当设备所有者更改时,在托管设备上运行的应用会收到 ACTION_DEVICE_OWNER_CHANGED
广播。
完全托管设备上的工作配置文件
以设备所有者和配置文件所有者身份运行的两个 DPC 实例的转移分两个阶段进行。当个人资料和工作配置文件 关联 时,请按以下顺序完成转移
- 首先,转移工作配置文件的所有权。
- 等待
DeviceAdminReceiver
回调onTransferAffiliatedProfileOwnershipComplete()
以确认工作配置文件已转移到目标 DPC。 - 最后,将托管设备的所有权转移到目标 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 或 委托证书安装程序 可以完成以下任务
- 在 Android 设备的安全硬件(例如可信执行环境 (TEE) 或安全元素 (SE))中生成密钥和证书。生成的密钥永远不会离开安全硬件,并且可以从 Android KeyChain 中使用。调用
DevicePolicyManager.generateKeyPair()
提供算法(请参阅KeyPairGenerator
)以及您想要证明的任何硬件 ID,例如序列号或 IMEI。要了解有关安全硬件更改的更多信息,请参阅 Android 9 安全增强功能。 - 将证书与现有的设备生成的密钥关联。调用
DevicePolicyManager.setKeyPairCertificate()
提供现有密钥的别名和证书链——从叶子证书开始并按顺序包含信任链。 - 在使用密钥之前,确认安全硬件是否保护了密钥。要检查哪些机制保护密钥,请按照 密钥证明 中的步骤操作。
- 设备所有者和委托证书安装程序可以接收设备硬件 ID 和 Android 系统版本的签名声明。调用
DevicePolicyManager.generateKeyPair()
在idAttestationFlags
参数中传递一个或多个ID_TYPE_BASE_INFO
、ID_TYPE_SERIAL
、ID_TYPE_IMEI
或ID_TYPE_MEID
。返回的证书在证明记录中包含硬件 ID。如果您不想包含硬件 ID,请传递0
。配置文件所有者只能接收制造商信息(通过传递ID_TYPE_BASE_INFO
)。要检查设备是否可以证明 ID,请调用isDeviceIdAttestationSupported()
。 - 通过使密钥证书不可选来防止设备用户滥用企业密钥(在非企业任务中)。系统不会在选择器面板中包含不可选的证书。在您的
DeviceAdminReceiver.onChoosePrivateKeyAlias()
回调方法中,返回企业密钥的别名,以便系统代表用户自动选择证书。要使密钥不可选,请调用以下DevicePolicyManager
方法- 调用
setKeyPairCertificate()
方法,并将isUserSelectable
参数设置为false
。 - 调用
installKeyPair (ComponentName, PrivateKey, Certificate[], String, int)
方法,并在flags
参数中省略INSTALLKEY_SET_USER_SELECTABLE
。
- 调用
通过结合这些 API,企业可以安全地识别设备并在提供访问权限之前确认其完整性。
- Android 设备会在安全硬件中生成一个新的私钥。由于私钥永远不会离开安全硬件,因此它保持秘密。
- 设备使用密钥创建并向服务器发送证书签名请求 (CSR)。CSR 包括包含设备 ID 的证明记录。
- 服务器验证证书链(根证书为 Google 证书)并从证明记录中提取设备元数据。
- 服务器确认安全硬件保护了私钥,并且设备 ID 与企业的记录匹配。服务器还可以检查 Android 系统和补丁版本是否满足任何要求。
- 服务器根据 CSR 生成证书,并将证书发送到设备。
- 设备将证书与私钥(保留在安全硬件中)配对,使应用程序能够连接到企业服务。
更多安全 API、功能和更改
安全日志和网络日志的 ID
Android 9 在安全和网络活动日志中包含 ID。每个事件的数字 ID 都会单调递增,使 IT 管理员更容易发现日志中的缺口。由于安全日志和网络日志是独立的集合,因此系统会维护独立的 ID 值。
调用 SecurityEvent.getId()
、DnsEvent.getId()
或 ConnectEvent.getId()
以获取 ID 值。当 DPC 启用日志记录或设备重新启动时,系统会重置 ID。通过调用 DevicePolicyManager.retrievePreRebootSecurityLogs()
获取的安全日志不包含这些 ID。
安全日志记录
安全日志记录为每个 SecurityEvent
分配一个日志级别。要获取日志级别,请调用 getLogLevel()
。此方法返回一个日志级别值,可以是以下之一:LEVEL_INFO
、LEVEL_WARNING
或 LEVEL_ERROR
。
Android 9 将下表中列出的事件记录到 安全日志 中。要检查事件的标签,请调用 getTag()
。要检索事件数据,请调用 getData()
。
工作配置文件锁屏挑战
从 Android 9 开始,配置文件所有者可以使用 DISALLOW_UNIFIED_PASSWORD
用户限制要求用户为其工作配置文件设置单独的锁屏挑战。要检查用户是否为其设备和工作配置文件设置了相同的锁屏挑战,请调用 DevicePolicyManager.isUsingUnifiedPassword()
。
如果设备具有单独的工作配置文件锁屏,则 DevicePolicyManager.setMaximumTimeToLock()
只会为工作配置文件设置锁屏超时时间,而不是为整个设备设置。
开发者工具访问
为了帮助将工作数据保存在工作配置文件中,Android Debug Bridge (adb) 工具无法访问工作配置文件中的目录和文件。
支持更多生物识别选项
Android 9 在工作配置文件的锁屏中增加了对生物识别硬件身份验证的细粒度控制。使用 KEYGUARD_DISABLE_FACE
和 KEYGUARD_DISABLE_IRIS
调用现有的 DevicePolicyManager.setKeyguardDisabledFeatures()
方法。要禁用设备提供的全部生物识别身份验证方法,请添加 KEYGUARD_DISABLE_BIOMETRICS
。
设备管理员策略的弃用
Android 9 将以下列出的策略标记为使用 设备管理员 的 DPC 已弃用。这些策略在 Android 9 中继续像以前一样发挥作用。从 Android 10 版本开始,当设备管理员调用相同的策略时,将抛出 SecurityException。
USES_POLICY_DISABLE_CAMERA
USES_POLICY_DISABLE_KEYGUARD_FEATURES
USES_POLICY_EXPIRE_PASSWORD
USES_POLICY_LIMIT_PASSWORD
某些应用程序使用设备管理员进行消费者设备管理。例如,锁定和擦除丢失的设备。以下策略将继续可用以启用此功能
有关这些更改的更多信息,请阅读 设备管理员弃用。
简化的二维码注册
内置二维码库
Android 9 捆绑了一个二维码库来简化二维码设备配置。IT 管理员不再需要手动输入 Wi-Fi 详细信息来设置设备。相反,使用 Android 9,可以将这些 Wi-Fi 详细信息包含在二维码中。当 IT 管理员使用公司拥有的设备扫描二维码时,设备会自动连接到 Wi-Fi 并进入配置过程,无需任何其他手动输入。
二维码配置方法支持以下配置额外信息以指定 Wi-Fi 详细信息
EXTRA_PROVISIONING_WIFI_HIDDEN
EXTRA_PROVISIONING_WIFI_PAC_URL
EXTRA_PROVISIONING_WIFI_PASSWORD
EXTRA_PROVISIONING_WIFI_PROXY_BYPASS
EXTRA_PROVISIONING_WIFI_PROXY_HOST
EXTRA_PROVISIONING_WIFI_PROXY_PORT
EXTRA_PROVISIONING_WIFI_SECURITY_TYPE
EXTRA_PROVISIONING_WIFI_SSID
使用配置额外信息设置日期和时区
二维码配置方法支持配置额外信息以在设备上设置时间和时区
擦除数据选项
设备管理员可以在删除工作配置文件或辅助用户时向用户显示个性化消息。该消息帮助设备用户了解其 IT 管理员删除了工作配置文件或辅助用户。调用 wipeData(int, CharSequence)
并提供简短的解释性消息。当主要用户或设备所有者调用时,系统不会显示消息并开始设备的出厂重置。
要从嵌入式 eUICC SIM 中删除订阅数据,请调用 wipeData()
并在 flags
参数中包含 WIPE_EUICC
。
关联配置文件所有者的方法
以下方法可供 关联配置文件 所有者使用
DevicePolicyManager.setKeyguardDisabled()
DevicePolicyManager.setStatusBarDisabled()
PackageInstaller.createSession()