本页将简要介绍 Android 8.0(API 级别 26)中引入的新 API、功能和行为变更,这些变更会影响企业中的 Android。
新 API 和功能
资料所有者和设备所有者管理模式比以往任何时候都更强大、更高效且更易于配置。我们还实现了全新的部署场景,即在完全受管设备上设置工作资料。以下各部分介绍了这些功能以及其他功能。
完全托管设备中的工作资料
在 Android 8.0 中,完全受管设备还可以设置工作资料。这使企业能够分离应用和政策,同时保持对这两种资料的控制和可见性。现有设备所有者或其他设备政策控制器 (DPC) 可以创建受管理资料。
借助完全受管设备上的工作资料,设备所有者可以:
- 通过调用
EXTRA_PROVISIONING_SKIP_USER_CONSENT
创建受管理资料,而无需用户与之互动。 - 当创建或移除次要用户或受管理资料时接收通知。回调是
onUserAdded()
和onUserRemoved()
。 - 阻止其他 DPC 使用
DISALLOW_ADD_MANAGED_PROFILE
创建受管理资料。此设置是 Android 8.0 中的默认设置,供新配置设备或升级到 Android 8.0 的设备的设备所有者使用。 - 设备所有者还可以使用
DISALLOW_REMOVE_MANAGED_PROFILE
阻止用户移除现有的受管理资料。
如果设备所有者和资料所有者来自同一个 APK 并且所有者是相关联的,那么它们可以相互通信(请参阅下文的用户关联部分)。
如需详细了解如何支持这种新的部署场景,请参阅完全托管设备上的工作资料的专用页面。
用户关联
当设备所有者和个人资料所有者代表同一组织时:
设备所有者和资料所有者可以在同一个 APK 中相互通信 - 他们可能希望共享政策或状态(请参阅上文中的完全受管设备上的工作资料)。
设备级功能(例如日志记录或许可名单锁定任务模式)可适用于关联用户。
关联商户 ID 与个人资料或用户关联,用于标识组织。如果关联 ID 匹配,用户就会成为关联用户。设备所有者和资料所有者使用 setAffiliationIds() 设置关联 ID。使用长且难以猜到的字符串 ID 表示组织。
关联用户的新访问权限
如果设备上的所有次要用户和配置文件都与设备所有者相关联,则可以使用以下功能:
- 使用
setSecurityLoggingEnabled()
进行安全日志记录。 - 使用
setNetworkLoggingEnabled()
进行网络活动日志记录。 - 使用
requestBugreport()
报告 bug。
之前,安全性日志记录和 bug 报告仅适用于单用户设备,或者只有一个个人资料和一个用户的设备。
通过 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
(默认值)会停用许可名单,且所有软件包都可以监听通知。若要将事件限制为系统软件包,请传递一个空的 Set。如需查看无法访问工作资料通知的应用,用户可以依次点按设置 > 应用和通知 > 特殊应用权限 > 通知使用权。
最后,资料所有者和设备所有者可以使用 getPendingSystemUpdate()
检索设备上可用的待处理系统更新的相关信息。
应用管理 API 委托
借助 API 委托,设备所有者和资料所有者可以将应用管理完全分流给其他应用。DevicePolicyManager
类提供了用于管理设备和资料所有者可向软件包授予的委托范围的方法:
setDelegatedScopes()
方法允许设备所有者和资料所有者向其他应用授予对特权 API 的访问权限。getDelegatedScopes()
方法会返回授予软件包的范围。getDelegatePackages()
会返回具有范围的软件包。
下表显示了 DevicePolicyManager
中的各种方法如何划分到不同的范围:
长时间运行的后台服务
设备和资料所有者可以创建 DeviceAdminService
的子类来创建后台服务。Android 系统会尝试确保服务在用户运行时保持运行状态。如果要运行定期任务,请考虑在创建后台服务之前使用 JobScheduler
。
控制备份服务
设备所有者可以使用 DevicePolicyManager
中的新方法切换 Android Backup Service。可使用 setBackupServiceEnabled()
启用和停用备份服务。使用 isBackupServiceEnabled()
检查备份服务状态。
Wi-Fi 代理配置
设备所有者和资料所有者可以为 Wi-Fi 网络配置 HTTP 代理服务器。使用 PAC 文件或手动设置为每个 Wi-Fi 网络配置代理服务器。如需为 WifiConfiguration
设置或移除代理,请调用其 setHttpProxy()
方法。如需获取代理设置,请调用 getHttpProxy()
。
关于管理员已停用功能的说明对话框
您的应用应向尝试使用管理员已停用功能的用户显示有用的说明。现在,所有应用都可以使用 createAdminSupportIntent()
创建一个 intent,该 intent 在传递给 startActivity(Intent)
后会显示说明对话框。intent 包括针对已停用的摄像头、已停用的屏幕截图和所有 UserManager
限制提供的自定义本地化说明。
限制蓝牙
设备所有者可以停用蓝牙,这会影响设备上的所有用户和配置文件。如需关闭蓝牙,请添加用户限制 DISALLOW_BLUETOOTH
。
设备所有者和资料所有者可以使用 DISALLOW_BLUETOOTH_SHARING
阻止用户通过蓝牙发送文件。接收文件不受影响。由设备所有者设置后,DISALLOW_BLUETOOTH_SHARING
适用于设备上的所有用户。此设置是 Android 8.0 中的默认设置,适用于升级到 Android 8.0 的设备上的新配置文件和现有配置文件。
行为变更
如果您要构建面向企业的应用(包括 DPC),则应查看 Android 8.0 中的以下行为变更,并相应地修改您的应用。
删除用户
即使启用了 DISALLOW_REMOVE_USER
,设备所有者也可以使用 removeUser()
移除次要用户和受管理资料。
安全性
身份验证
以下更改在 DevicePolicyManager
类中已生效:
- 仅当单独的工作挑战处于活动状态时,
lockNow()
方法才会锁定工作资料。 resetPassword()
方法不再可供充当设备所有者或资料所有者并以 Android 8.0 为目标平台的 DPC 使用。如果被调用,则会抛出安全异常。 DPC 应使用resetPasswordWithToken()
。注意 :以 Android 7.1.1(API 级别 25)或更低版本为目标平台的 DPC 以及仅具有设备管理员权限的 DPC 不受此变更的影响。
- 对于支持文件级加密的设备,在用户重新启动后首次解锁设备之前,
isActivePasswordSufficient()
不可用。如果在用户解锁设备之前调用,则会抛出异常。
锁定的工作资料中的数据
Android 8.0 进行了一些界面更改,以便将数据从锁定的工作资料中分离出来。
- 现在,工作资料中应用的通知可能会隐藏其内容。以前,抽屉式通知栏会显示锁定的工作资料中的工作应用的内容。
- 最近屏幕现在会显示一个普通面板,用于从锁定的工作资料运行应用。以彩色键为键的普通面板包含应用的图标和名称。以前,锁定的工作资料中的 activity 或任务会在“最近使用的应用”屏幕中显示预览。
设备完整性
ENSURE_VERIFY_APPS
标志现在是一项全局用户限制。如果设备上有任意用户存在此限制,则系统会对该设备上的所有用户强制执行应用验证。例如,如果资料所有者对工作资料设置了限制,则系统会对用户的个人资料强制执行应用验证。- 现在,除了设备所有者之外,还可以为资料所有者调用
onSystemUpdatePending()
方法。 - 使用
SystemUpdatePolicy
类时,推迟政策不再适用于安全补丁程序,因此无法再推迟安全补丁程序。但是,其他政策类型(例如自动和窗口化)的行为不受影响。 - 即使启用了
DISALLOW_FACTORY_RESET
,设备所有者也可以使用wipeData()
触发恢复出厂设置。
始终开启的 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。