此页面简要介绍了 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 WLAN 网络的凭据,以及对 DNS-over-TLS 的支持。
手动安装系统更新
在 Android 10 中,完全托管设备的管理员可以通过系统更新文件安装系统更新。手动系统更新允许 IT 管理员执行以下操作:
- 先在少量设备上测试更新,然后再广泛安装该更新。
- 避免在带宽有限的网络上重复下载。
- 错开安装,或仅在未使用设备时更新设备。
首先,IT 管理员要设置推迟的系统更新政策以延迟自动安装(如果需要)。接下来,设备的 DPC 使用指向设备制造商系统更新文件的路径调用 installSystemUpdate()。传递 InstallSystemUpdateCallback 对象,系统可以使用该对象报告在设备重启前发生的错误。如果出错了,系统会调用 onInstallUpdateError() 并返回错误代码。
设备重启后,您的 DPC 需要使用版本 API(例如 Build.FINGERPRINT)确认安装成功。如果更新失败,请向 IT 管理员报告失败情况。
EAP WLAN 配置
在 Android 10 中,用于设备配置的二维码和 NFC 数据可以包含 EAP 配置和凭据(包括证书)。当用户扫描二维码或点按 NFC 标签时,设备会使用 EAP 自动进行身份验证并连接到本地 WLAN 网络,然后启动配置流程,无需任何额外的手动输入。
如需使用 EAP 对 Wi-Fi 进行身份验证,请添加值为 "EAP" 的 EXTRA_PROVISIONING_WIFI_SECURITY_TYPE extra。如需指定 EAP 身份验证,您可以向 intent 中添加以下配置 extra:
EXTRA_PROVISIONING_WIFI_EAP_METHODEXTRA_PROVISIONING_WIFI_IDENTITYEXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITYEXTRA_PROVISIONING_WIFI_DOMAINEXTRA_PROVISIONING_WIFI_PHASE2_AUTHEXTRA_PROVISIONING_WIFI_USER_CERTIFICATEEXTRA_PROVISIONING_WIFI_CA_CERTIFICATE
私人 DNS 支持
组织可以使用 DNS-over-TLS(在 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_CAMERAUSES_POLICY_DISABLE_KEYGUARD_FEATURESUSES_POLICY_EXPIRE_PASSWORDUSES_POLICY_LIMIT_PASSWORD
一些应用利用设备管理员进行用户设备管理。例如,锁定和擦除丢失的设备。要启用此功能,可继续使用以下政策:
如需详细了解这些变更,请参阅设备管理员弃用。
应用的新功能
以 Android 10 为目标平台的应用可以查询在设备上设置的屏幕锁定复杂度,然后显示机密数据或启动关键功能。调用 KeyChain API 的应用将从行为改进中受益,并且我们还针对 VPN 应用推出了新功能。
屏幕锁定安全系数检查
从 Android 10 开始,具备关键功能且需要屏幕锁定的应用可以查询设备或工作资料的屏幕锁定复杂度。要求屏幕锁定安全系数更高的应用可以将用户引导至系统屏幕锁定设置,从而让他们更新其安全设置。
要检查屏幕锁定的安全系数,请执行以下操作:
- 将新的
REQUEST_PASSWORD_COMPLEXITY权限添加到应用清单中。 - 调用
DevicePolicyManager.getPasswordComplexity()。复杂度分为四类:
如需启动系统屏幕锁定设置,请使用带有 extra EXTRA_PASSWORD_COMPLEXITY 的 ACTION_SET_NEW_PASSWORD,不符合 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 不再要求设备具有屏幕锁定功能。