本页面概述了 Android 10 中引入的新企业版 API、功能和行为变更。
适用于公司自有设备的工作资料
Android 10 引入了针对仅需要工作资料的公司自有设备的新配置和证明功能。
改进了工作资料的配置工具
您可以在使用 QR 码或零接触注册注册的 Android 10 及更高版本设备上配置工作资料。在配置公司自有设备期间,新的 intent extra 允许设备政策控制器应用 (DPC) 启动工作资料或完全托管设置。创建工作资料或建立完全托管后,DPC 必须启动政策合规性屏幕以强制执行任何初始政策。
在 DPC 的 manifest 文件中,在 activity 中为 GET_PROVISIONING_MODE
声明新的 intent filter,并添加 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 filter 关联的 activity。此 activity 的目的是指定管理模式(工作资料或完全托管)。
在确定设备的适当管理模式之前,检索配置 extra 可能很有用。activity 可以调用 getIntent()
来检索以下内容
DPC 还可以创建新的结果 intent 并向其中添加以下 extra
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
:添加到现有 bundle 或创建新 bundle。当您的 DPC 启动其政策合规性屏幕时,此 bundle 将作为 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 的 manifest 文件中,在 activity 中为 ADMIN_POLICY_COMPLIANCE
声明新的 intent filter,并添加 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 filter 关联的 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,包括手动系统更新、将 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 进行身份验证,请添加值为 "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 支持
组织可以使用 DNS over TLS(在 Android 设备上称为专用 DNS),以避免泄露 DNS 查询,包括内部主机名查询。完全托管设备的管理员组件可以控制设备的专用 DNS 设置。要设置专用 DNS 模式,请调用
- 当系统可以发现支持的名称服务器时,设备使用专用 DNS 的
setGlobalPrivateDnsModeOpportunistic()
,或 - 在
privateDnsHost
参数中指定支持 RFC7858 的名称服务器主机名的setGlobalPrivateDnsModeSpecifiedHost()
。
当您的 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
的子类添加到委托应用。 - 在应用 manifest 中声明
<receiver>
,为每个回调添加 intent-filter action。例如,ACTION_NETWORK_LOGS_AVAILABLE
或ACTION_CHOOSE_PRIVATE_KEY_ALIAS
。 - 使用
BIND_DEVICE_ADMIN
权限保护广播接收器。
以下代码段显示了一个处理网络日志记录和证书选择的单个委托应用的应用 manifest
<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
权限添加到您应用的 manifest。 - 调用
DevicePolicyManager.getPasswordComplexity()
。复杂度分为四类
要启动系统屏幕锁定设置,请使用带 extra EXTRA_PASSWORD_COMPLEXITY
的 ACTION_SET_NEW_PASSWORD
——不符合 intent extra 中指定复杂度的选项会变灰。用户可以从可用的屏幕锁定选项中选择或退出屏幕。
最佳实践:在启动系统屏幕锁定页面之前,在您的应用中显示一条消息。当您的应用恢复时,再次调用 DevicePolicyManager.getPasswordComplexity()
。如果仍然需要更强的屏幕锁定,请限制访问,而不是反复提示用户更新其安全设置。
VPN 应用中的 HTTP 代理支持
在 Android 10 中,VPN 应用可以为其 VPN 连接设置 HTTP 代理。要添加 HTTP 代理,VPN 应用必须在调用 VpnService.Builder.setHttpProxy()
之前,使用主机和端口配置 ProxyInfo
实例。系统和许多网络库都使用此代理设置,但系统不会强制应用代理 HTTP 请求。
有关如何设置 HTTP 代理的示例代码,请参阅 ToyVPN 示例应用。
VPN 服务模式
VPN 应用可以发现服务是否因始终开启的 VPN 而运行,以及锁定模式是否处于活动状态。Android 10 中添加的新方法可以帮助您调整用户界面。例如,当始终开启的 VPN 控制您的服务生命周期时,您可能会禁用断开连接按钮。
VPN 应用在连接到服务并建立本地接口后,可以调用以下 VpnService
方法
isAlwaysOn()
以了解系统是否因始终开启的 VPN 而启动了该服务isLockdownEnabled()
以了解系统是否正在阻止不使用 VPN 的连接
在您的服务运行时,始终开启状态保持不变,但锁定模式状态可能会更改。
密钥链改进
Android 10 引入了与 KeyChain
API 相关的多项改进。
当应用调用 KeyChain.choosePrivateKeyAlias()
时,Android 10 及更高版本设备会根据调用中指定的颁发者和密钥算法过滤用户可以选择的证书列表。
例如,当 TLS 服务器作为 TLS 握手的一部分发送 证书请求消息且浏览器调用 KeyChain.choosePrivateKeyAlias()
时,证书选择提示仅包含与颁发者参数匹配的选项。如果没有可用匹配选项或设备上没有安装证书,则不会向用户显示选择提示。
此外,KeyChain
不再要求设备在导入密钥或 CA 证书之前具有屏幕锁定。