统一更新控制 (UUC) 为 IT 管理员提供了一种统一、一致的方式,用于控制何时在公司自有的 Android 设备上下载和应用软件更新,从而确保更新不会中断经营活动。
通过一项 UUC 政策,您可以控制以下软件组件的更新:
- 设备制造商 (OEM) 发布的操作系统更新,包括主要操作系统更新以及次要操作系统和安全更新。
- Google Play 系统更新 (Mainline)。
- Google 系统服务,例如 Google Play 服务和 Android System WebView,可以成组更新,也可以一次更新一个应用。
您可以在 Policy 资源的 unifiedUpdatePolicy 字段中定义 UUC 规则。Android Device Policy (ADP) 应用是 UUC 的核心设备端决策点。
前提条件
在配置 UUC 之前,请验证以下要求:
- 您的 EMM 解决方案可以为企业创建和更新政策。
- 这些设备为公司自有设备,配置为全托管式设备或公司自有设备上的工作资料。个人设备不支持 UUC。
- 设备满足您要控制的每个更新目标的最低受支持 Android 版本,如下表所示:
| 更新目标 | 全托管式(设备所有者) | 由公司所有且包含工作资料 (COPE) 的设备 |
|---|---|---|
Google Play 系统服务(GOOGLE_SYSTEM_SERVICES、SINGLE_APP) |
Android 13(API 级别 33)及更高版本 | Android 15(API 级别 35)及更高版本 |
Google Play 系统更新/Mainline (GOOGLE_PLAY_SYSTEM_UPDATE) |
Android 13(API 级别 33)及更高版本 | Android 15(API 级别 35)及更高版本 |
操作系统更新 - 使用 Google OTA 代理的 OEM,例如 Google Pixel(OS_UPDATE_WITH_API_LEVEL_CHANGE、OS_UPDATE_WITHOUT_API_LEVEL_CHANGE) |
Android 13(API 级别 33)及更高版本 | Android 15(API 级别 35)及更高版本 |
操作系统更新 - 其他 OEM(OS_UPDATE_WITH_API_LEVEL_CHANGE、OS_UPDATE_WITHOUT_API_LEVEL_CHANGE) |
Android 17(API 级别 37)及更高版本 | Android 17(API 级别 37)及更高版本 |
注意事项和限制
在规划 UUC 集成之前,请先查看以下注意事项和限制:
- 初始设置向导:当设备处于初始设置向导中时,系统不会强制执行 UUC 政策。在设备设置期间,可能会发生来自 Google Play 或 OEM OTA 代理的关键更新。
- 设置后立即更新:UUC 政策可能不适用于在设备设置后立即开始的自动更新,例如在政策到达 ADP 之前对 Google Play 服务的早期更新。
- 捆绑式 OTA 模块:OEM OTA 更新可以包含 Mainline 模块和 Google 系统服务的更新版本。安装 OEM OTA 更新会自动更新这些捆绑组件。
- Google Play 系统更新 (Mainline):UUC 将 Mainline 更新作为一个整体进行控制,因此无法单独控制各个 Mainline 软件包。UUC 仅控制下载阶段的开始:Mainline 下载一旦开始,就无法停止。如果在下载开始后应用了
BLOCK规则,更新仍会在下次设备重启时完成。 - 在冻结期内手动更新:对于 Google Play 系统更新 (Mainline) 和 Google 系统服务,
BLOCK规则只会阻止自动更新。即使BLOCK规则处于有效状态,用户仍然可以手动更新这些组件。此问题将在未来的版本中得到解决。 - 豁免的应用:UUC 不会管理 Google Play 商店应用或 ADP 应用的更新。
了解 UUC 政策
UnifiedUpdatePolicy 由 Rule 对象的有序列表组成。每条规则都指定了:
- 由您的 EMM 解决方案定义的标识符 (
id) - 一个或多个软件更新目标
- 可选评估阶段。
- 一个或多个包含基于时间的条件的可选谓词
- 一个结果,用于确定如何处理更新
规则评估
在评估待处理更新时,ADP 会按照 rules 中显示的顺序,考虑适用于该更新的目标和阶段的所有规则。ADP 会选择谓词求值结果为 true 的第一条规则,并应用其结果,就像链式 if-else 语句一样。如果没有任何规则的谓词求值为 true,则负责该组件的更新客户端会正常管理更新。
规则标识符
每条规则都需要一个由 EMM 解决方案定义的 id,最多 64 个字符。id 不得为空,并且在政策规则中必须是唯一的。
更新目标
每条规则都必须指定一个非空的 targets 列表,且不得重复。
在单个规则中指定多个目标等同于按顺序定义多个规则,每个规则都有一个目标,顺序相同。
下表介绍了支持的 targetType 值:
targetType 值 |
说明 |
|---|---|
OS_UPDATE_WITH_API_LEVEL_CHANGE |
由 OEM 发布、会更改设备 Android API 级别的操作系统更新(主要操作系统更新)。 |
OS_UPDATE_WITHOUT_API_LEVEL_CHANGE |
由 OEM 发布、不会更改设备 Android API 级别的操作系统更新(次要操作系统更新和安全更新)。 |
GOOGLE_PLAY_SYSTEM_UPDATE |
Google Play 系统更新 (Mainline)。将 Mainline 更新作为一个实体进行控制。 |
GOOGLE_SYSTEM_SERVICES |
通过 Google Play 更新的 Google 系统服务,例如 Google Play 服务和 Android System WebView。 |
SINGLE_APP |
Google Play 上属于 GOOGLE_SYSTEM_SERVICES 的服务的软件包名称,例如 com.google.android.webview。需要使用应用的 packageName 设置 singleApp。 |
评估阶段
对于 OS_UPDATE_WITH_API_LEVEL_CHANGE 和 OS_UPDATE_WITHOUT_API_LEVEL_CHANGE 目标,您可以选择指定评估规则的 stages:
STAGE_DOWNLOAD:在下载更新之前评估规则。STAGE_APPLY:在执行应用更新的操作(例如触发自动重新启动)之前,系统会评估该规则。
如果 stages 为空,则在所有阶段都会评估规则。注意:对于 GOOGLE_SYSTEM_SERVICES、SINGLE_APP 和 GOOGLE_PLAY_SYSTEM_UPDATE 目标,阶段会被忽略。
谓词
predicate 定义了规则匹配时基于时间的条件,例如星期几、一天中的时间范围(以小时为单位)、设备本地时区中的日历日期范围,或设备可使用更新的时长(以 24 小时为单位)。
在单个谓词中设置的所有条件都使用逻辑 AND 进行组合。空谓词或省略的谓词的计算结果始终为 true。如需查看谓词字段及其限制条件的完整列表,请参阅 Predicate 参考文档。
成果
outcome 指定当规则的谓词求值为 true 时,ADP 如何指示更新代理继续执行。下表介绍了支持的 outcomeType 值:
outcomeType 值 |
说明 |
|---|---|
BLOCK |
阻止下载或应用更新。对于通过 Google Play 提供的更新(GOOGLE_SYSTEM_SERVICES、SINGLE_APP、GOOGLE_PLAY_SYSTEM_UPDATE),BLOCK 仅会影响自动更新,而不会阻止用户手动更新。对于 OEM 操作系统更新,BLOCK 会阻止手动和自动更新。 |
USER_PROMPT |
在未经用户同意的情况下,不会执行更新操作,而是会提示用户继续更新。 |
FORCE |
立即启动评估阶段的操作,例如下载更新或重新启动设备以应用更新。 |
最长延迟期限
UUC 允许将结果为 BLOCK 或 USER_PROMPT 的更新推迟到每个更新目标的最长推迟期。如果更新的可用时间超过其最长延期期限,则任何 BLOCK 或 USER_PROMPT 结果都会被替换为默认值,并且更新客户端会正常管理更新。
下表按目标和管理模式列出了最长延迟限制:
| 目标组 | 更新目标 | 全托管式设备 | 公司自有设备上的工作资料 |
|---|---|---|---|
| 不涉及 API 级别变动的更新 | Google 系统服务(例如 WebView) | 5 天 | 5 天 |
| 不涉及 API 级别变动的更新 | Google Play 系统更新 (Mainline) 和 OEM OTA 系统更新(不更改 API 级别,包括关键的每月补丁) | 25 天 | 25 天 |
| 涉及 API 级别变动的更新 | OEM OTA 系统更新(API 级别发生变化) | 180 天 | 90 天 |
systemUpdate 的优先级
在将 unifiedUpdatePolicy 添加到现有政策之前,请先查看其 systemUpdate 设置,并使用 UUC 规则重新创建所需的行为。例如,如需在营业时间之外进行操作系统更新,请使用 BLOCK 规则,如在营业时间阻止主要操作系统更新中的规则。
这种优先级行为与使用 AMAPI SDK 的自定义 DPC 不同,后者在 OEM OTA 更新中,AOSP SystemUpdatePolicy 的优先级高于 UUC。
如需了解详情,请参阅 AOSP SystemUpdatePolicy 优先级。
配置 UUC 政策
您可以设置、检索和清除政策资源上的 unifiedUpdatePolicy 字段,并检查使用该政策的设备的合规性。
设置 UUC 政策
如需配置 UUC,请向政策添加 unifiedUpdatePolicy 对象。如需在不更改现有政策的其他设置的情况下应用 UUC 政策,请使用 updateMask=unifiedUpdatePolicy 调用 enterprises.policies.patch:
PATCH https://androidmanagement.googleapis.com/v1/enterprises/{enterpriseId}/policies/{policyId}?updateMask=unifiedUpdatePolicy
{
"unifiedUpdatePolicy": {
"rules": [
{
"id": "Block Policy",
"targets": [
{
"targetType": "OS_UPDATE_WITH_API_LEVEL_CHANGE"
}
],
"predicate": {
"daysOfWeek": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
],
"timeOfDayLowerBound": { "hours": 9 },
"timeOfDayUpperBound": { "hours": 17 }
},
"outcome": {
"outcomeType": "BLOCK"
}
}
]
}
}
更新后的政策会应用于使用该政策的所有设备。每当受控组件有可用更新时,ADP 都会在每台设备上评估这些规则。
检索 UUC 政策
如需读取已配置的 UUC 规则,请调用 enterprises.policies.get 并检查返回的政策的 unifiedUpdatePolicy 字段:
GET https://androidmanagement.googleapis.com/v1/enterprises/{enterpriseId}/policies/{policyId}
清除 UUC 政策
如需从政策中移除所有 UUC 规则,请使用 updateMask=unifiedUpdatePolicy 和不包含 unifiedUpdatePolicy 的请求正文调用 enterprises.policies.patch:
PATCH https://androidmanagement.googleapis.com/v1/enterprises/{enterpriseId}/policies/{policyId}?updateMask=unifiedUpdatePolicy
{}
政策配置示例
以下示例展示了常见场景的 unifiedUpdatePolicy 对象。按照设置 UUC 政策中的说明,使用 enterprises.policies.patch 应用这些政策。使用 AMAPI SDK 配置统一更新控件中提供了这些场景的 Kotlin 和 Java 代码。
在工作时间内禁止重大操作系统更新
以下规则会在周一至周五的 09:00 到 17:00 期间屏蔽主要操作系统更新 (OS_UPDATE_WITH_API_LEVEL_CHANGE):
{
"unifiedUpdatePolicy": {
"rules": [
{
"id": "Block Policy",
"targets": [
{
"targetType": "OS_UPDATE_WITH_API_LEVEL_CHANGE"
}
],
"predicate": {
"daysOfWeek": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
],
"timeOfDayLowerBound": { "hours": 9 },
"timeOfDayUpperBound": { "hours": 17 }
},
"outcome": {
"outcomeType": "BLOCK"
}
}
]
}
}
按更新发布时长强制执行操作系统更新
以下规则会强制执行已向设备提供最多 7 天 (604800s) 的主要操作系统更新:
{
"unifiedUpdatePolicy": {
"rules": [
{
"id": "Force Policy",
"targets": [
{
"targetType": "OS_UPDATE_WITH_API_LEVEL_CHANGE"
}
],
"predicate": {
"updateAgeUpperBound": "604800s"
},
"outcome": {
"outcomeType": "FORCE"
}
}
]
}
}
禁止更新单个 Google 系统服务应用
如需控制属于 Google 系统服务一部分的特定应用(例如 Android System WebView [com.google.android.webview]),请将 targetType 设置为 SINGLE_APP,并在 singleApp 中提供应用的 packageName。以下规则会在周一至周五的 09:00 至 17:00 期间屏蔽 WebView 更新:
{
"unifiedUpdatePolicy": {
"rules": [
{
"id": "Block Webview Policy",
"targets": [
{
"targetType": "SINGLE_APP",
"singleApp": {
"packageName": "com.google.android.webview"
}
}
],
"predicate": {
"daysOfWeek": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
],
"timeOfDayLowerBound": { "hours": 9 },
"timeOfDayUpperBound": { "hours": 17 }
},
"outcome": {
"outcomeType": "BLOCK"
}
}
]
}
}
跨所有更新目标组合多条规则
由于系统会按顺序评估规则,因此您可以组合使用多条规则,在特定时段内禁止更新,并在这些时段之外强制更新。
以下示例对四个类别目标(OS_UPDATE_WITH_API_LEVEL_CHANGE、OS_UPDATE_WITHOUT_API_LEVEL_CHANGE、GOOGLE_SYSTEM_SERVICES 和 GOOGLE_PLAY_SYSTEM_UPDATE)应用了两个依序规则:
- 在营业时间(周一至周五,上午 9 点至下午 5 点)禁止所有更新。
- 在非营业时间,强制执行已发布最多 7 天的更新。
{
"unifiedUpdatePolicy": {
"rules": [
{
"id": "Block Policy - rule1",
"targets": [
{ "targetType": "OS_UPDATE_WITH_API_LEVEL_CHANGE" },
{ "targetType": "OS_UPDATE_WITHOUT_API_LEVEL_CHANGE" },
{ "targetType": "GOOGLE_SYSTEM_SERVICES" },
{ "targetType": "GOOGLE_PLAY_SYSTEM_UPDATE" }
],
"predicate": {
"daysOfWeek": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
],
"timeOfDayLowerBound": { "hours": 9 },
"timeOfDayUpperBound": { "hours": 17 }
},
"outcome": {
"outcomeType": "BLOCK"
}
},
{
"id": "Force Policy - rule2",
"targets": [
{ "targetType": "OS_UPDATE_WITH_API_LEVEL_CHANGE" },
{ "targetType": "OS_UPDATE_WITHOUT_API_LEVEL_CHANGE" },
{ "targetType": "GOOGLE_SYSTEM_SERVICES" },
{ "targetType": "GOOGLE_PLAY_SYSTEM_UPDATE" }
],
"predicate": {
"updateAgeUpperBound": "604800s"
},
"outcome": {
"outcomeType": "FORCE"
}
}
]
}
}
在某个日历日期之前限制更新
您可以使用 dateLowerBound 和 dateUpperBound,在设备本地时区的特定日历日期范围内限制或允许更新。以下规则会阻止对四个类别目标的更新,直到 2026 年 3 月 14 日:
{
"unifiedUpdatePolicy": {
"rules": [
{
"id": "block_until_date",
"targets": [
{ "targetType": "OS_UPDATE_WITH_API_LEVEL_CHANGE" },
{ "targetType": "OS_UPDATE_WITHOUT_API_LEVEL_CHANGE" },
{ "targetType": "GOOGLE_SYSTEM_SERVICES" },
{ "targetType": "GOOGLE_PLAY_SYSTEM_UPDATE" }
],
"predicate": {
"dateUpperBound": { "year": 2026, "month": 3, "day": 14 }
},
"outcome": {
"outcomeType": "BLOCK"
}
}
]
}
}