此页面概述了 Android 10 中引入的新企业 API、功能和行为更改。
公司自有设备的工作资料
Android 10 引入了针对仅需要工作资料的公司自有设备的新配置和认证功能。
改进的工作资料配置工具
您可以使用 二维码 或 零接触 在 Android 10 及更高版本的设备上配置工作资料。在配置公司自有设备期间,新的 intent extra 允许设备策略控制器应用 (DPC) 启动工作资料 *或*完全托管的设置。创建工作资料或建立完全管理后,DPC 必须启动策略合规性屏幕以强制执行任何初始策略。
在 DPC 的清单文件中,为活动声明 GET_PROVISIONING_MODE
的新 intent 过滤器,并添加 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>
在配置过程中,系统会启动与 intent 过滤器关联的活动。此活动的目的是指定管理模式(工作资料或完全托管)。
在确定设备的适当管理模式之前,检索配置额外信息可能很有用。活动可以调用 getIntent()
来检索以下内容:
DPC 还可以创建一个新的结果 intent 并向其中添加以下额外信息:
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 的清单文件中,为活动声明 ADMIN_POLICY_COMPLIANCE
的新 intent 过滤器,并添加 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
广播。
与 intent 过滤器关联的活动可以调用 getIntent()
来检索 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
。执行策略合规性后,ADMIN_POLICY_COMPLIANCE
必须返回 setResult(RESULT_OK, Intent)
并使用 finish()
关闭所有活动屏幕。
完全托管的设备会将用户返回到主屏幕。工作资料设备会在将用户返回到主屏幕之前提示用户添加其个人帐户。
工作资料设备 ID 认证
设置为使用零接触注册配置的工作资料管理员的 DPC 可以获取安全硬件认证的设备 ID,例如 IMEI 或制造商的序列号。设备必须包含安全硬件(例如可信执行环境 (TEE) 或安全元件 (SE)),并支持设备 ID 认证和零接触注册。
工作配置文件的管理员组件可以调用DevicePolicyManager.generateKeyPair()
,并将ID_TYPE_SERIAL
、ID_TYPE_IMEI
或ID_TYPE_MEID
中的一个或多个作为idAttestationFlags
参数传递。
要了解有关提取和验证设备 ID 的更多信息,请参阅使用密钥证明验证硬件支持的密钥对。
工作配置文件改进
提供支持跨配置文件日历可见性和设备范围阻止安装来自未知来源的应用程序的新 API。
工作配置文件,设备范围内的未知来源
从 Google Play(或其他受信任的应用商店)以外的来源下载的应用称为来自未知来源的应用。在 Android 10 中,工作配置文件的管理员可以通过添加新的用户限制DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY
来阻止任何用户或配置文件在设备上的任何位置安装来自未知来源的应用。但是,添加此限制后,使用该设备的人仍然可以使用adb安装应用。
为了防止用户错误地安装来自未知来源的应用,我们建议添加此用户限制,因为它不需要安装 Google Play 服务。如果要支持较旧的 Android 版本,可以设置Google Play 的托管配置值。
将允许的输入设备限制为工作配置文件
当工作配置文件的管理员调用DevicePolicyManager.setPermittedInputMethods()
时,用户仅限于其工作配置文件内的允许输入法,而不是整个设备,从而使用户可以完全控制其设备个人侧的输入法。
静默擦除工作配置文件
已将WIPE_SILENTLY
标志添加到DevicePolicyManager.wipeData()
。如果设置了此标志,则在使用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
额外内容。要指定 EAP 身份验证,可以将以下预配额外内容添加到您的意图中:
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 模式,请调用:
setGlobalPrivateDnsModeOpportunistic()
,使设备在系统可以发现支持的名称服务器时使用私有 DNS,或者setGlobalPrivateDnsModeSpecifiedHost()
指定支持RFC7858的名称服务器的主机名(在privateDnsHost
参数中)。
当您的 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>
,为每个回调添加意图过滤器操作。例如,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_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 的连接
在您的服务运行期间,始终在线状态保持不变,但锁定模式状态可能会更改。
Keychain改进
Android 10 引入了与KeyChain
API 相关的几项改进。
当应用调用KeyChain.choosePrivateKeyAlias()
时,Android 10 及更高版本的设备会根据调用中指定的颁发者和密钥算法过滤用户可以选择证书的列表。
例如,当 TLS 服务器发送证书请求消息作为 TLS 握手的一部分,并且浏览器调用KeyChain.choosePrivateKeyAlias()
时,证书选择提示仅包含与颁发者参数匹配的选项。如果没有可用的匹配选项或设备上没有安装证书,则不会向用户显示选择提示。
此外,KeyChain
不再要求设备具有屏幕锁才能导入密钥或 CA 证书。