Zarządzanie aktualizacjami systemu

Z tego przewodnika dla programistów dowiesz się, jak kontroler zasad dotyczących urządzeń może zarządzać aktualizacjami systemu Android w imieniu użytkownika urządzenia.

Wprowadzenie

Urządzenia z Androidem mogą otrzymywać i instalować aktualizacje systemu bezprzewodowo (OTA) i oprogramowanie aplikacji. Android powiadamia użytkownika urządzenia o aktualizacji systemu jest dostępna, a użytkownik urządzenia może zainstalować aktualizację od razu lub później.

Za pomocą DPC administrator IT może zarządzać aktualizacjami systemu u użytkownika urządzenia. Punkty DPC może być właścicielem w pełni zarządzanego urządzenia (nazywanego właścicielem urządzenia) lub profilu służbowego. (jest to tzw. właściciel profilu). Tabela 1 pokazuje, jak właściciele urządzeń mogą zarządzać systemem aktualizacji, podczas gdy właściciele profili mogą zgłaszać tylko informacje o aktualizacjach systemu.

Tabela 1. Zadania dostępne dla DPC zależą od trybu właściciela

Zadanie Właściciel urządzenia Właściciel profilu
Sprawdzanie oczekujących aktualizacji systemu
Odbieraj wywołania zwrotne, gdy dostępne będą nowe aktualizacje systemu
Konfigurowanie lokalnych zasad aktualizacji, aby kontrolować, kiedy Android instaluje aktualizacje systemu
Blokowanie wersji systemu operacyjnego w okresach krytycznych

Sprawdź oczekujące aktualizacje

Oczekiwanie na aktualizację to aktualizacja systemu urządzenia, które nie zostało jeszcze zainstalowane. DPC może pomóc administratorom IT sprawdzić, które urządzenia mają oczekujące aktualizacje systemu. np. poprosić użytkowników urządzeń o natychmiastowe instalowanie krytycznych aktualizacji.

Właściciele urządzeń i właściciele profili z Androidem 8.0 (poziom interfejsu API 26) lub nowszym może sprawdzić, czy urządzenie nie ma oczekującej aktualizacji systemu. Zadzwoń do nas DevicePolicyManager.getPendingSystemUpdate() co zwraca null, jeśli urządzenie jest aktualne. Jeśli trwa aktualizacja systemu, zwraca informacje o aktualizacji.

Więcej informacji o oczekującej aktualizacji

Po wywołaniu usługi getPendingSystemUpdate() możesz sprawdzić zwrócone SystemUpdateInfo, aby dowiedzieć się więcej o oczekującej aktualizacji. Poniższy przykład pokazuje, jak sprawdzić, kiedy oczekująca aktualizacja była pierwsza dostępnych na urządzeniu:

Kotlin

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

Java

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

Systemowe wywołania zwrotne

Gdy dostępna jest aktualizacja, system Android powiadamia właścicieli urządzeń o o nową aktualizację. W Androidzie 8.0 lub nowszym system powiadamia też właścicieli profili.

W podklasie DeviceAdminReceiver zastąp zmienną onSystemUpdatePending() oddzwanianie. Nie potrzebujesz zarejestrować się lub reklamować DPC i otrzymać oddzwonienie. System może należy wywoływać tę metodę więcej niż raz dla pojedynczej aktualizacji, więc należy sprawdzić stan aktualizacji zanim zareagujesz. Zadzwoń pod numer getPendingSystemUpdate(), aby dowiedzieć się więcej aktualizacji systemu w wywołaniu zwrotnym. Z przykładu poniżej dowiesz się, jak to zrobić:

Kotlin

/**
 * 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.
        // ...
    }
}

Java

/**
 * 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.
    // ...
  }
}

Gdy system ma więcej niż 1 DPC, na przykład profile służbowe na w pełni zarządzanym urządzenia, właściciel urządzenia i właściciel profilu otrzymają oddzwonienie.

Zaktualizuj zasady

Właściciel urządzenia może określić, kiedy aktualizacje mają być instalowane, konfigurując system lokalny zasady aktualizacji na urządzeniu. Istnieją 3 rodzaje zasad aktualizacji systemu:

Automatyczny
Instaluje aktualizacje systemu, gdy tylko zostaną i dostępne (bez interakcji ze strony użytkownika). Jeśli ustawisz ten typ zasady, wszystkie oczekujące aktualizacje zostaną natychmiast zainstalowane które mogą zostać przełożone na późniejszy okres konserwacji.
Z oknami
Instaluje aktualizacje systemu podczas codziennej konserwacji okna (bez interakcji użytkownika). Ustaw początek i koniec codziennego okresu konserwacji jako minuty w ciągu dnia podczas tworzenia nowej zasady dotyczącej okien.
Przełożone
Przekłada instalację aktualizacji systemu na 30 dni. Po 30 dniach po zakończeniu tego okresu system poprosi użytkownika urządzenia o zainstalowanie aktualizacji.

Okresy odroczenia

System ogranicza każdą aktualizację do 1 30-dniowego opóźnienia. Okres zaczyna się, gdy system najpierw przesunie aktualizację, a ustawienie nowych zasad odroczenia nie spowoduje wydłużyć okres.

Oprócz opóźnienia Android może nie być w stanie zainstalować aktualizacji dla innych na przykład brak połączenia, niewystarczająca ilość miejsca na dysku lub słaba bateria.

Jeśli pojawi się inna aktualizacja, system zresetuje 30-dniowy okres odroczenia. w danym okresie, umożliwiając administratorom IT wypróbowanie połączonego systemu aktualizacje. Po upływie 30 dni bez aktualizacji system wyświetli monit użytkownika, aby zainstalować wszystkie oczekujące aktualizacje. Później, gdy nowa aktualizacja systemu okres 30 dni zaczyna się od nowa.

Jak ustawić zasadę

Zasady aktualizacji możesz ustawiać w Androidzie 8.0 (poziom interfejsu API 26) lub nowszym. Aby określić kiedy urządzenie powinno instalować aktualizacje systemu, utwórz instancję SystemUpdatePolicy z wykorzystaniem jednego z 3 podanych niżej typów. powyżej. Aby skonfigurować zasadę, właściciel urządzenia wywołuje metodę DevicePolicyManager setSystemUpdatePolicy() Następujący kod: pokazuje, jak to zrobić. Aby zobaczyć przykład zasady w oknie, spójrz na dokumentację SystemUpdatePolicy.

Kotlin

// 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)

Java

// 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);

Po utworzeniu instancji zasad nie można ich zmienić. Aby zmienić ustawienia instaluje aktualizacje, możesz utworzyć i ustawić nowe zasady. Aby usunąć zasadę z urządzenia, wywołaj funkcję setSystemUpdatePolicy(), przekazując ciąg null jako argument policy. Gdy DPC usunie zasady, użytkownik urządzenia zobaczy powiadomienia o dostępnych aktualizacji systemu.

Aplikacje mogą zadzwonić pod numer getSystemUpdatePolicy(), aby pobrać bieżące zasady dla urządzenia. Jeśli ta metoda zwraca null, oznacza to, że nie jest obecnie skonfigurowana.

Okresy blokady

Aby zablokować wersję systemu operacyjnego w krytycznych okresach, takich jak święta lub inne dni z dużą intensywnością użytkowania właściciele urządzeń mogą zawiesić aktualizacje systemu na maksymalnie 90 dni. Gdy urządzenie jest w okresie blokady, działa w następujący sposób:

  • Urządzenie nie otrzymuje żadnych powiadomień o oczekujących aktualizacjach systemu.
  • Aktualizacje systemu operacyjnego nie są instalowane.
  • Użytkownicy urządzeń nie mogą ręcznie sprawdzić dostępności aktualizacji systemu w Ustawieniach.

System wymusza wymagany 60-dniowy okres buforowania po każdym zdefiniowanym zamrożeniu aby zapobiec zamrożeniu urządzenia na stałe. Pamiętaj, że system zamrażania mogą uniemożliwiać urządzeniom otrzymywanie krytycznych aktualizacji.

Rysunek 1. Ustawiono 2 okresy blokady dla urządzenia
Kalendarz przedstawiający 2 okresy blokady w roku z 60-dniowymi buforami.

W zasadach aktualizacji ustawiasz okresy blokady. Nie możesz ustawić okresów blokady bez ustawienia zasad. Gdy urządzenie jest poza ustawionymi okresami blokady, normalne działanie zasad (automatyczne, w okresie lub w przełożonym terminie).

Jak ustawić okres blokady

Okresy blokady możesz ustawiać w Androidzie 9 (poziom interfejsu API 28) i nowszych. Urządzenie właściciel ustawia okres blokady w zasadach aktualizacji systemu, zanim zasada zostanie skonfigurowana. dla danego urządzenia. Wykonaj te czynności:

  1. Utwórz nową (lub pobierz aktualną) zasadę aktualizacji systemu.
  2. Ustaw okresy blokady zasad, wywołując setFreezePeriods()
  3. Ustaw zasady i okresy blokady na urządzeniu, dzwoniąc setSystemUpdatePolicy()

Ponieważ okres blokady powtarza się co roku, daty rozpoczęcia i zakończenia okresu blokady są reprezentowane przez wartości miesiąca i dnia. Dzień rozpoczęcia musi zaczynać się o co najmniej 60 dni po zakończeniu poprzedniego okresu blokady. Przykład poniżej pokazuje, jak można ustawić 2 okresy blokady dla istniejącej zasady aktualizacji systemu:

Kotlin

// 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 ...
}

Java

// 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 ...
}

Zarówno dzień rozpoczęcia, jak i dzień końcowy mogą być uwzględniane. Jeśli dzień rozpoczęcia jest późniejszy niż w dniu zakończenia (np. winterSale w poprzednim przykładzie), blokada obejmuje kolejny rok.

Podczas ustawiania blokady w przypadku zasad dotyczących aktualizacji systemu, Android testuje te wymagania:

  • Żaden okres blokady nie może być dłuższy niż 90 dni.
  • Odstęp między okresami blokady wynosi co najmniej 60 dni.
  • Okresy blokady nie nakładają się na siebie.
  • Nie ma zduplikowanych okresów blokady.

Gdy ustawiasz zasadę aktualizacji systemu na urządzeniu, Android powtarza te testy oraz obejmuje wszystkie bieżące i przeszłe okresy blokady urządzenia.

Android zgłasza SystemUpdatePolicy.ValidationFailedException, gdy: każdy z tych testów się nie powiódł.

Aby uzyskać listę okresów blokady ustawionych wcześniej dla obiektu zasady aktualizacji systemu, wszystkie zainstalowane aplikacje mogą wywoływać połączenia SystemUpdatePolicy.getFreezePeriods() Poniżej Przykład wywołuje tę metodę, aby zapisać okresy blokady urządzenia:

Kotlin

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

Java

// 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());
  }
}

Lata przestępne

System Android korzysta z kalendarza ISO 8601 (zwanego też kalendarzem gregoriańskim), obliczają okresy zamrożenia i ignorują lata przestępne. Oznacza to, że 29 lutego nie jest rozpoznawana jako prawidłowa data i jest traktowana tak, jakby przyszła 28 lutego. Dlatego 29 lutego nie jest liczony przy obliczaniu czasu trwania blokady. okresu przejściowego.

Programowanie i testowanie

Podczas opracowywania i testowania funkcji aktualizacji systemu DPC być może muszą utworzyć wiele okresów blokady. Android sprawdza 60-dniowy interwał między wcześniejszymi okresami blokady, nie można ustawić nowego bez wcześniejszego czyszczenia rejestrów przeszłych miesiączek. Aby usunąć blokadę urządzenia okres, uruchom następujące polecenie w narzędziu Android Debug Bridge. Powłoka (adb):

adb shell dpm clear-freeze-period-record

Możesz potwierdzić, że urządzenie jest w okresie blokady, sprawdzając, czy użytkownik interfejsu aktualizacji systemu jest wyłączony.

Aktualizacje systemowe Google Play (Mainline)

Aktualizacje systemowe Google Play (nazywane też aktualizacjami Mainline) są pobrane automatycznie, ale ich instalacja wymaga ponownego uruchomienia urządzenia. Te aktualizacje nie wywołują automatycznego restartu. Zamiast tego są instalowane ponowne uruchomienie zainicjowane przez użytkownika, administratora lub zasadę. Ponowne uruchomienia aktywowane przez system zasady aktualizacji zainstalują powiązaną aktualizację systemu Google/OEM oraz wszelkie pobrane wcześniej aktualizacje systemowe Google Play.

Aktualizacje systemowe Google Play możesz też zainstalować ręcznie. Aby to zrobić, otwórz Ustawienia > Informacje > Wersja Androida > Aktualizacja systemowa Google Play.

Dodatkowe materiały

Aby dowiedzieć się więcej o aktualizacjach systemu, przeczytaj OTA projektu Android Open Source Project aktualizacji.