本页面简要介绍了 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:
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
:添加到现有软件包或创建新软件包。当您的 DPC 启动其政策合规性屏幕时,此软件包将作为 intent extra 发送。EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
:如果在工作资料配置过程中添加工作帐号,请仅指定要迁移的帐号。EXTRA_PROVISIONING_SKIP_EDUCATION_SCREENS
如需在设备上设置管理模式,请调用 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_SERIAL
、ID_TYPE_IMEI
或 ID_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:
EXTRA_PROVISIONING_WIFI_EAP_METHOD
EXTRA_PROVISIONING_WIFI_IDENTITY
EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY
EXTRA_PROVISIONING_WIFI_DOMAIN
EXTRA_PROVISIONING_WIFI_PHASE2_AUTH
EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE
EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE
私人 DNS 支持
组织可以使用通过传输层安全协议 (TLS) 执行 DNS(在 Android 设备上称为专用 DNS)避免泄露 DNS 查询,包括内部主机名的查询。完全受管设备的管理员组件可以控制设备的专用 DNS 设置。如需设置专用 DNS 模式,请调用:
setGlobalPrivateDnsModeOpportunistic()
,可让设备在系统发现支持的域名服务器时使用专用 DNS;或者setGlobalPrivateDnsModeSpecifiedHost()
,用于在privateDnsHost
参数中指定支持 RFC7858 的域名服务器的主机名。
当您的 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 的回调。已委托网络活动日志记录和证书选择的应用应实现此类。如需将此组件添加到受委托应用,请按以下步骤操作:
- 将
DelegatedAdminReceiver
的子类添加到受委托应用。 - 在应用清单中声明
<receiver>
,并为每个回调添加一个 intent 过滤器操作。例如,ACTION_NETWORK_LOGS_AVAILABLE
或ACTION_CHOOSE_PRIVATE_KEY_ALIAS
。 - 使用
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
:
USES_POLICY_DISABLE_CAMERA
USES_POLICY_DISABLE_KEYGUARD_FEATURES
USES_POLICY_EXPIRE_PASSWORD
USES_POLICY_LIMIT_PASSWORD
一些应用利用设备管理员进行用户设备管理。例如,锁定和擦除丢失的设备。为此,以下政策仍可使用:
如需详细了解这些变更,请参阅设备管理员弃用。
应用的新功能
以 Android 10 为目标平台的应用可以先查询在设备上设置的屏幕锁定复杂度,然后再显示机密数据或启动关键功能。调用 KeyChain
API 的应用将从行为改进中受益,并且 VPN 应用也推出了新功能。
屏幕锁定安全系数检查
从 Android 10 开始,具有关键功能且需要屏幕锁定的应用可以查询设备或工作资料的屏幕锁定复杂度。需要安全性更高的屏幕锁定方式的应用可以将用户定向到系统屏幕锁定设置,从而允许用户更新其安全设置。
要检查屏幕锁定的安全系数,请执行以下操作:
- 将新的
REQUEST_PASSWORD_COMPLEXITY
权限添加到应用的清单中。 - 调用
DevicePolicyManager.getPasswordComplexity()
。 复杂性分为四类:
如需启动系统屏幕锁定设置,请结合使用 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)以及锁定模式是否处于活动状态。Android 10 中添加的新方法可帮助您调整界面。例如,当始终开启的 VPN 控制服务的生命周期时,您可以停用“断开连接”按钮。
VPN 应用可以在连接到服务并建立本地接口后调用以下 VpnService
方法:
isAlwaysOn()
,用于确认系统是否因 VPN 始终开启而启动服务isLockdownEnabled()
,用于了解系统是否屏蔽了不使用 VPN 的连接
服务运行时,始终开启状态将保持不变,但锁定模式状态可能会更改。
Keychain 改进
Android 10 引入了与 KeyChain
API 相关的多项改进。
当应用调用 KeyChain.choosePrivateKeyAlias()
时,搭载 Android 10 及更高版本的设备会根据调用中指定的颁发者和密钥算法来过滤用户可以选择的证书列表。
例如,当 TLS 服务器在 TLS 握手过程中发送证书请求消息,并且浏览器调用 KeyChain.choosePrivateKeyAlias()
时,证书选择提示仅包含与颁发者参数匹配的选项。如果没有可用的匹配选项或设备上未安装证书,系统不会向用户显示选择提示。
此外,在可以导入密钥或 CA 证书之前,KeyChain
不再要求设备具有屏幕锁定。