此页面概述了 Android 8.0 (API 级别 26) 中引入的、影响企业 Android 的新 API、功能和行为变更。
新 API 和功能
我们已使资料所有者和设备所有者管理模式比以往任何时候都更强大、更高效且更易于配置。我们还启用了全新的部署方案——在完全受管设备上使用工作资料。这些功能及其他功能将在以下部分中进行介绍。
完全受管设备上的工作资料
在 Android 8.0 中,完全受管设备也可以拥有工作资料。这使企业能够分离应用和政策,同时保持对两个资料的控制和可见性。现有的设备所有者或不同的设备政策控制器 (DPC) 可以创建受管资料。
通过在完全受管设备上使用工作资料,设备所有者可以:
- 通过调用
EXTRA_PROVISIONING_SKIP_USER_CONSENT
,无需用户交互即可创建受管资料。 - 在创建或移除辅助用户或受管资料时接收通知。回调为
onUserAdded()
和onUserRemoved()
。 - 使用
DISALLOW_ADD_MANAGED_PROFILE
阻止其他 DPC 创建受管资料。此设置在 Android 8.0 中是新配置设备或升级到 Android 8.0 的设备上的设备所有者的默认设置。 - 设备所有者还可以使用
DISALLOW_REMOVE_MANAGED_PROFILE
阻止用户移除现有受管资料。
如果设备所有者和资料所有者来自同一个 APK 且所有者相互关联(请参阅下文的用户关联),则他们可以相互通信。
有关支持此新部署方案的更详细信息,请参阅专门介绍完全受管设备上的工作资料的页面。
用户关联
当设备所有者和资料所有者代表同一组织时:
设备和资料所有者可以在同一个 APK 内相互通信——他们可能希望共享政策或状态(请参阅上文的完全受管设备上的工作资料)。
设备范围的功能(例如日志记录或锁定任务模式的允许列表)可以应用于关联用户。
关联 ID 附加到资料或用户,用于识别组织。当关联 ID 匹配时,用户即成为关联用户。设备所有者和资料所有者使用 setAffiliationIds() 设置其关联 ID。使用长而难以猜测的字符串 ID 来表示组织。
关联用户的新访问权限
如果设备上的所有辅助用户和资料都与设备所有者关联,则可以使用以下功能:
- 使用
setSecurityLoggingEnabled()
进行安全日志记录。 - 使用
setNetworkLoggingEnabled()
进行网络活动日志记录。 - 使用
requestBugreport()
进行错误报告。
安全日志记录和错误报告以前仅适用于单用户设备或仅有一个资料和一个用户的设备。
当通过 setLockTaskPackages()
与设备所有者关联时,锁定任务模式可用于辅助用户和受管资料。有关用户关联的更详细信息,请参阅关联用户。
自定义配置免责声明
DPC 现在可以在配置期间向用户显示其自己的免责声明。使用 EXTRA_PROVISIONING_DISCLAIMERS
、EXTRA_PROVISIONING_DISCLAIMER_HEADER
和 EXTRA_PROVISIONING_DISCLAIMER_CONTENT
提供带样式的文本免责声明。DPC 的自定义免责声明显示在可折叠的“条款”列表中。
安全
资料所有者和设备所有者可以使用 setRequiredStrongAuthTimeout()
配置使用辅助身份验证方法(如指纹或信任代理)解锁设备或资料的超时期限。超时期限到期后,用户必须使用强身份验证方法(如密码、PIN 或图案)解锁设备或资料。
设备所有者和资料所有者可以使用 resetPasswordWithToken()
安全地重置设备和工作资料密码。对于支持基于文件的加密的设备,只要 DPC 了解加密,此 API 在用户解锁设备或资料之前即可用。
在支持基于文件加密的设备上锁定工作资料时,lockNow(int)
可以选择使用 FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY
逐出工作资料的主加密密钥。如果用户关闭工作资料,加密密钥也会被逐出。
此外,设备所有者可以使用 setNetworkLoggingEnabled()
开启从公司拥有设备发起的 DNS 查询和 TCP 连接的网络日志记录。有关详细信息,请参阅网络活动日志记录。
资料所有者可以限制主用户的哪些软件包可以观察工作资料通知。调用 setPermittedCrossProfileNotificationListeners()
设置通过 NotificationListenerService
接收事件的允许列表软件包。将允许的监听器设置为 null
(默认值)会禁用允许列表,所有软件包都可以监听通知。要将事件限制为系统软件包,请传入一个空集。要查看无法访问工作资料通知的应用,用户可以依次点按 Settings > Apps & notifications > Special app access > Notification access。
最后,资料所有者和设备所有者可以使用 getPendingSystemUpdate()
检索设备上可用待处理系统更新的信息。
应用管理 API 委托
API 委托使设备所有者和资料所有者能够将应用管理完全卸载到其他应用。DevicePolicyManager
类提供了管理设备和资料所有者可以授予软件包的委托范围的方法:
setDelegatedScopes()
方法允许设备所有者和资料所有者授予其他应用对特权 API 的访问权限。getDelegatedScopes()
方法返回授予软件包的范围。getDelegatePackages()
返回具有某个范围的软件包。
下表显示了 DevicePolicyManager
类中的各种方法如何组织到不同的范围中:
表 1. 范围与设备政策方法的对应关系
长时间运行的后台服务
设备和资料所有者可以子类化 DeviceAdminService
来创建后台服务。当用户正在运行时,Android 系统会尝试保持服务运行。如果您想运行周期性任务,请在创建后台服务之前考虑使用 JobScheduler
。
控制备份服务
设备所有者可以使用 DevicePolicyManager
中的新方法切换 Android 备份服务。使用 setBackupServiceEnabled()
启用和禁用备份服务。使用 isBackupServiceEnabled()
检查备份服务状态。
Wi-Fi 代理配置
设备所有者和资料所有者可以为 Wi-Fi 网络配置 HTTP 代理服务器。使用 PAC 文件或手动设置来为每个 Wi-Fi 网络配置代理服务器。要为 WifiConfiguration
设置或移除代理,请调用其 setHttpProxy()
方法。要获取代理设置,请调用 getHttpProxy()
。
管理员禁用功能的解释对话框
您的应用应向尝试使用管理员禁用功能的用户显示有用的解释。所有应用现在都可以使用 createAdminSupportIntent()
创建一个意图,该意图在传递给 startActivity(Intent)
时会显示解释对话框。意图包含针对禁用相机、禁用屏幕截图以及所有 UserManager
限制的自定义本地化解释。
限制蓝牙
设备所有者可以禁用蓝牙——这会影响设备上的所有用户和资料。要关闭蓝牙,请添加用户限制 DISALLOW_BLUETOOTH
。
设备所有者和资料所有者可以使用 DISALLOW_BLUETOOTH_SHARING
阻止用户通过蓝牙发送文件。接收文件不受影响。当由设备所有者设置时,DISALLOW_BLUETOOTH_SHARING
适用于设备上的所有用户。此设置在 Android 8.0 中是新资料和升级到 Android 8.0 的现有资料的默认设置。
行为变更
如果您正在为企业(包括 DPC)构建应用,则应查看 Android 8.0 中的以下行为变更并相应地修改您的应用。
移除用户
设备所有者可以使用 removeUser()
移除辅助用户和受管资料,即使 DISALLOW_REMOVE_USER
已启用。
安全
身份验证
DevicePolicyManager
类中已发生以下更改:
lockNow()
方法仅在单独的工作挑战处于活动状态时锁定工作资料。resetPassword()
方法不再适用于充当设备所有者或资料所有者并以 Android 8.0 为目标的 DPC。如果调用,则会抛出安全异常。相反,DPC 应使用resetPasswordWithToken()
。注意:以 Android 7.1.1 (API 级别 25) 或更低版本为目标的 DPC 以及仅具有设备管理员权限的 DPC 不受此更改影响。
- 对于支持基于文件加密的设备,
isActivePasswordSufficient()
在用户重启后首次解锁设备之前不可用。如果在用户解锁设备之前调用,则会抛出异常。
来自锁定工作资料的数据
Android 8.0 包含用户界面更改,以将数据与锁定的工作资料分离。
- 工作资料中应用的通知现在可能会隐藏其内容。此前,通知抽屉显示了来自锁定工作资料的工作应用内容。
- “最近”屏幕现在显示了一个用于从锁定工作资料运行的应用的纯色面板。最近纯色、有颜色键的面板包含应用的图标和名称。此前,来自锁定工作资料的活动或任务在“最近”屏幕中显示预览。
设备完整性
ENSURE_VERIFY_APPS
标志现在是一个全局用户限制。如果设备上的任何用户具有此限制,则会在设备上的所有用户中强制执行应用验证。例如,如果资料所有者在工作资料上设置了限制,则会在用户的个人资料上强制执行应用验证。onSystemUpdatePending()
方法现在除了为设备所有者调用外,还为资料所有者调用。- 当使用
SystemUpdatePolicy
类时,推迟政策不再适用于安全补丁,因此安全补丁不能再被推迟。但是,其他政策类型(如自动和窗口化)的行为不受影响。 - 设备所有者可以使用
wipeData()
触发恢复出厂设置,即使DISALLOW_FACTORY_RESET
已启用。
始终开启的 VPN
Android 8.0 包含用户界面更改,以帮助用户了解始终开启的 VPN 连接的状态:
- 当始终开启的 VPN 连接断开或无法连接时,用户会看到一个不可关闭的通知。点击通知会显示 VPN 配置设置。当 VPN 重新连接或用户关闭始终开启的 VPN 选项时,通知会消失。
- 始终开启的 VPN 允许使用设备的人阻止任何不使用 VPN 的网络连接。开启此选项时,“设置”应用会警告用户,在 VPN 连接之前他们将无法访问互联网。设置会提示用户继续或取消。
VPN 应用的 VpnService
现在必须在启动后调用其 startForeground()
方法。由于 Android 系统直接启动 VPN 应用的服务,因此切换到前台是应用的责任。Android 8.0 会关闭未将 VPN 服务切换到前台的 VPN 应用。
密码回调
DeviceAdminReceiver
的密码更改回调现在包含一个 user
参数,用于标识密码所属的用户或资料。新的方法签名是:
onPasswordChanged(Context, Intent, UserHandle)
onPasswordExpiring(Context, Intent, UserHandle)
onPasswordFailed(Context, Intent, UserHandle)
onPasswordSucceeded(Context, Intent, UserHandle)
每个新方法的默认实现都会调用以前的版本——丢弃用户参数。Android 8.0 弃用了以前的方法。
应用管理 API 委托
DevicePolicyManager
类中的以下方法现已弃用:
setCertInstallerPackage()
getCertInstallerPackage()
setApplicationRestrictionsManagingPackage()
getApplicationRestrictionsManagingPackage()
此外,现在可以将单个范围委托给多个软件包。换句话说,设备所有者和资料所有者可以同时授予两个不同的软件包访问同一组 API 的权限。