Управление обновлениями системы

В этом руководстве разработчика объясняется, как ваш контроллер политики устройства (DPC) может управлять обновлениями системы Android от имени пользователя устройства.

Введение

Устройства Android могут получать и устанавливать обновления системы и прикладного программного обеспечения по беспроводной сети (OTA). Android уведомляет пользователя устройства о доступности обновления системы, и пользователь устройства может установить обновление немедленно или позже.

Используя ваш ЦОД, ИТ-администратор может управлять обновлениями системы для пользователя устройства. ЦОД могут владеть полностью управляемым устройством (так называемым владельцем устройства) или рабочим профилем (так называемым владельцем профиля). В таблице 1 показано, как владельцы устройств могут управлять обновлениями системы, а владельцы профилей могут только сообщать информацию об обновлениях системы.

Таблица 1. Задачи, доступные ЦОД, зависят от режима владельца

Задача Владелец устройства Владелец профиля
Проверьте наличие ожидающих обновлений системы
Получайте обратные вызовы, когда становятся доступны новые обновления системы.
Установите локальную политику обновлений, чтобы контролировать, когда Android устанавливает обновления системы.
Замораживание версии ОС в критические периоды

Проверьте наличие ожидающих обновлений

Ожидаемое обновление — это обновление системы для устройства, которое еще не установлено. Ваш ЦОД может помочь ИТ-администраторам проверить, на каких устройствах имеются ожидающие обновления системы, и, возможно, попросить пользователей устройств как можно скорее установить критические обновления.

Владельцы устройств и владельцев профилей, работающих под управлением Android 8.0 (уровень API 26) или выше, могут проверить, имеется ли на устройстве ожидающее обновление системы. Вызовите DevicePolicyManager.getPendingSystemUpdate() , который возвращает null , если устройство обновлено. Если ожидается обновление системы, метод возвращает информацию об обновлении.

Узнайте больше о ожидающем обновлении

После вызова getPendingSystemUpdate() вы можете проверить возвращаемое значение SystemUpdateInfo чтобы узнать больше об ожидающем обновлении. В следующем примере показано, как можно узнать, когда ожидающее обновление впервые стало доступно для устройства:

Котлин

val firstAvailable =
        dpm.getPendingSystemUpdate(adminName)?.receivedTime
firstAvailable?.let {
    Log.i(TAG, "Update first available: ${Date(firstAvailable)}")
}

Ява

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

Системные обратные вызовы

Когда обновление становится доступным, система Android уведомляет владельцев устройств о новом обновлении. В Android 8.0 и выше система также уведомляет владельцев профилей.

В подклассе DeviceAdminReceiver переопределите обратный вызов onSystemUpdatePending() . Вам не нужно регистрироваться или рекламировать свой ЦОД, чтобы получить обратный вызов. Система может вызывать этот метод несколько раз для одного обновления, поэтому перед ответом проверьте статус обновления. Вызовите getPendingSystemUpdate() , чтобы узнать больше об обновлении системы в обратном вызове. В следующем примере показано, как это можно сделать:

Котлин

/**
 * Called when a new update is available.
 */
override fun onSystemUpdatePending(context: Context?, intent: Intent?,
                                   receivedTime: Long) {

    // System update information is supported in API level 26 or higher.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return
    }

    val updateInfo = getManager(context)
            .getPendingSystemUpdate(getWho(context))
            ?: return
    if (updateInfo.securityPatchState ==
            SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
        // Perhaps install because this is a security patch.
        // ...
    }
}

Ява

/**
 * Called when a new update is available.
 */
public void onSystemUpdatePending (Context context, Intent intent,
                                   long receivedTime) {

  // System update information is supported in API level 26 or higher.
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    return;
  }
  SystemUpdateInfo updateInfo = getManager(context)
      .getPendingSystemUpdate(getWho(context));
  if (updateInfo == null) {
    return;
  }
  if (updateInfo.getSecurityPatchState() ==
      SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
    // Perhaps install because this is a security patch.
    // ...
  }
}

Если в системе имеется более одного DPC, например рабочие профили на полностью управляемых устройствах, обратный вызов получают как владелец устройства, так и владелец профиля.

Обновить политики

Владелец устройства может контролировать время установки обновлений, настроив политику обновления локальной системы для устройства. Политика обновления системы может быть одного из трех типов:

Автоматический
Устанавливает обновления системы, как только они становятся доступными (без взаимодействия с пользователем). Установка этого типа политики немедленно устанавливает все ожидающие обновления, которые могут быть отложены или ждут периода обслуживания.
оконный
Устанавливает обновления системы во время ежедневного периода обслуживания (без взаимодействия с пользователем). При создании новой оконной политики задайте начало и конец периода ежедневного обслуживания в минутах дня.
Перенесенный
Откладывает установку обновлений системы на 30 дней. По истечении 30-дневного периода система предложит пользователю устройства установить обновление.

Периоды отсрочки

Система ограничивает каждое обновление одной 30-дневной отсрочкой. Период начинается, когда система впервые откладывает обновление, и установка новых политик отсрочки не продлит этот период.

Помимо отсрочки, Android может не иметь возможности установить обновление по другим причинам, например, из-за отсутствия подключения, недостаточного места на диске или низкого заряда батареи.

Система сбрасывает таймер 30-дневной отсрочки, если в течение этого периода становится доступно другое обновление, что дает ИТ-администраторам возможность опробовать объединенные системные обновления. По прошествии 30 дней без новых обновлений система предлагает пользователю установить все ожидающие обновления. Позже, когда станет доступно новое обновление системы, 30-дневный период начинается снова.

Как установить политику

Вы можете установить политики обновления в Android 8.0 (уровень API 26) или более поздней версии. Чтобы указать, когда устройство должно устанавливать обновления системы, создайте экземпляр SystemUpdatePolicy , используя один из трех типов, описанных выше. Чтобы установить политику, владелец вашего устройства вызывает метод DevicePolicyManager setSystemUpdatePolicy() . В следующем примере кода показано, как это можно сделать. Чтобы увидеть пример оконной политики, посмотрите документацию SystemUpdatePolicy .

Котлин

// Create the system update policy to postpone installation for 30 days.
val policy = SystemUpdatePolicy.createPostponeInstallPolicy()

// Get a DevicePolicyManager instance to set the policy on the device.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy)

Ява

// Create the system update policy to postpone installation for 30 days.
SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy();

// Get a DevicePolicyManager instance to set the policy on the device.
DevicePolicyManager dpm = (DevicePolicyManager) context
    .getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy);

Экземпляры политики нельзя изменить после их создания. Чтобы изменить время установки обновлений на устройстве, вы можете создать и настроить новую политику. Чтобы удалить политику с устройства, вызовите setSystemUpdatePolicy() , передав значение null в качестве аргумента policy . После того как ваш ЦОД удалит политику, пользователь устройства увидит уведомления о любых доступных обновлениях системы.

Приложения могут вызывать getSystemUpdatePolicy() , чтобы получить текущую политику для устройства. Если этот метод возвращает null , это означает, что политика в настоящее время не установлена.

Периоды заморозки

Чтобы заморозить версию ОС в критические периоды, например, в праздники или в другое загруженное время, владельцы устройств могут приостановить обновления системы на срок до 90 дней. Когда устройство находится в периоде зависания, оно ведет себя следующим образом:

  • Устройство не получает никаких уведомлений об ожидающих обновлениях системы.
  • Системные обновления ОС не устанавливаются.
  • Пользователи устройств не могут вручную проверять наличие обновлений системы в настройках.

Система обеспечивает обязательный 60-дневный буферный период после любых определенных периодов заморозки, чтобы предотвратить заморозку устройства на неопределенный срок. Помните, что заморозка обновлений системы может помешать устройствам получать критические обновления.

Рисунок 1. Для устройства установлены два периода заморозки
Календарь, показывающий два периода заморозки в году с 60-дневными буферами.

Вы устанавливаете периоды заморозки в политике обновления. Вы не можете установить периоды заморозки без настройки политики. Если устройство находится вне установленных вами периодов заморозки, применяется обычное поведение политики (автоматическое, оконное или отложенное).

Как установить период заморозки

Вы можете установить периоды заморозки в Android 9 (уровень API 28) или выше. Владелец устройства устанавливает период заморозки политики обновления системы перед настройкой политики для устройства. Шаги:

  1. Создайте новую (или получите текущую) политику обновления системы.
  2. Установите периоды заморозки политики, вызвав setFreezePeriods() .
  3. Установите политику и периоды заморозки для устройства, вызвав setSystemUpdatePolicy() .

Поскольку период замораживания повторяется ежегодно, даты начала и окончания периода представлены значениями месяца и дня. День начала должен начаться как минимум через 60 дней после окончания любого предыдущего периода заморозки. В следующем примере показано, как можно установить два периода заморозки для существующей политики обновления системы:

Котлин

// Get the existing policy from the DevicePolicyController instance.
val policy = dpm.systemUpdatePolicy ?: return

try {
    // Set the two annual freeze periods on the policy for our retail
    // point-of-sale devices.
    val summerSale = FreezePeriod(
            MonthDay.of(6, 1),
            MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive
    val winterSale = FreezePeriod(
            MonthDay.of(11, 20),
            MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive
    policy.freezePeriods = Arrays.asList(summerSale, winterSale)

    // Set the policy again to activate the freeze periods.
    dpm.setSystemUpdatePolicy(adminName, policy)

} catch (e: SystemUpdatePolicy.ValidationFailedException) {
    // There must be previous periods recorded on the device because
    // summerSale and winterSale don’t overlap and are separated by more
    // than 60 days. Report the overlap ...
}

Ява

// Get the existing policy from the DevicePolicyController instance.
SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy();

try {
  // Set the two annual freeze periods on the policy for our
  // retail point-of-sale devices.
  FreezePeriod summerSale = new FreezePeriod(
      MonthDay.of(6, 1),
      MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive
  FreezePeriod winterSale = new FreezePeriod(
      MonthDay.of(11, 20),
      MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive
  policy.setFreezePeriods(Arrays.asList(summerSale, winterSale));

  // Don’t forget to set the policy again to activate the freeze periods.
  dpm.setSystemUpdatePolicy(adminName, policy);

} catch (SystemUpdatePolicy.ValidationFailedException e) {
  // There must be previous periods recorded on the device because summerSale
  // and winterSale don’t overlap and are separated by more than 60 days.
  // Report the overlap ...
}

И день начала, и день окончания включены в стоимость. Если день начала больше дня окончания (например, winterSale в предыдущем примере), период заморозки продлевается на следующий год.

При установке периодов заморозки в политике обновления системы Android проверяет соответствие следующим требованиям:

  • Никакой период заморозки не превышает 90 дней.
  • Интервал между периодами заморозков составляет не менее 60 дней.
  • Периоды заморозки не пересекаются.
  • Повторяющихся периодов заморозки нет.

При настройке политики обновления системы для устройства Android повторяет эти тесты и включает все текущие или прошлые периоды зависания устройства.

Android выдает исключение SystemUpdatePolicy.ValidationFailedException , если какой-либо из этих тестов не пройден.

Чтобы получить список периодов заморозки, ранее установленных для объекта политики обновления системы, все установленные приложения могут вызвать SystemUpdatePolicy.getFreezePeriods() . В следующем примере этот метод вызывается для регистрации периодов зависания устройства:

Котлин

// Log any freeze periods that might be set on a system update policy.
dpm.systemUpdatePolicy?.freezePeriods?.forEach {
    Log.i(TAG, "Freeze period: $it")
}

Ява

// Log any freeze periods that might be set on a system update policy.
SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy();
if (currentPolicy != null) { // A policy might not be set.
  for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) {
    Log.i(TAG, "Freeze period: " + freezePeriod.toString());
  }
}

Високосные годы

Android использует календарь ISO 8601 (также называемый григорианским календарем) для расчета периодов заморозки и игнорирует високосные годы. Это означает, что 29 февраля не считается действительной датой и рассматривается как 28 февраля. Поэтому 29 февраля не учитывается при расчете продолжительности периода заморозки.

Разработка и тестирование

Пока вы разрабатываете и тестируете функцию обновления системы вашего ЦОД, вам может потребоваться создать множество периодов заморозки. Поскольку Android проверяет 60-дневный интервал между прошлыми периодами заморозки, возможно, вы не сможете установить новый период заморозки, не очистив предварительно записи прошлых периодов. Чтобы очистить запись периода зависания устройства, выполните следующую команду в оболочке Android Debug Bridge (adb):

adb shell dpm clear-freeze-period-record

Вы можете подтвердить, что устройство находится в периоде зависания, проверив, что пользовательский интерфейс для обновлений системы отключен.

Обновления системы Google Play (основная версия)

Обновления системы Google Play (также называемые обновлениями Mainline) загружаются автоматически, но для их установки требуется перезагрузка устройства. Эти обновления не вызывают автоматическую перезагрузку и вместо этого устанавливаются при следующей перезагрузке, инициированной пользователем, администратором или политикой. При перезагрузке, вызванной политикой обновления системы, будет установлено соответствующее обновление системы Google/OEM и все ранее загруженные обновления системы Google Play.

Обновления системы Google Play также можно установить вручную, выбрав «Настройки» > «О программе» > «Версия Android» > «Обновление системы Google Play» .

Откатить обновление

В некоторых случаях инструмент отката обновления системы Google Play (GPSUR) можно использовать для восстановления состояния устройства из-за проблемной установки обновления системы Google Play. Этот инструмент следует использовать опытным пользователям или по указанию персонала службы поддержки, поскольку это может привести к потере данных. Вот как использовать инструмент GPSUR:

  1. Если на вашем компьютере запущен Android Debug Bridge (adb) , остановите службу adb, прежде чем продолжить, чтобы она не мешала процессу отката. Чтобы остановить adb, запустите adb kill-server .
  2. Откройте инструмент GPSUR .
  3. Нажмите «Разрешить доступ ADB» , чтобы разрешить инструменту взаимодействовать с вашим тестовым устройством через adb.
  4. Нажмите Добавить новое устройство .
  5. Выберите свое устройство из списка и нажмите « Подключиться» . Этот список может не содержать полное имя устройства.
  6. На экране вашего устройства выберите «Всегда разрешать с этого компьютера» и нажмите «ОК» , чтобы принять подключение для отладки USB.
  7. Выберите подключенное устройство в браузере.
  8. Текст кнопки на странице должен измениться с «Откат не доступен» на «Откатить последние обновления», если на вашем устройстве доступны откаты. Нажмите «Откатить последние обновления» .
  9. Прочтите предупреждения в модальном окне «Подтвердить откат» и нажмите «Подтвердить» .
  10. Дождитесь завершения отката. После завершения появится модальное окно «Откат успешен» , и устройство перезагрузится. Теперь можно безопасно отключить устройство.

Дополнительные ресурсы

Чтобы узнать больше об обновлениях системы, прочтите документацию по OTA-обновлениям проекта Android Open Source Project.

,

В этом руководстве разработчика объясняется, как ваш контроллер политики устройства (DPC) может управлять обновлениями системы Android от имени пользователя устройства.

Введение

Устройства Android могут получать и устанавливать обновления системы и прикладного программного обеспечения по беспроводной сети (OTA). Android уведомляет пользователя устройства о доступности обновления системы, и пользователь устройства может установить обновление немедленно или позже.

Используя ваш ЦОД, ИТ-администратор может управлять обновлениями системы для пользователя устройства. ЦОД могут владеть полностью управляемым устройством (так называемым владельцем устройства) или рабочим профилем (так называемым владельцем профиля). В таблице 1 показано, как владельцы устройств могут управлять обновлениями системы, а владельцы профилей могут только сообщать информацию об обновлениях системы.

Таблица 1. Задачи, доступные ЦОД, зависят от режима владельца

Задача Владелец устройства Владелец профиля
Проверьте наличие ожидающих обновлений системы
Получайте обратные вызовы, когда становятся доступны новые обновления системы.
Установите локальную политику обновлений, чтобы контролировать, когда Android устанавливает обновления системы.
Замораживание версии ОС в критические периоды

Проверьте наличие ожидающих обновлений

Ожидаемое обновление — это обновление системы для устройства, которое еще не установлено. Ваш ЦОД может помочь ИТ-администраторам проверить, на каких устройствах имеются ожидающие обновления системы, и, возможно, попросить пользователей устройств как можно скорее установить критические обновления.

Владельцы устройств и владельцев профилей, работающих под управлением Android 8.0 (уровень API 26) или выше, могут проверить, имеется ли на устройстве ожидающее обновление системы. Вызовите DevicePolicyManager.getPendingSystemUpdate() , который возвращает null , если устройство обновлено. Если ожидается обновление системы, метод возвращает информацию об обновлении.

Узнайте больше о ожидающем обновлении

После вызова getPendingSystemUpdate() вы можете проверить возвращаемое значение SystemUpdateInfo чтобы узнать больше об ожидающем обновлении. В следующем примере показано, как можно узнать, когда ожидающее обновление впервые стало доступно для устройства:

Котлин

val firstAvailable =
        dpm.getPendingSystemUpdate(adminName)?.receivedTime
firstAvailable?.let {
    Log.i(TAG, "Update first available: ${Date(firstAvailable)}")
}

Ява

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

Системные обратные вызовы

Когда обновление становится доступным, система Android уведомляет владельцев устройств о новом обновлении. В Android 8.0 и выше система также уведомляет владельцев профилей.

В подклассе DeviceAdminReceiver переопределите обратный вызов onSystemUpdatePending() . Вам не нужно регистрироваться или рекламировать свой ЦОД, чтобы получить обратный вызов. Система может вызывать этот метод несколько раз для одного обновления, поэтому перед ответом проверьте статус обновления. Вызовите getPendingSystemUpdate() , чтобы узнать больше об обновлении системы в обратном вызове. В следующем примере показано, как это можно сделать:

Котлин

/**
 * Called when a new update is available.
 */
override fun onSystemUpdatePending(context: Context?, intent: Intent?,
                                   receivedTime: Long) {

    // System update information is supported in API level 26 or higher.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return
    }

    val updateInfo = getManager(context)
            .getPendingSystemUpdate(getWho(context))
            ?: return
    if (updateInfo.securityPatchState ==
            SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
        // Perhaps install because this is a security patch.
        // ...
    }
}

Ява

/**
 * Called when a new update is available.
 */
public void onSystemUpdatePending (Context context, Intent intent,
                                   long receivedTime) {

  // System update information is supported in API level 26 or higher.
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    return;
  }
  SystemUpdateInfo updateInfo = getManager(context)
      .getPendingSystemUpdate(getWho(context));
  if (updateInfo == null) {
    return;
  }
  if (updateInfo.getSecurityPatchState() ==
      SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
    // Perhaps install because this is a security patch.
    // ...
  }
}

Если в системе имеется более одного DPC, например рабочие профили на полностью управляемых устройствах, обратный вызов получают как владелец устройства, так и владелец профиля.

Обновить политики

Владелец устройства может контролировать время установки обновлений, настроив политику обновления локальной системы для устройства. Политика обновления системы может быть одного из трех типов:

Автоматический
Устанавливает обновления системы, как только они становятся доступными (без взаимодействия с пользователем). Установка этого типа политики немедленно устанавливает все ожидающие обновления, которые могут быть отложены или ждут периода обслуживания.
оконный
Устанавливает обновления системы во время ежедневного периода обслуживания (без взаимодействия с пользователем). При создании новой оконной политики задайте начало и конец периода ежедневного обслуживания в минутах дня.
Перенесенный
Откладывает установку обновлений системы на 30 дней. По истечении 30-дневного периода система предложит пользователю устройства установить обновление.

Периоды отсрочки

Система ограничивает каждое обновление одной 30-дневной отсрочкой. Период начинается, когда система впервые откладывает обновление, и установка новых политик отсрочки не продлит этот период.

Помимо отсрочки, Android может не иметь возможности установить обновление по другим причинам, например, из-за отсутствия подключения, недостаточного места на диске или низкого заряда батареи.

Система сбрасывает таймер 30-дневной отсрочки, если в течение этого периода становится доступно другое обновление, что дает ИТ-администраторам возможность опробовать объединенные системные обновления. По прошествии 30 дней без новых обновлений система предлагает пользователю установить все ожидающие обновления. Позже, когда станет доступно новое обновление системы, 30-дневный период начинается снова.

Как установить политику

Вы можете установить политики обновления в Android 8.0 (уровень API 26) или более поздней версии. Чтобы указать, когда устройство должно устанавливать обновления системы, создайте экземпляр SystemUpdatePolicy , используя один из трех типов, описанных выше. Чтобы установить политику, владелец вашего устройства вызывает метод DevicePolicyManager setSystemUpdatePolicy() . В следующем примере кода показано, как это можно сделать. Чтобы увидеть пример оконной политики, посмотрите документацию SystemUpdatePolicy .

Котлин

// Create the system update policy to postpone installation for 30 days.
val policy = SystemUpdatePolicy.createPostponeInstallPolicy()

// Get a DevicePolicyManager instance to set the policy on the device.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy)

Ява

// Create the system update policy to postpone installation for 30 days.
SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy();

// Get a DevicePolicyManager instance to set the policy on the device.
DevicePolicyManager dpm = (DevicePolicyManager) context
    .getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy);

Экземпляры политики нельзя изменить после их создания. Чтобы изменить время установки обновлений на устройстве, вы можете создать и настроить новую политику. Чтобы удалить политику с устройства, вызовите setSystemUpdatePolicy() , передав значение null в качестве аргумента policy . После того как ваш ЦОД удалит политику, пользователь устройства увидит уведомления о любых доступных обновлениях системы.

Приложения могут вызывать getSystemUpdatePolicy() , чтобы получить текущую политику для устройства. Если этот метод возвращает null , это означает, что политика в настоящее время не установлена.

Периоды заморозки

Чтобы заморозить версию ОС в критические периоды, например, в праздники или в другое загруженное время, владельцы устройств могут приостановить обновления системы на срок до 90 дней. Когда устройство находится в периоде зависания, оно ведет себя следующим образом:

  • Устройство не получает никаких уведомлений об ожидающих обновлениях системы.
  • Системные обновления ОС не устанавливаются.
  • Пользователи устройств не могут вручную проверять наличие обновлений системы в настройках.

Система обеспечивает обязательный 60-дневный буферный период после любых определенных периодов заморозки, чтобы предотвратить заморозку устройства на неопределенный срок. Помните, что заморозка обновлений системы может помешать устройствам получать критические обновления.

Рисунок 1. Для устройства установлены два периода заморозки
Календарь, показывающий два периода заморозки в году с 60-дневными буферами.

Вы устанавливаете периоды заморозки в политике обновления. Вы не можете установить периоды заморозки без настройки политики. Если устройство находится вне установленных вами периодов заморозки, применяется обычное поведение политики (автоматическое, оконное или отложенное).

Как установить период заморозки

Вы можете установить периоды заморозки в Android 9 (уровень API 28) или выше. Владелец устройства устанавливает период заморозки политики обновления системы перед настройкой политики для устройства. Шаги:

  1. Создайте новую (или получите текущую) политику обновления системы.
  2. Установите периоды заморозки политики, вызвав setFreezePeriods() .
  3. Установите политику и периоды заморозки для устройства, вызвав setSystemUpdatePolicy() .

Поскольку период замораживания повторяется ежегодно, даты начала и окончания периода представлены значениями месяца и дня. День начала должен начаться как минимум через 60 дней после окончания любого предыдущего периода заморозки. В следующем примере показано, как можно установить два периода заморозки для существующей политики обновления системы:

Котлин

// Get the existing policy from the DevicePolicyController instance.
val policy = dpm.systemUpdatePolicy ?: return

try {
    // Set the two annual freeze periods on the policy for our retail
    // point-of-sale devices.
    val summerSale = FreezePeriod(
            MonthDay.of(6, 1),
            MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive
    val winterSale = FreezePeriod(
            MonthDay.of(11, 20),
            MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive
    policy.freezePeriods = Arrays.asList(summerSale, winterSale)

    // Set the policy again to activate the freeze periods.
    dpm.setSystemUpdatePolicy(adminName, policy)

} catch (e: SystemUpdatePolicy.ValidationFailedException) {
    // There must be previous periods recorded on the device because
    // summerSale and winterSale don’t overlap and are separated by more
    // than 60 days. Report the overlap ...
}

Ява

// Get the existing policy from the DevicePolicyController instance.
SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy();

try {
  // Set the two annual freeze periods on the policy for our
  // retail point-of-sale devices.
  FreezePeriod summerSale = new FreezePeriod(
      MonthDay.of(6, 1),
      MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive
  FreezePeriod winterSale = new FreezePeriod(
      MonthDay.of(11, 20),
      MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive
  policy.setFreezePeriods(Arrays.asList(summerSale, winterSale));

  // Don’t forget to set the policy again to activate the freeze periods.
  dpm.setSystemUpdatePolicy(adminName, policy);

} catch (SystemUpdatePolicy.ValidationFailedException e) {
  // There must be previous periods recorded on the device because summerSale
  // and winterSale don’t overlap and are separated by more than 60 days.
  // Report the overlap ...
}

И день начала, и день окончания включены в стоимость. Если день начала больше дня окончания (например, winterSale в предыдущем примере), период заморозки продлевается на следующий год.

При установке периодов заморозки в политике обновления системы Android проверяет соответствие следующим требованиям:

  • Никакой период заморозки не превышает 90 дней.
  • Интервал между периодами заморозков составляет не менее 60 дней.
  • Периоды заморозки не пересекаются.
  • Повторяющихся периодов заморозки нет.

При настройке политики обновления системы для устройства Android повторяет эти тесты и включает все текущие или прошлые периоды зависания устройства.

Android выдает исключение SystemUpdatePolicy.ValidationFailedException , если какой-либо из этих тестов не пройден.

Чтобы получить список периодов заморозки, ранее установленных для объекта политики обновления системы, все установленные приложения могут вызвать SystemUpdatePolicy.getFreezePeriods() . В следующем примере этот метод вызывается для регистрации периодов зависания устройства:

Котлин

// Log any freeze periods that might be set on a system update policy.
dpm.systemUpdatePolicy?.freezePeriods?.forEach {
    Log.i(TAG, "Freeze period: $it")
}

Ява

// Log any freeze periods that might be set on a system update policy.
SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy();
if (currentPolicy != null) { // A policy might not be set.
  for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) {
    Log.i(TAG, "Freeze period: " + freezePeriod.toString());
  }
}

Високосные годы

Android использует календарь ISO 8601 (также называемый григорианским календарем) для расчета периодов заморозки и игнорирует високосные годы. Это означает, что 29 февраля не считается действительной датой и рассматривается как 28 февраля. Поэтому 29 февраля не учитывается при расчете продолжительности периода заморозки.

Разработка и тестирование

Пока вы разрабатываете и тестируете функцию обновления системы вашего ЦОД, вам может потребоваться создать множество периодов заморозки. Поскольку Android проверяет 60-дневный интервал между прошлыми периодами заморозки, возможно, вы не сможете установить новый период заморозки, не очистив предварительно записи прошлых периодов. Чтобы очистить запись периода зависания устройства, выполните следующую команду в оболочке Android Debug Bridge (adb):

adb shell dpm clear-freeze-period-record

Вы можете подтвердить, что устройство находится в периоде зависания, проверив, что пользовательский интерфейс для обновлений системы отключен.

Обновления системы Google Play (основная версия)

Обновления системы Google Play (также называемые обновлениями Mainline) загружаются автоматически, но для их установки требуется перезагрузка устройства. Эти обновления не вызывают автоматическую перезагрузку, а вместо этого устанавливаются при следующей перезагрузке, инициированной пользователем, администратором или политикой. При перезагрузке, вызванной политикой обновления системы, будет установлено соответствующее обновление системы Google/OEM и все ранее загруженные обновления системы Google Play.

Обновления системы Google Play также можно установить вручную, выбрав «Настройки» > «О программе» > «Версия Android» > «Обновление системы Google Play» .

Откатить обновление

В некоторых случаях инструмент отката обновления системы Google Play (GPSUR) можно использовать для восстановления состояния устройства из-за проблемной установки обновления системы Google Play. Этот инструмент следует использовать опытным пользователям или по указанию персонала службы поддержки, поскольку это может привести к потере данных. Вот как использовать инструмент GPSUR:

  1. Если на вашем компьютере запущен Android Debug Bridge (adb) , остановите службу adb, прежде чем продолжить, чтобы она не мешала процессу отката. Чтобы остановить adb, запустите adb kill-server .
  2. Откройте инструмент GPSUR .
  3. Нажмите «Разрешить доступ ADB» , чтобы разрешить инструменту взаимодействовать с вашим тестовым устройством через adb.
  4. Нажмите Добавить новое устройство .
  5. Выберите свое устройство из списка и нажмите « Подключиться» . Этот список может не содержать полное имя устройства.
  6. На экране вашего устройства выберите «Всегда разрешать с этого компьютера» и нажмите «ОК» , чтобы принять подключение для отладки USB.
  7. Выберите подключенное устройство в браузере.
  8. Текст кнопки на странице должен измениться с «Откат не доступен» на «Откатить последние обновления», если на вашем устройстве доступны откаты. Нажмите «Откатить последние обновления» .
  9. Прочтите предупреждения в модальном окне «Подтвердить откат» и нажмите «Подтвердить» .
  10. Дождитесь завершения отката. После завершения появится модальное окно «Откат успешен» , и устройство перезагрузится. Теперь можно безопасно отключить устройство.

Дополнительные ресурсы

Чтобы узнать больше об обновлениях системы, прочтите документацию по OTA-обновлениям проекта Android Open Source Project.

,

В этом руководстве разработчика объясняется, как ваш контроллер политики устройства (DPC) может управлять обновлениями системы Android от имени пользователя устройства.

Введение

Устройства Android могут получать и устанавливать обновления системы и прикладного программного обеспечения по беспроводной сети (OTA). Android уведомляет пользователя устройства о доступности обновления системы, и пользователь устройства может установить обновление немедленно или позже.

Используя ваш ЦОД, ИТ-администратор может управлять обновлениями системы для пользователя устройства. ЦОД могут владеть полностью управляемым устройством (так называемым владельцем устройства) или рабочим профилем (так называемым владельцем профиля). В таблице 1 показано, как владельцы устройств могут управлять обновлениями системы, а владельцы профилей могут только сообщать информацию об обновлениях системы.

Таблица 1. Задачи, доступные ЦОД, зависят от режима владельца

Задача Владелец устройства Владелец профиля
Проверьте наличие ожидающих обновлений системы
Получайте обратные вызовы, когда становятся доступны новые обновления системы.
Установите локальную политику обновлений, чтобы контролировать, когда Android устанавливает обновления системы.
Замораживание версии ОС в критические периоды

Проверьте наличие ожидающих обновлений

Ожидаемое обновление — это обновление системы для устройства, которое еще не установлено. Ваш ЦОД может помочь ИТ-администраторам проверить, на каких устройствах имеются ожидающие обновления системы, и, возможно, попросить пользователей устройств как можно скорее установить критические обновления.

Владельцы устройств и владельцев профилей, работающих под управлением Android 8.0 (уровень API 26) или выше, могут проверить, имеется ли на устройстве ожидающее обновление системы. Вызовите DevicePolicyManager.getPendingSystemUpdate() , который возвращает null , если устройство обновлено. Если ожидается обновление системы, метод возвращает информацию об обновлении.

Узнайте больше о ожидающем обновлении

После вызова getPendingSystemUpdate() вы можете проверить возвращаемое значение SystemUpdateInfo чтобы узнать больше об ожидающем обновлении. В следующем примере показано, как можно узнать, когда ожидающее обновление впервые стало доступно для устройства:

Котлин

val firstAvailable =
        dpm.getPendingSystemUpdate(adminName)?.receivedTime
firstAvailable?.let {
    Log.i(TAG, "Update first available: ${Date(firstAvailable)}")
}

Ява

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

Системные обратные вызовы

Когда обновление становится доступным, система Android уведомляет владельцев устройств о новом обновлении. В Android 8.0 и выше система также уведомляет владельцев профилей.

В подклассе DeviceAdminReceiver переопределите обратный вызов onSystemUpdatePending() . Вам не нужно регистрироваться или рекламировать свой ЦОД, чтобы получить обратный вызов. Система может вызывать этот метод несколько раз для одного обновления, поэтому перед ответом проверьте статус обновления. Вызовите getPendingSystemUpdate() , чтобы узнать больше об обновлении системы в обратном вызове. В следующем примере показано, как это можно сделать:

Котлин

/**
 * Called when a new update is available.
 */
override fun onSystemUpdatePending(context: Context?, intent: Intent?,
                                   receivedTime: Long) {

    // System update information is supported in API level 26 or higher.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return
    }

    val updateInfo = getManager(context)
            .getPendingSystemUpdate(getWho(context))
            ?: return
    if (updateInfo.securityPatchState ==
            SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
        // Perhaps install because this is a security patch.
        // ...
    }
}

Ява

/**
 * Called when a new update is available.
 */
public void onSystemUpdatePending (Context context, Intent intent,
                                   long receivedTime) {

  // System update information is supported in API level 26 or higher.
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    return;
  }
  SystemUpdateInfo updateInfo = getManager(context)
      .getPendingSystemUpdate(getWho(context));
  if (updateInfo == null) {
    return;
  }
  if (updateInfo.getSecurityPatchState() ==
      SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
    // Perhaps install because this is a security patch.
    // ...
  }
}

Если в системе имеется более одного DPC, например рабочие профили на полностью управляемых устройствах, обратный вызов получают как владелец устройства, так и владелец профиля.

Обновить политики

Владелец устройства может контролировать время установки обновлений, настроив политику обновления локальной системы для устройства. Политика обновления системы может быть одного из трех типов:

Автоматический
Устанавливает обновления системы, как только они становятся доступными (без взаимодействия с пользователем). Установка этого типа политики немедленно устанавливает все ожидающие обновления, которые могут быть отложены или ждут периода обслуживания.
оконный
Устанавливает обновления системы во время ежедневного периода обслуживания (без взаимодействия с пользователем). При создании новой оконной политики задайте начало и конец периода ежедневного обслуживания в минутах дня.
Перенесенный
Откладывает установку обновлений системы на 30 дней. По истечении 30-дневного периода система предложит пользователю устройства установить обновление.

Периоды отсрочки

Система ограничивает каждое обновление одной 30-дневной отсрочкой. Период начинается, когда система впервые откладывает обновление, и установка новых политик отсрочки не продлит этот период.

Помимо отсрочки, Android может не иметь возможности установить обновление по другим причинам, например, из-за отсутствия подключения, недостаточного места на диске или низкого заряда батареи.

Система сбрасывает таймер 30-дневной отсрочки, если в течение этого периода становится доступно другое обновление, что дает ИТ-администраторам возможность опробовать объединенные системные обновления. По прошествии 30 дней без новых обновлений система предлагает пользователю установить все ожидающие обновления. Позже, когда станет доступно новое обновление системы, 30-дневный период начинается снова.

Как установить политику

Вы можете установить политики обновления в Android 8.0 (уровень API 26) или более поздней версии. Чтобы указать, когда устройство должно устанавливать обновления системы, создайте экземпляр SystemUpdatePolicy , используя один из трех типов, описанных выше. Чтобы установить политику, владелец вашего устройства вызывает метод DevicePolicyManager setSystemUpdatePolicy() . В следующем примере кода показано, как это можно сделать. Чтобы увидеть пример оконной политики, посмотрите документацию SystemUpdatePolicy .

Котлин

// Create the system update policy to postpone installation for 30 days.
val policy = SystemUpdatePolicy.createPostponeInstallPolicy()

// Get a DevicePolicyManager instance to set the policy on the device.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy)

Ява

// Create the system update policy to postpone installation for 30 days.
SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy();

// Get a DevicePolicyManager instance to set the policy on the device.
DevicePolicyManager dpm = (DevicePolicyManager) context
    .getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy);

Экземпляры политики нельзя изменить после их создания. Чтобы изменить время установки обновлений на устройстве, вы можете создать и настроить новую политику. Чтобы удалить политику с устройства, вызовите setSystemUpdatePolicy() , передав значение null в качестве аргумента policy . После того как ваш ЦОД удалит политику, пользователь устройства увидит уведомления о любых доступных обновлениях системы.

Приложения могут вызывать getSystemUpdatePolicy() , чтобы получить текущую политику для устройства. Если этот метод возвращает null , это означает, что политика в данный момент не установлена.

Периоды заморозки

Чтобы заморозить версию ОС в критические периоды, например, в праздники или в другое загруженное время, владельцы устройств могут приостановить обновления системы на срок до 90 дней. Когда устройство находится в периоде зависания, оно ведет себя следующим образом:

  • Устройство не получает никаких уведомлений об ожидающих обновлениях системы.
  • Системные обновления ОС не устанавливаются.
  • Пользователи устройств не могут вручную проверять наличие обновлений системы в настройках.

Система обеспечивает обязательный 60-дневный буферный период после любых определенных периодов заморозки, чтобы предотвратить заморозку устройства на неопределенный срок. Помните, что заморозка обновлений системы может помешать устройствам получать критические обновления.

Рисунок 1. Для устройства установлены два периода заморозки
Календарь, показывающий два периода заморозки в году с 60-дневными буферами.

Вы устанавливаете периоды заморозки в политике обновления. Вы не можете установить периоды заморозки без настройки политики. Если устройство находится вне установленных вами периодов заморозки, применяется обычное поведение политики (автоматическое, оконное или отложенное).

Как установить период заморозки

Вы можете установить периоды заморозки в Android 9 (уровень API 28) или выше. Владелец устройства устанавливает период заморозки политики обновления системы перед настройкой политики для устройства. Шаги:

  1. Создайте новую (или получите текущую) политику обновления системы.
  2. Установите периоды заморозки политики, вызвав setFreezePeriods() .
  3. Установите политику и периоды заморозки для устройства, вызвав setSystemUpdatePolicy() .

Поскольку период замораживания повторяется ежегодно, даты начала и окончания периода представлены значениями месяца и дня. День начала должен начаться не позднее чем через 60 дней после окончания любого предыдущего периода заморозки. В следующем примере показано, как можно установить два периода заморозки для существующей политики обновления системы:

Котлин

// Get the existing policy from the DevicePolicyController instance.
val policy = dpm.systemUpdatePolicy ?: return

try {
    // Set the two annual freeze periods on the policy for our retail
    // point-of-sale devices.
    val summerSale = FreezePeriod(
            MonthDay.of(6, 1),
            MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive
    val winterSale = FreezePeriod(
            MonthDay.of(11, 20),
            MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive
    policy.freezePeriods = Arrays.asList(summerSale, winterSale)

    // Set the policy again to activate the freeze periods.
    dpm.setSystemUpdatePolicy(adminName, policy)

} catch (e: SystemUpdatePolicy.ValidationFailedException) {
    // There must be previous periods recorded on the device because
    // summerSale and winterSale don’t overlap and are separated by more
    // than 60 days. Report the overlap ...
}

Ява

// Get the existing policy from the DevicePolicyController instance.
SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy();

try {
  // Set the two annual freeze periods on the policy for our
  // retail point-of-sale devices.
  FreezePeriod summerSale = new FreezePeriod(
      MonthDay.of(6, 1),
      MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive
  FreezePeriod winterSale = new FreezePeriod(
      MonthDay.of(11, 20),
      MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive
  policy.setFreezePeriods(Arrays.asList(summerSale, winterSale));

  // Don’t forget to set the policy again to activate the freeze periods.
  dpm.setSystemUpdatePolicy(adminName, policy);

} catch (SystemUpdatePolicy.ValidationFailedException e) {
  // There must be previous periods recorded on the device because summerSale
  // and winterSale don’t overlap and are separated by more than 60 days.
  // Report the overlap ...
}

И день начала, и день окончания включены в стоимость. Если день начала больше дня окончания (например, winterSale в предыдущем примере), период заморозки продлевается на следующий год.

При настройке периодов заморозки в политике обновления системы Android проверяет соответствие следующим требованиям:

  • Никакой период заморозки не превышает 90 дней.
  • Интервал между периодами заморозков составляет не менее 60 дней.
  • Периоды заморозки не пересекаются.
  • Повторяющихся периодов заморозки нет.

При настройке политики обновления системы для устройства Android повторяет эти тесты и включает все текущие или прошлые периоды зависания устройства.

Android выдает исключение SystemUpdatePolicy.ValidationFailedException , если какой-либо из этих тестов не пройден.

Чтобы получить список периодов заморозки, ранее установленных для объекта политики обновления системы, все установленные приложения могут вызвать SystemUpdatePolicy.getFreezePeriods() . В следующем примере этот метод вызывается для регистрации периодов зависания устройства:

Котлин

// Log any freeze periods that might be set on a system update policy.
dpm.systemUpdatePolicy?.freezePeriods?.forEach {
    Log.i(TAG, "Freeze period: $it")
}

Ява

// Log any freeze periods that might be set on a system update policy.
SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy();
if (currentPolicy != null) { // A policy might not be set.
  for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) {
    Log.i(TAG, "Freeze period: " + freezePeriod.toString());
  }
}

Високосные годы

Android использует календарь ISO 8601 (также называемый григорианским календарем) для расчета периодов заморозки и игнорирует високосные годы. Это означает, что 29 февраля не считается действительной датой и рассматривается как 28 февраля. Поэтому 29 февраля не учитывается при расчете продолжительности периода заморозки.

Разработка и тестирование

Пока вы разрабатываете и тестируете функцию обновления системы вашего ЦОД, вам может потребоваться создать множество периодов заморозки. Поскольку Android проверяет 60-дневный интервал между прошлыми периодами заморозки, возможно, вы не сможете установить новый период заморозки, не очистив предварительно записи прошлых периодов. Чтобы очистить запись периода зависания устройства, выполните следующую команду в оболочке Android Debug Bridge (adb):

adb shell dpm clear-freeze-period-record

Вы можете подтвердить, что устройство находится в периоде зависания, проверив, что пользовательский интерфейс для обновлений системы отключен.

Обновления системы Google Play (основная версия)

Обновления системы Google Play (также называемые обновлениями Mainline) загружаются автоматически, но для их установки требуется перезагрузка устройства. Эти обновления не вызывают автоматическую перезагрузку, а вместо этого устанавливаются при следующей перезагрузке, инициированной пользователем, администратором или политикой. При перезагрузке, вызванной политикой обновления системы, будет установлено соответствующее обновление системы Google/OEM и все ранее загруженные обновления системы Google Play.

Обновления системы Google Play также можно установить вручную, выбрав «Настройки» > «О программе» > «Версия Android» > «Обновление системы Google Play» .

Откатить обновление

В некоторых случаях инструмент обновления обновления системы Google Play (GPSUR) может использоваться для восстановления состояния устройства из -за проблемной установки обновления системы Google Play. Этот инструмент должен использоваться передовыми пользователями или по указанию персонала поддержки, поскольку он может привести к потере данных. Вот как использовать инструмент gpsur:

  1. Если у вас есть мост Android Debug Bridge (ADB) на вашей машине, остановите службу ADB, прежде чем продолжить, чтобы он не мешал процессу отката. Чтобы остановить ADB, запустите adb kill-server .
  2. Откройте инструмент gpsur .
  3. Нажмите «Разрешить доступ к ADB, чтобы позволить инструменту взаимодействовать с вашим тестовым устройством через ADB».
  4. Нажмите «Добавить новое устройство» .
  5. Выберите свое устройство из списка и нажмите Connect . Этот список может не содержать полного имени устройства.
  6. На экране вашего устройства выберите «Всегда разрешайте» на этом компьютере и нажмите OK , чтобы принять подключение к отладке USB.
  7. Выберите подключенное устройство в вашем браузере.
  8. Текст кнопки на странице должен переключаться с отсутствия откатов, доступных для отката недавних обновлений , если на вашем устройстве есть откаты. Нажмите на Rellback последние обновления .
  9. Прочитайте предупреждения о модале подтверждения и нажмите «Подтвердить» .
  10. Подождите, пока откат завершится. После завершения появится успешный модал отката , и устройство перезагрузится. Теперь безопасно отключить ваше устройство.

Дополнительные ресурсы

Чтобы узнать больше об обновлениях системы, прочитайте документацию Android Open Source Project OTA .

,

В этом руководстве разработчика объясняется, как контроллер вашего политики устройства (DPC) может управлять обновлениями системы Android от имени пользователя устройства.

Введение

Устройства Android могут получать и устанавливать обновления в эфире (OTA) для системы и прикладного программного обеспечения. Android уведомляет пользователя устройства, что доступно системное обновление, и пользователь устройства может установить обновление немедленно или позже.

Используя ваш DPC, ИТ -администратор может управлять системными обновлениями для пользователя устройства. DPCS может иметь полностью управляемое устройство (называемое владельцем устройства) или может иметь рабочий профиль (называемый владельцем профиля). В таблице 1 показано, как владельцы устройств могут управлять обновлениями системы, в то время как владельцы профилей могут сообщать только информацию об обновлениях системы.

Таблица 1 : Задачи, доступные для DPCS, зависят от режима владельца

Задача Владелец устройства Владелец профиля
Проверьте обновления ожидающих систем
Получить обратные вызовы, когда станут доступны новые системы системы
Установите политику локального обновления для управления, когда Android устанавливает обновления системы
Заморозить версию ОС в критические периоды

Проверьте ожидающие обновления

Ожидаемое обновление - это обновление системы для устройства, которое еще не было установлено. Ваш DPC может помочь ему проверить, какие устройства имеют обновления системы, и, возможно, попросите пользователей устройства быстро установить критические обновления.

Владельцы устройств и владельцы профилей, работающие в Android 8.0 (API -уровне 26) или выше, могут проверить, имеет ли устройство ожидающее обновление системы. Вызовать DevicePolicyManager.getPendingSystemUpdate() , который возвращает null , если устройство обновлено. Если обновление системы ожидается, метод возвращает информацию о обновлении.

Узнайте больше о ожидаемом обновлении

После вызова getPendingSystemUpdate() вы можете проверить возвращенное значение SystemUpdateInfo , чтобы узнать больше о ожидаемом обновлении. В следующем примере показано, как вы можете узнать, когда ожидаемое обновление было впервые доступно для устройства:

Котлин

val firstAvailable =
        dpm.getPendingSystemUpdate(adminName)?.receivedTime
firstAvailable?.let {
    Log.i(TAG, "Update first available: ${Date(firstAvailable)}")
}

Ява

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

Системные обратные вызовы

Когда обновление становится доступным, система Android уведомляет владельцев устройств о новом обновлении. В Android 8.0 или выше система также уведомляет владельцев профилей.

В своем подкласс DeviceAdminReceiver переопределите обратный вызов onSystemUpdatePending() . Вам не нужно регистрировать или рекламировать для вашего DPC, чтобы получить обратный вызов. Система может вызвать этот метод более одного раза для одного обновления, поэтому проверьте статус обновления перед ответом. Вызовите getPendingSystemUpdate() , чтобы узнать больше о обновлении системы в обратном вызове. В следующем примере показано, как вы можете сделать это:

Котлин

/**
 * Called when a new update is available.
 */
override fun onSystemUpdatePending(context: Context?, intent: Intent?,
                                   receivedTime: Long) {

    // System update information is supported in API level 26 or higher.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        return
    }

    val updateInfo = getManager(context)
            .getPendingSystemUpdate(getWho(context))
            ?: return
    if (updateInfo.securityPatchState ==
            SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
        // Perhaps install because this is a security patch.
        // ...
    }
}

Ява

/**
 * Called when a new update is available.
 */
public void onSystemUpdatePending (Context context, Intent intent,
                                   long receivedTime) {

  // System update information is supported in API level 26 or higher.
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    return;
  }
  SystemUpdateInfo updateInfo = getManager(context)
      .getPendingSystemUpdate(getWho(context));
  if (updateInfo == null) {
    return;
  }
  if (updateInfo.getSecurityPatchState() ==
      SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) {
    // Perhaps install because this is a security patch.
    // ...
  }
}

Когда система имеет более одного DPC, например, профили работы на полностью управляемых устройствах, владелец устройства и владелец профиля оба получают обратный вызов.

Обновление политики

Владелец устройства может управлять при установке обновлений, установив политику локальной системы обновления системы для устройства. Политика обновления системы может быть одним из трех типов:

Автоматический
Устанавливает обновления системы, как только они станут доступны (без взаимодействия с пользователем). Установка этого типа политики немедленно устанавливает любые ожидающие обновления, которые могут быть отложены или ожидают окна обслуживания.
Окно
Устанавливает обновления системы во время ежедневного окна обслуживания (без взаимодействия с пользователем). Установите начало и конец окна ежедневного обслуживания, как минуты дня, при создании новой оконной политики.
Перенесенный
Откроет установку обновлений системы на 30 дней. После того, как 30-дневный период закончился, система побуждает пользователя устройства установить обновление.

Периоды отсрочки

Система ограничивает каждое обновление до одного 30-дневного отсрочки. Период начинается, когда система сначала открывает обновление и установление новых политик отсрочки не будет продлить период.

Помимо отсрочки, Android, возможно, не сможет установить обновление по другим причинам, таким как отсутствие подключения, недостаточное количество дискового пространства или низкий батарек.

Система сбрасывает 30-дневный таймер отсрочки, если в течение периода становится доступное другое обновление-предоставляя его администраторам шанс попробовать обновления комбинированных систем. Как только 30 дней прошли без нового обновления, система побуждает пользователя установить все ожидаемые обновления. Позже, когда становится доступным новое обновление системы, 30-дневный период начинается снова.

Как установить политику

Вы можете установить политики обновления в Android 8.0 (уровень API 26) или выше. Чтобы указать, когда устройство должно установить обновления системы, создайте экземпляр SystemUpdatePolicy используя один из трех типов, изложенных выше. Чтобы установить политику, владелец вашего устройства вызывает DevicePolicyManager Method setSystemUpdatePolicy() . Следующий образец кода показывает, как вы можете это сделать. Чтобы увидеть пример с оконной политикой, посмотрите на документацию SystemUpdatePolicy .

Котлин

// Create the system update policy to postpone installation for 30 days.
val policy = SystemUpdatePolicy.createPostponeInstallPolicy()

// Get a DevicePolicyManager instance to set the policy on the device.
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy)

Ява

// Create the system update policy to postpone installation for 30 days.
SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy();

// Get a DevicePolicyManager instance to set the policy on the device.
DevicePolicyManager dpm = (DevicePolicyManager) context
    .getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);

// Set the policy.
dpm.setSystemUpdatePolicy(adminName, policy);

Примеры политики не могут быть изменены, как только вы их создаете. Чтобы изменить, когда устройство устанавливает обновления, вы можете создавать и установить новую политику. Чтобы удалить политику с устройства, вызовите setSystemUpdatePolicy() , проводя null в качестве аргумента policy . После того, как ваш DPC удаляет политику, пользователь устройства видит уведомления для любых доступных системных обновлений.

Приложения могут позвонить в getSystemUpdatePolicy() , чтобы получить текущую политику для устройства. Если этот метод возвращает null , это означает, что в настоящее время не установлена ​​политика.

Периоды замораживания

Чтобы заморозить версию ОС в критические периоды, такие как праздники или другие занятые времена, владельцы устройств могут приостановить обновления системы на срок до 90 дней. Когда устройство находится в течение периода замораживания, оно ведет себя следующим образом:

  • Устройство не получает никаких уведомлений о ожидающих обновлениях системы.
  • Обновления системы в ОС не установлены.
  • Пользователи устройства не могут вручную проверить для обновлений системы в настройках.

Система обеспечивает обязательный 60-дневный буферный период после любых определенных периодов замораживания, чтобы предотвратить замораживание устройства на неопределенный срок. Помните, что обновления системы замораживания могут предотвратить получение критических обновлений.

Рисунок 1. Два периода замораживания, установленные для устройства
Календарь, показывающий два периода замораживания в год с 60-дневными буферами.

Вы устанавливаете периоды замораживания в политике обновления. Вы не можете установить периоды замораживания без установки политики. Когда устройство выходит за рамки любых периодов замораживания, которые вы устанавливаете, применяется нормальное поведение политики (автоматическое, оконное или отложенное).

Как установить период замораживания

Вы можете установить периоды замораживания в Android 9 (уровень API 28) или выше. Владелец устройства устанавливает период замораживания в политике обновления системы, прежде чем установить политику для устройства. Шаги:

  1. Создайте новую (или получите текущую политику обновления системы).
  2. Установите периоды замораживания в политике, позвонив в setFreezePeriods() .
  3. Установите периоды политики и замораживания для устройства, вызовите setSystemUpdatePolicy() .

Поскольку период замораживания повторяется ежегодно, даты начала и окончания периода представлены по значениям месяца и дня. Начальный день должен начаться не менее 60 дней после окончания любого предыдущего периода замораживания. В следующем примере показано, как вы можете установить два периода замораживания для существующей политики обновления системы:

Котлин

// Get the existing policy from the DevicePolicyController instance.
val policy = dpm.systemUpdatePolicy ?: return

try {
    // Set the two annual freeze periods on the policy for our retail
    // point-of-sale devices.
    val summerSale = FreezePeriod(
            MonthDay.of(6, 1),
            MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive
    val winterSale = FreezePeriod(
            MonthDay.of(11, 20),
            MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive
    policy.freezePeriods = Arrays.asList(summerSale, winterSale)

    // Set the policy again to activate the freeze periods.
    dpm.setSystemUpdatePolicy(adminName, policy)

} catch (e: SystemUpdatePolicy.ValidationFailedException) {
    // There must be previous periods recorded on the device because
    // summerSale and winterSale don’t overlap and are separated by more
    // than 60 days. Report the overlap ...
}

Ява

// Get the existing policy from the DevicePolicyController instance.
SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy();

try {
  // Set the two annual freeze periods on the policy for our
  // retail point-of-sale devices.
  FreezePeriod summerSale = new FreezePeriod(
      MonthDay.of(6, 1),
      MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive
  FreezePeriod winterSale = new FreezePeriod(
      MonthDay.of(11, 20),
      MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive
  policy.setFreezePeriods(Arrays.asList(summerSale, winterSale));

  // Don’t forget to set the policy again to activate the freeze periods.
  dpm.setSystemUpdatePolicy(adminName, policy);

} catch (SystemUpdatePolicy.ValidationFailedException e) {
  // There must be previous periods recorded on the device because summerSale
  // and winterSale don’t overlap and are separated by more than 60 days.
  // Report the overlap ...
}

И начальный день, и день окончания включены. Если стартовый день больше, чем в конечный день (например, winterSale в предыдущем примере), период заморожения продлевается в следующем году.

При установке периодов замораживания в политике обновления системы Android тесты на эти требования:

  • Никакого периода замораживания не превышает 90 дней.
  • Интервал между периодами замораживания составляет не менее 60 дней.
  • Периоды замораживания не перекрываются.
  • Там нет повторяющихся периодов замораживания.

При настройке политики обновления системы для устройства Android повторяет эти тесты и включает в себя любые текущие или прошлые периоды замораживания для устройства.

Android бросает SystemUpdatePolicy.ValidationFailedException , когда какой -либо из этих тестов не удается.

Чтобы получить список периодов замораживания, ранее установленных в объекте политики обновления системы, все установленные приложения могут вызовать SystemUpdatePolicy.getFreezePeriods() . В следующем примере вызывает этот метод для регистрации периодов замораживания устройства:

Котлин

// Log any freeze periods that might be set on a system update policy.
dpm.systemUpdatePolicy?.freezePeriods?.forEach {
    Log.i(TAG, "Freeze period: $it")
}

Ява

// Log any freeze periods that might be set on a system update policy.
SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy();
if (currentPolicy != null) { // A policy might not be set.
  for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) {
    Log.i(TAG, "Freeze period: " + freezePeriod.toString());
  }
}

Прыжок лет

Android использует календарь ISO 8601 (также называемый григорианским календарем) для расчета периодов замораживания, и он игнорирует прыжок. Это означает, что 29 февраля не признается в качестве действительной даты и рассматривается так, как если бы это было 28 февраля. Поэтому 29 февраля не учитывается при вычислении продолжительности периода замораживания.

Разработка и тестирование

В то время как вы разрабатываете и тестируете функцию обновления системы вашего DPC, вам может потребоваться создать много периодов замораживания. Поскольку Android проверяет на 60-дневный интервал между прошлыми периодами замораживания, вы, возможно, не сможете установить новый период замораживания без сначала очистить запись прошлых периодов. Чтобы очистить запись периода замораживания устройства, запустите следующую команду в оболочке Android Debug Bridge (ADB):

adb shell dpm clear-freeze-period-record

Вы можете подтвердить, что устройство находится в периоде замораживания, проверив, что пользовательский интерфейс для системных обновлений отключен.

Обновления системы Google Play System (Mainline)

Обновления системы Google Play (также называемые Mainline Updates) автоматически загружаются, но требуют установки перезагрузки устройства. Эти обновления не запускают автоматическую перезагрузку, и вместо этого они установлены на следующей перезагрузке пользователя, администратора или политики. Перезагрузка, запускаемые политикой обновления системы, установит соответствующее обновление системы Google/OEM и любые ранее загруженные обновления системы Google Play.

Обновления системы Google Play также могут быть установлены вручную путем навигации по настройкам> о> Android версии> Обновление системы Google Play .

Отказаться от обновления

В некоторых случаях инструмент обновления обновления системы Google Play (GPSUR) может использоваться для восстановления состояния устройства из -за проблемной установки обновления системы Google Play. Этот инструмент должен использоваться передовыми пользователями или по указанию персонала поддержки, поскольку он может привести к потере данных. Вот как использовать инструмент gpsur:

  1. Если у вас есть мост Android Debug Bridge (ADB) на вашей машине, остановите службу ADB, прежде чем продолжить, чтобы он не мешал процессу отката. Чтобы остановить ADB, запустите adb kill-server .
  2. Откройте инструмент gpsur .
  3. Нажмите «Разрешить доступ к ADB, чтобы позволить инструменту взаимодействовать с вашим тестовым устройством через ADB».
  4. Нажмите «Добавить новое устройство» .
  5. Выберите свое устройство из списка и нажмите Connect . Этот список может не содержать полного имени устройства.
  6. На экране вашего устройства выберите «Всегда разрешайте» на этом компьютере и нажмите OK , чтобы принять подключение к отладке USB.
  7. Выберите подключенное устройство в вашем браузере.
  8. Текст кнопки на странице должен переключаться с отсутствия откатов, доступных для отката недавних обновлений , если на вашем устройстве есть откаты. Нажмите на Rellback последние обновления .
  9. Прочитайте предупреждения о модале подтверждения и нажмите «Подтвердить» .
  10. Подождите, пока откат завершится. После завершения появится успешный модал отката , и устройство перезагрузится. Теперь безопасно отключить ваше устройство.

Дополнительные ресурсы

Чтобы узнать больше об обновлениях системы, прочитайте документацию Android Open Source Project OTA .