Android 10 中的企业功能新变化

本页将简要介绍 Android 10 中引入的新企业 API、功能和行为变更。

归公司所有的设备的工作资料

Android 10 针对只需要工作资料的公司自有设备引入了新的配置和证明功能。

改进的工作资料配置工具

您可以在使用二维码零触摸注册的 Android 10 及更高版本上配置工作资料。在配置公司自有设备期间,新的 intent extra 可让设备政策控制器应用 (DPC) 启动工作资料或全代管式设置。创建工作资料或建立全面管理后,DPC 必须启动政策合规性屏幕以强制执行任何初始政策。

在 DPC 的清单文件中,为 activity 中的 GET_PROVISIONING_MODE 声明一个新的 intent 过滤器,并添加 BIND_DEVICE_ADMIN 权限,以防止任意应用启动该 activity。例如:

<activity
    android:name=".GetProvisioningModeActivity"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <intent-filter>
        <action
            android:name="android.app.action.GET_PROVISIONING_MODE" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

在配置期间,系统会启动与 intent 过滤器关联的 activity。此 activity 旨在指定管理模式(工作资料或全代管式)。

在确定适合设备的管理模式之前检索配置 extra 可能很有用。activity 可以调用 getIntent() 来检索以下内容:

DPC 还可以创建新的结果 intent 并向其添加以下 extra:

如需在设备上设置管理模式,请调用 putExtra(DevicePolicyManager.EXTRA_PROVISIONING_MODE,desiredProvisioningMode),其中 desiredProvisioningMode 为:

  • 工作资料:PROVISIONING_MODE_MANAGED_PROFILE
  • 完全托管:PROVISIONING_MODE_FULLY_MANAGED_DEVICE

通过 setResult(RESULT_OK, Intent) 将配置详细信息发送回设置,以完成工作资料或全代管式配置,并使用 finish() 关闭所有活动屏幕。

配置完成后,DPC 可以使用新的 intent 启动其合规性屏幕并强制执行初始政策设置。在工作资料设备上,合规性屏幕会显示在工作资料中。您的 DPC 必须确保向用户显示其合规性屏幕,即使用户退出设置流程也是如此。

在 DPC 的清单文件中,为 activity 中的 ADMIN_POLICY_COMPLIANCE 声明一个新的 intent 过滤器,并添加 BIND_DEVICE_ADMIN 权限,以防止任意应用启动该 activity。例如:

<activity
    android:name=".PolicyComplianceActivity"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <intent-filter>
        <action android:name="android.app.action.ADMIN_POLICY_COMPLIANCE" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

您的 DPC 必须使用以下新的 intent,而不是监听 ACTION_PROFILE_PROVISIONING_COMPLETE 广播。

与 intent 过滤器关联的 activity 可以调用 getIntent() 来检索 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE。遵守政策规定后,ADMIN_POLICY_COMPLIANCE 必须返回 setResult(RESULT_OK, Intent),并使用 finish() 关闭所有处于活动状态的屏幕。

完全托管设备会将用户返回到主屏幕。工作资料设备会在将用户返回到主屏幕之前提示用户添加其个人帐号。

工作资料设备 ID 证明

DPC 设为使用零触摸注册方式配置的工作资料的管理员,可以获得经过安全硬件认证的设备 ID,例如 IMEI 或制造商的序列号。设备必须包含安全硬件(例如可信执行环境 (TEE) 或安全元件 (SE)),并且支持设备 ID 认证和零触摸注册。

工作资料的管理员组件可以调用 DevicePolicyManager.generateKeyPair(),为 idAttestationFlags 参数传递 ID_TYPE_SERIALID_TYPE_IMEIID_TYPE_MEID 中的一项或多项。

要详细了解如何提取和验证设备 ID,请参阅使用密钥认证功能验证由硬件支持的密钥对

工作资料改进

我们推出了新的 API,以便支持跨资料查看日历以及在设备范围内阻止安装未知来源的应用。

工作资料、设备范围的未知来源

从 Google Play(或其他受信任的应用商店)以外的来源下载的应用称为未知来源的应用。在 Android 10 中,工作资料管理员可以通过添加新的用户限制 DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY,阻止任何用户或资料在设备上任何位置安装来自未知来源的应用。不过,添加此限制后,设备用户仍然可以使用 adb 安装应用。

为防止用户错误地安装来自未知来源的应用,我们建议您添加此用户限制,因为它不需要安装 Google Play 服务。如果您想支持较低版本的 Android,可以为 Google Play 设置托管配置值

只能使用工作资料允许的输入设备

当工作资料管理员调用 DevicePolicyManager.setPermittedInputMethods() 时,用户只能使用工作资料内(而非整个设备)内允许的输入法,从而让用户能够完全控制设备个人端的输入法。

擦除工作资料,但不通知用户

DevicePolicyManager.wipeData() 添加了 WIPE_SILENTLY 标志。如果设置了此标志,则在使用 wipeData() 擦除其工作资料后,用户不会收到通知。

针对完全托管设备的新功能

Android 10 针对全代管式设备引入了新功能和 API,包括手动系统更新、扩展二维码和 NFC 配置以包含 EAP Wi-Fi 网络的凭据,以及支持 DNS over TLS。

手动安装系统更新

在 Android 10 中,完全受管设备的管理员可以通过系统更新文件安装系统更新。手动系统更新允许 IT 管理员执行以下操作:

  • 先在少量设备上测试更新,然后再广泛安装该更新。
  • 避免在带宽有限的网络上重复下载。
  • 错开安装,或仅在未使用设备时更新设备。

首先,IT 管理员应设置推迟的系统更新政策以延迟自动安装(如果需要)。接下来,设备的 DPC 使用指向设备制造商系统更新文件的路径调用 installSystemUpdate()。传递 InstallSystemUpdateCallback 对象,系统可以使用该对象报告在设备重启前发生的错误。如果出现问题,系统会调用 onInstallUpdateError() 并显示错误代码。

设备重启后,DPC 需要使用版本 API(例如 Build.FINGERPRINT)确认安装成功。如果更新失败,请向 IT 管理员报告失败情况。

EAP WLAN 配置

在 Android 10 中,用于配置设备的二维码和 NFC 数据可以包含 EAP 配置和凭据(包括证书)。当用户扫描二维码或点按 NFC 标签时,设备会使用 EAP 自动向本地 Wi-Fi 网络进行身份验证,并启动配置过程,无需任何额外的手动输入。

如需使用 EAP 对 Wi-Fi 进行身份验证,请添加值为 "EAP"EXTRA_PROVISIONING_WIFI_SECURITY_TYPE extra。如需指定 EAP 身份验证,可以将以下配置 extra 添加到您的 intent 中:

私人 DNS 支持

组织可以使用 DNS over TLS(在 Android 设备上称为专用 DNS)避免泄露 DNS 查询,包括内部主机名的查询。完全受管设备的管理员组件可以控制设备的专用 DNS 设置。如需设置专用 DNS 模式,请调用:

当您的 DPC 调用其中任一方法时,如果调用成功,系统会返回 PRIVATE_DNS_SET_NO_ERROR。否则,将返回错误。

如需检索设备上的专用 DNS 模式和主机集,请调用 getGlobalPrivateDnsMode()getGlobalPrivateDnsHost()。您可以通过添加 DISALLOW_CONFIG_PRIVATE_DNS 用户限制来防止用户更改专用 DNS 设置。

VPN 锁定模式豁免

VPN 锁定模式可让 DPC 屏蔽任何不使用 VPN 的网络流量。完全受管设备和工作资料的管理员可以豁免应用进入锁定模式。豁免的应用默认使用 VPN,但如果 VPN 不可用,会自动连接到其他网络。被明确拒绝访问 VPN 的豁免应用将仅使用其他网络。

如需豁免应用进入锁定模式,请调用新的 DevicePolicyManager 方法 setAlwaysOnVpnPackage(),该方法接受已豁免应用软件包的列表。调用此方法时,必须在设备上安装 DPC 添加的所有应用软件包。如果某个应用被卸载后重新安装,则必须再次豁免该应用。若要让以前免于进入锁定模式的应用,请调用 getAlwaysOnVpnLockdownWhitelist()

为了帮助完全受管设备和工作资料的管理员获取锁定模式状态,Android 10 添加了 isAlwaysOnVpnLockdownEnabled() 方法。

新的委托范围

Android 10 扩展了 DPC 可委托给其他更专业应用的函数列表。Android 将执行任务所需的 API 方法分成各个范围。如需委托某个范围,请调用 setDelegatedScopes() 并传递以下一个或多个范围:

Android 10 为受委托应用引入了一个新的 DelegatedAdminReceiver 类。系统使用此广播接收器向受委托应用发送类似 DPC 的回调。已受委托网络活动日志记录和证书选择的应用应实现此类。如需将此组件添加到受委托应用,请按以下步骤操作:

  1. DelegatedAdminReceiver 的子类添加到受委托应用中。
  2. 在应用清单中声明 <receiver>,并为每个回调添加一个 intent 过滤器操作。例如,ACTION_NETWORK_LOGS_AVAILABLEACTION_CHOOSE_PRIVATE_KEY_ALIAS
  3. 使用 BIND_DEVICE_ADMIN 权限保护广播接收器。

以下代码段显示了同时处理网络日志记录和证书选择的单个委托应用的应用清单:

<receiver android:name=".app.DelegatedAdminReceiver"
        android:permission="android.permission.BIND_DELEGATED_ADMIN">
    <intent-filter>
        <action android:name="android.app.admin.action.NETWORK_LOGS_AVAILABLE">
        <action android:name="android.app.action.CHOOSE_PRIVATE_KEY_ALIAS">
    </intent-filter>
    </receiver>

网络活动日志记录

为了帮助组织检测和跟踪恶意软件,DPC 可以记录系统进行的 TCP 连接和 DNS 查询。在 Android 10 中,全代管式设备的管理员可以将网络日志记录委托给专门的应用。

如需在系统提供一批日志后检索网络日志,受委托应用应首先创建 DelegatedAdminReceiver 的子类(如前所述)。按照检索日志中的指南,在您的子类中实现 onNetworkLogsAvailable() 回调。

委托应用可以调用以下 DevicePolicyManager 方法(为 admin 参数传递 null):

为了避免丢失日志,如果计划委托给其他应用,则 DPC 不应启用网络日志记录。委托应用应启用和收集网络日志。在 DPC 委托网络日志记录后,它将不会再收到任何 onNetworkLogsAvailable() 回调。

如需了解如何报告受委托应用的网络活动日志记录,请阅读开发者指南网络活动日志记录

证书选择

在 Android 10 中,完全受管设备、工作资料和次要用户的管理员可以将证书选择委托给专用的应用。

如需选择证书别名,受委托应用应首先创建 DelegatedAdminReceiver 的子类(如前所述)。在您的子类中,实现 onChoosePrivateKeyAlias() 回调并返回首选证书的别名,或者,如需提示用户选择证书,则返回 null

弃用设备管理政策

Android 10 禁止应用和 DPC 应用旧版设备管理政策。我们建议客户和合作伙伴改用全代管式设备或工作资料。设备管理员以 Android 10 为目标平台时,以下政策会抛出 SecurityException

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

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

应用的新功能

以 Android 10 为目标平台的应用可以查询在设备上设置的屏幕锁定复杂度,然后显示机密数据或启动关键功能。调用 KeyChain API 的应用将从行为改进中受益,并且我们还针对 VPN 应用推出了新功能。

屏幕锁定安全系数检查

从 Android 10 开始,具有关键功能且需要屏幕锁定的应用可以查询设备或工作资料的屏幕锁定复杂度。需要更严格的屏幕锁定方式的应用可以将用户定向到系统屏幕锁定设置,以便用户更新其安全设置。

要检查屏幕锁定的安全系数,请执行以下操作:

如需启动系统屏幕锁定设置,请结合使用 ACTION_SET_NEW_PASSWORD 和 extra EXTRA_PASSWORD_COMPLEXITY - 不符合 intent extra 中指定的复杂度的选项会灰显。用户可以从可用的屏幕锁定选项中进行选择,也可以退出屏幕。

最佳实践:在启动系统屏幕锁定页面之前,在应用中显示消息。当应用恢复时,请再次调用 DevicePolicyManager.getPasswordComplexity()。如果仍需要更严格的屏幕锁定设置,请限制访问权限,而不是反复提示用户更新其安全设置。

VPN 应用中的 HTTP 代理支持

在 Android 10 中,VPN 应用可以为其 VPN 连接设置 HTTP 代理。如需添加 HTTP 代理,VPN 应用必须先使用主机和端口配置 ProxyInfo 实例,然后再调用 VpnService.Builder.setHttpProxy()。系统和许多网络库使用此代理设置,但系统不会强制应用代理 HTTP 请求。

如需查看展示如何设置 HTTP 代理的示例代码,请参阅 ToyVPN 示例应用。

VPN 服务模式

VPN 应用可以发现 VPN 服务是否正在运行(因为设置为始终开启的 VPN)以及锁定模式是否处于活动状态。Android 10 中添加的新方法可帮助您调整界面。例如,当始终开启的 VPN 控制服务的生命周期时,您可以停用“断开连接”按钮。

VPN 应用可以在连接到服务并建立本地接口后调用以下 VpnService 方法:

  • isAlwaysOn(),用于确认系统是否因 VPN 处于始终开启状态而启动服务
  • isLockdownEnabled(),用于确认系统是否阻止了不使用 VPN 的连接

在服务运行时,始终开启状态会保持不变,但锁定模式状态可能会更改。

Keychain 改进

Android 10 引入了与 KeyChain API 相关的多项改进。

当应用调用 KeyChain.choosePrivateKeyAlias() 时,搭载 Android 10 及更高版本的设备会根据在调用中指定的颁发者和密钥算法来过滤用户可以选择的证书列表。

例如,如果 TLS 服务器将证书请求消息作为 TLS 握手的一部分发送,并且浏览器调用 KeyChain.choosePrivateKeyAlias(),则证书选择提示仅包含与颁发者参数匹配的选项。如果没有可用的匹配选项或设备上未安装证书,则系统不会向用户显示选择提示。

此外,在导入密钥或 CA 证书之前,KeyChain 不再需要设备设置屏幕锁定。