Android 10 中针对企业的更新

本页面概述了 Android 10 中引入的新企业 API、功能和行为更改。

公司拥有设备的工作配置文件

Android 10 为仅需要工作配置文件的公司拥有设备引入了新的预配和证明功能。

改进的工作配置文件预配工具

您可以使用 二维码零接触 预配在 Android 10 及更高版本设备上注册的工作配置文件。在预配公司拥有设备时,新的 intent extra 允许设备策略控制器应用 (DPC) 启动工作配置文件 *或* 全面管理设置。在创建工作配置文件或建立全面管理后,DPC 必须启动策略合规性屏幕以强制执行任何初始策略。

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

<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>

在预配期间,系统会启动与意图过滤器关联的活动。该活动的目的是指定管理模式(工作配置文件或全面管理)。

在确定设备的适当管理模式之前,检索预配额外信息可能很有用。该活动可以调用 getIntent() 来检索以下内容

DPC 还可以创建一个新的结果意图并向其中添加以下额外信息

要设置设备上的管理模式,请调用 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 清单文件中,为活动声明一个针对 ADMIN_POLICY_COMPLIANCE 的新意图过滤器,并添加 BIND_DEVICE_ADMIN 权限以防止任意应用程序启动该活动。例如

<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 广播。

与意图过滤器关联的活动可以调用 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,包括手动系统更新、扩展 QR 码和 NFC 配置以包括 EAP Wi-Fi 网络的凭据,以及对 DNS over TLS 的支持。

手动系统更新安装

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

  • 在广泛安装更新之前,在少量设备上测试更新。
  • 避免在带宽有限的网络上进行重复下载。
  • 交错安装,或者仅在设备未使用时更新设备。

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

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

EAP Wi-Fi 配置

在 Android 10 中,用于设备配置的 QR 码和 NFC 数据可以包含 EAP 配置和凭据,包括证书。当某人扫描 QR 码或点击 NFC 标记时,设备会自动使用 EAP 认证到本地 Wi-Fi 网络,并开始配置过程,无需任何额外的手动输入。

要使用 EAP 认证 Wi-Fi,请添加一个 EXTRA_PROVISIONING_WIFI_SECURITY_TYPE 额外的值,值为 "EAP"。要指定 EAP 身份验证,您可以将以下配置额外的值添加到您的意图

私有 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>,为每个回调添加一个意图过滤器操作。例如,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 方法(将 null 传递给 admin 参数)

为了避免丢失日志,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_PASSWORD_COMPLEXITY - 不符合意图额外信息中指定的复杂度的选项将被灰显。用户可以选择可用的屏幕锁定选项或退出屏幕。

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

VPN 应用程序中的 HTTP 代理支持

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

有关显示如何设置 HTTP 代理的示例代码,请参见 ToyVPN 示例应用程序。

VPN 服务模式

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

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

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

始终处于开启状态的 VPN 状态在您的服务运行期间保持不变,但锁定模式状态可能会更改。

密钥链改进

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

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

例如,当 TLS 服务器在 TLS 握手过程中发送 证书请求 消息时,浏览器调用 KeyChain.choosePrivateKeyAlias(),证书选择提示仅包含与颁发者参数匹配的选项。如果没有可用的匹配选项,或者设备上没有安装证书,则不会向用户显示选择提示。

此外,KeyChain 不再需要设备具有屏幕锁定才能导入密钥或 CA 证书。