本页将简要介绍 Android 9 中提供的企业 API、功能和行为变更。
工作资料界面
Android 9(API 级别 28)在默认启动器中添加了界面变更,以帮助用户区分个人应用和工作应用。支持此功能的设备制造商可以在单独的工作标签页和个人标签页中呈现用户的应用。此外,我们还在启动器的工作标签页中添加了开关,让设备用户可以更轻松地开启和关闭工作资料。
![](https://developer.android.google.cn/static/images/about/versions/pie/p-work-profile.jpg?authuser=8&hl=el)
在配置工作资料和受管理设备时,Android 9 包含动画图示,可帮助设备用户了解这些功能。
跨资料切换应用
Android 9 包含一些 API,用于以不同的资料启动另一个应用实例,以帮助用户在帐号之间切换。例如,电子邮件应用可以提供一个界面,让用户能够在个人资料和工作资料之间切换,以便访问两个电子邮件帐号。所有应用都可以调用这些 API 来启动同一应用的主 activity(如果该应用已安装在另一个资料中)。如需向您的应用添加跨资料帐号切换功能,请按照以下步骤调用 CrossProfileApps
类的方法:
- 调用
getTargetUserProfiles()
获取可在其中启动应用的其他实例的配置文件列表。此方法会检查应用是否已安装在配置文件中。 - 调用
getProfileSwitchingIconDrawable()
以获取可用于代表其他资料的图标。 - 调用
getProfileSwitchingLabel()
以获取提示用户切换资料的本地化文本。 - 调用
startMainActivity()
以在另一个资料中启动应用实例。
确认您要启动的主 activity 已在应用的清单文件中声明,具有 ACTION_MAIN
intent 操作,并且包含 CATEGORY_LAUNCHER
intent 类别。
以编程方式启用或停用工作资料
默认启动器(或具有 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()
将应用从锁定任务模式许可名单中移除。
启用系统界面功能
启用锁定任务模式后,设备所有者和资料所有者可以通过调用 DevicePolicyManager.setLockTaskFeatures()
并传递以下功能标志的位字段来启用设备上的某些系统界面功能:
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()
的标志。设置后,用户配置期间将不会停用系统应用。- 如果无法创建用户,
DevicePolicyManager.createAndManageUser()
会抛出UserManager.UserOperationException
- 异常包含失败原因。
清除软件包数据并移除账号
设备所有者和资料所有者可以调用 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 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()
检索此数据。
转移受管设备或工作资料所有权的步骤相同:
- 源 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
来阻止用户将个人数据分享到设备上的工作资料中。此限制可防止下列 Intent 处理和共享:
- 个人资料应用与工作资料应用分享数据和文件。
- 工作资料应用从个人资料中选择内容(例如图片或文件)。
设置此限制后,您的 DPC 仍然可以通过调用 addCrossProfileIntentFilter()
允许跨资料 activity intent。
硬件保护的密钥和机器证书
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 调试桥 (adb) 工具无法访问工作资料中的目录和文件。
支持更多生物识别选项
Android 9 增加了对工作资料锁定屏幕中的生物识别硬件身份验证的精细控制。使用 KEYGUARD_DISABLE_FACE
和 KEYGUARD_DISABLE_IRIS
调用现有的 DevicePolicyManager.setKeyguardDisabledFeatures()
方法。如需停用设备提供的所有生物识别身份验证方法,请添加 KEYGUARD_DISABLE_BIOMETRICS
。
弃用设备管理政策
对于使用设备管理功能的 DPC,Android 9 将下列政策标记为已废弃。这些政策会继续像以前一样在 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 并进入配置流程,无需任何额外的手动输入。
二维码配置方法支持使用以下配置 extra 来指定 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
使用配置 extra 设置日期和时区
二维码配置方法支持通过配置 extra 在设备上设置时间和时区:
擦除数据选项
移除工作资料或次要用户时,设备管理员可以向用户显示个性化消息。该消息有助于设备用户了解其 IT 管理员移除了工作资料或次要用户。调用 wipeData(int, CharSequence)
并提供简短说明消息。被主要用户或设备所有者调用时,系统不会显示消息,并开始将设备恢复出厂设置。
如需从嵌入式 eUICC SIM 卡中移除订阅数据,请调用 wipeData()
,并在 flags
参数中添加 WIPE_EUICC
。
适用于关联商家资料所有者的方法
关联商家资料所有者可以使用以下方法:
DevicePolicyManager.setKeyguardDisabled()
DevicePolicyManager.setStatusBarDisabled()
PackageInstaller.createSession()