Register now for Android Dev Summit 2019!

企业中的 Android 的新变化

此页面简要介绍了 Android Q 推出的新企业 API、功能和行为变更。

归公司所有的设备的工作资料

Android Q 针对只需工作资料的归公司所有的设备推出了新的配置和证明功能。

改进的工作资料配置工具

您现在可以使用二维码零触摸注册方法在 Android Q 及更高版本的设备上配置工作资料。在配置归公司所有的设备时,新的 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:

要在设备上设置管理模式,请调用 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_SERIALID_TYPE_IMEIID_TYPE_MEID 中的一个或多个。

要详细了解如何提取和验证设备 ID,请参阅使用密钥认证功能验证由硬件支持的密钥对

工作资料改进

我们提供了新的 API,可用于支持日历通看功能和在设备范围内阻止安装未知来源的应用。

访问工作资料日历

在个人资料中运行的应用可以显示工作资料日历上的活动。要查询工作资料日历数据,请使用以下内容提供器 URI 调用 Calendar Provider API:

当工作资料日历不可用时,查询会返回 null。当 IT 管理员阻止访问工作资料日历或工作资料已关闭时,无法使用工作资料日历。使用设备的用户也可以在设置中关闭跨资料访问日历功能。

在个人资料中运行的应用可以显示工作活动,并通过将希望修改工作活动的用户转到工作资料中的同一活动来重定向这些用户。当您的应用同时安装在个人资料和工作资料中时,请调用 startViewCalendarEventInManagedProfile()。想要支持日历通看活动的应用必须处理 ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT 操作。准备您的界面以显示包含以下 intent extra 中的数据的现有活动:

管理工作资料日历访问权限

IT 管理员可以阻止工作资料与个人资料共享日历信息。要允许访问工作资料日历,工作资料的管理员组件必须调用 setCrossProfileCalendarPackages()

如果未调用此方法或使用空集来调用此方法,则任何应用都无法读取工作资料日历。要将对工作资料日历的读取权限授予所有应用,请传递 null。要确保只有一组特定的应用可以读取工作资料日历,请传递这些应用的软件包名称。

要获取之前设置的所有应用软件包,工作资料的管理员组件可以调用 getCrossProfileCalendarPackages()

工作资料、设备范围的未知来源

从 Google Play(或其他受信任的应用商店)以外的来源下载的应用称为未知来源的应用。在 Android Q 中,工作资料的管理员现在可以添加新的用户限制 DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY,以阻止任何用户或资料在设备上的任何位置安装未知来源的应用。不过,添加此限制后,使用该设备的用户仍然可以使用 adb 安装应用。

为阻止用户错误地安装未知来源的应用,我们建议您添加此项用户限制,因为它不需要安装 Google Play 服务。如果您想支持旧版 Android,可以为 Google Play 设置托管配置值

只能使用工作资料允许的输入设备

当工作资料的管理员调用 DevicePolicyManager.setPermittedInputMethods() 时,用户只能使用其工作资料内(而不是整个设备)允许的输入方法,从而让他们完全控制其设备个人端上的输入方法。

擦除工作资料,但不通知用户

DevicePolicyManager.wipeData() 中添加了新的 WIPE_SILENTLY 标记。如果设置了此标记,则在使用 wipeData() 擦除其工作资料后,用户不会收到通知。

针对完全托管设备的新功能

Android Q 针对完全托管设备推出了新功能和 API,包括手动系统更新、扩展二维码和 NFC 配置以添加 EAP WLAN 网络的凭据,以及对 DNS-over-TLS 的支持。

手动安装系统更新

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

  • 先在少量设备上测试更新,然后再广泛安装该更新。
  • 避免在带宽有限的网络上重复下载。
  • 错开安装,或仅在未使用设备时更新设备。

首先,IT 管理员要设置推迟的系统更新政策以延迟自动安装(如果需要)。接下来,设备的 DPC 使用指向设备制造商系统更新文件的路径调用 installSystemUpdate()。传递 InstallSystemUpdateCallback 对象,系统可以使用该对象报告在设备重启前发生的错误。如果出错了,系统会调用 onInstallUpdateError() 并返回错误代码。

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

EAP WLAN 配置

在 Android Q 中,用于配置设备的二维码和 NFC 数据现在可以包含 EAP 配置和凭据(包括证书)。当用户扫描二维码或点按 NFC 标签时,设备会使用 EAP 自动进行身份验证并连接到本地 WLAN 网络,然后启动配置流程,无需任何额外的手动输入。

要使用 EAP 对 WLAN 进行身份验证,请添加一个 EXTRA_PROVISIONING_WIFI_SECURITY_TYPE extra,并将值设为 "EAP"。要指定 EAP 身份验证,您可以向 intent 中添加以下配置 extra:

私人 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 Q 添加了 isAlwaysOnVpnLockdownEnabled() 方法。

新的委托范围

Android Q 扩展了 DPC 可委托给其他更专用应用的函数列表。Android 将执行任务所需的 API 方法分成各个范围。要委托范围,请调用 setDelegatedScopes() 并传递以下一个或多个范围:

Android Q 为受委托应用引入了一个新的 DelegatedAdminReceiver 类。系统使用此广播接收器将类似 DPC 的回调发送给受委托应用。已受委托网络活动日志和证书选择的应用应实现此类。要将此组件添加到受委托应用中,请按照以下步骤操作:

  1. DelegatedAdminReceiver 的子类添加到受委托应用中。
  2. 在应用清单中声明 <receiver>,并为每个回调添加一个 intent 过滤器操作。例如,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 Q 中,完全托管设备的管理员可以将网络日志委托给专用的应用。

要在系统提供一批日志后检索网络日志,受委托应用应首先添加 DelegatedAdminReceiver 的子类(如前所述)。在子类中,按照检索日志中的指南实现 onNetworkLogsAvailable() 回调。

受委托应用可以调用以下 DevicePolicyManger 方法(为 admin 参数传递 null):

为避免丢失日志,DPC 不应在规划委托给其他应用时启用网络日志。受委托应用应启用和收集网络日志。在 DPC 委托网络日志后,它将不再接收任何 onNetworkLogsAvailable() 回调。

要了解如何让受委托应用报告网络活动日志,请阅读开发者指南网络活动日志

证书选择

在 Android Q 中,完全托管设备、工作资料和次要用户的管理员可以将证书选择委托给专用的应用。

要选择证书别名,受委托应用应首先添加 DelegatedAdminReceiver 的子类(如前所述)。您可以在子类中实现 onChoosePrivateKeyAlias() 回调并返回首选证书的别名;或者,要提示用户选择证书,则返回 null

弃用设备管理政策

Android Q 禁止应用和 DPC 应用旧版设备管理政策。我们建议客户和合作伙伴切换到完全托管设备或工作资料。设备管理员针对 Android Q 调用以下政策时会抛出 SecurityException

一些应用利用设备管理员进行用户设备管理。例如,锁定和擦除丢失的设备。要启用此功能,可继续使用以下政策:

要详细了解这些变更,请参阅设备管理员弃用

应用的新功能

以 Android Q 为目标平台的应用可以查询在设备上设置的屏幕锁定复杂度,然后显示机密数据或启动关键功能。调用 KeyChain API 的应用将从行为改进中受益,并且我们还针对 VPN 应用推出了新功能。

屏幕锁定安全系数检查

从 Android Q 开始,具备关键功能且需要屏幕锁定的应用可以查询设备或工作资料的屏幕锁定复杂度。要求屏幕锁定安全系数更高的应用可以将用户引导至系统屏幕锁定设置,从而让他们更新其安全设置。

要检查屏幕锁定的安全系数,请执行以下操作:

要启动系统屏幕锁定设置,请使用带有 extra EXTRA_PASSWORD_COMPLEXITYACTION_SET_NEW_PASSWORD,不符合 intent extra 中指定的复杂度的选项将灰显。用户可以选择可用的屏幕锁定选项或退出屏幕。

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

VPN 应用中的 HTTP 代理支持

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

如需有关如何设置 HTTP 代理的示例代码,请参阅 ToyVPN 示例应用。

VPN 服务模式

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

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

  • isAlwaysOn(),用于确认系统是否因设置为始终开启的 VPN 而启动了服务
  • isLockdownEnabled(),用于确认系统是否会屏蔽不使用 VPN 的连接

当服务运行时,始终开启状态将保持不变,但锁定模式状态可能会更改。

Keychain 改进

Android Q 引入了与 KeyChain API 相关的一些改进。

在应用调用 KeyChain.choosePrivateKeyAlias() 时,设备现在会根据在调用中指定的颁发机构和密钥算法来过滤用户可以选择的证书列表。

例如,如果 TLS 服务器将证书请求消息作为 TLS 握手的一部分进行发送,则当浏览器调用 KeyChain.choosePrivateKeyAlias() 时,证书选择提示现在仅包含与颁发机构参数相匹配的选项。如果没有可用的匹配选项或设备上未安装证书,则系统不会向用户显示选择提示。

此外,在能够导入密钥或 CA 证书之前,KeyChain 不再要求设备具有屏幕锁定功能。

了解详情

要了解可能会影响您的应用的其他变更,请参阅 Android Q 行为变更页面(针对以 Android Q 为目标平台的应用所有应用)。