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ć bezprzewodowe (OTA) aktualizacje systemu i 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żne 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
Ustaw zasady dotyczące lokalnych aktualizacji, aby kontrolować, kiedy Android instaluje aktualizacje systemu
Blokowanie wersji systemu operacyjnego w okresach krytycznych

Sprawdzanie oczekujących aktualizacji

Oczekiwanie na aktualizację to aktualizacja systemu urządzenia, które nie zostało jeszcze zainstalowane. DPC może pomóc administratorom IT sprawdzić, na których urządzeniach oczekują aktualizacje systemu, i poprosić użytkowników o jak najszybsze zainstalowanie ważnych 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 aktualizacja systemu jest oczekująca, metoda 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 wywołać tę metodę więcej niż raz w przypadku jednej aktualizacji, dlatego przed odpowiedzią sprawdź stan aktualizacji. Zadzwoń pod numer getPendingSystemUpdate(), aby dowiedzieć się więcej aktualizacji systemu w wywołaniu zwrotnym. Ten przykład pokazuje, 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.
    // ...
  }
}

Jeśli system ma więcej niż 1 profil do pracy, np. profile służbowe na urządzeniach w pełni zarządzanych, zarówno właściciel urządzenia, jak i właściciel profilu otrzymają połączenie zwrotne.

Zaktualizuj zasady

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

Automatyczny
Instaluje aktualizacje systemu, gdy tylko są dostępne (bez udziału 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
Aktualizacje systemu są instalowane podczas codziennego okresu konserwacji (bez udziału 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 upływie 30 dni system poprosi użytkownika urządzenia o zainstalowanie aktualizacji.

Okresy odroczenia

System ogranicza każdą aktualizację do 1 30-dniowego opóźnienia. Okres rozpoczyna się, gdy system po raz pierwszy opóźni aktualizację. Ustawienie nowych zasad opóźnienia nie wydłuży tego okresu.

Oprócz opóźnienia Android może nie być w stanie zainstalować aktualizacji z innych powodów, takich jak brak połączenia, za mało 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 pojawienia się nowej aktualizacji system poprosi użytkownika o zainstalowanie wszystkich oczekujących aktualizacji. Później, gdy dostępna będzie nowa aktualizacja systemu, 30-dniowy okres rozpocznie się od nowa.

Jak ustawić zasadę

Zasady aktualizacji możesz ustawić w Androidzie 8.0 (poziom interfejsu API 26) lub nowszym. Aby określić, kiedy urządzenie ma instalować aktualizacje systemu, utwórz instancję SystemUpdatePolicy, używając jednego z 3 typów opisanych powyżej. Aby skonfigurować zasadę, właściciel urządzenia wywołuje metodę DevicePolicyManager setSystemUpdatePolicy() Następujący kod: pokazuje, jak to zrobić. Przykład zasad z oknem czasowym znajdziesz w dokumentacji 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 zmieniać. 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.
  • Nie są instalowane aktualizacje systemu operacyjnego.
  • Użytkownicy urządzenia nie mogą ręcznie sprawdzać dostępności aktualizacji systemu w Ustawieniach.

System wymusza obowiązkowy 60-dniowy okres buforowy po każdym zdefiniowanym okresie blokady, aby zapobiec blokowaniu urządzenia na czas nieokreślony. Pamiętaj, że zablokowanie aktualizacji systemu może uniemożliwić urządzeniom otrzymywanie krytycznych aktualizacji.

Rysunek 1. Na urządzeniu ustawiono 2 okresy blokady
Kalendarz z 2 okresami zamrożenia w roku z 60-dniowymi buforami.

W zasadach aktualizacji ustawiasz okresy blokady. Nie możesz ustawić okresów blokady bez ustawienia zasad. Poza ustawionym okresem blokady zasady działają standardowo (automatycznie, podczas konserwacji, przełożone).

Jak ustawić okres blokady

Okresy blokady możesz ustawiać w Androidzie 9 (poziom interfejsu API 28) lub nowszym. Urządzenie właściciel ustawia okres blokady w zasadach aktualizacji systemu, zanim zasada zostanie skonfigurowana. dla danego urządzenia. Aby to zrobić:

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

Okres zamrożenia powtarza się co roku, dlatego daty rozpoczęcia i zakończenia tego okresu 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 ustawić dwa okresy blokady dla istniejących zasad 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ż dzień zakończenia (jak winterSale w poprzednim przykładzie), okres zamrożenia jest przedłużany do następnego roku.

Podczas ustawiania okresów blokady w zasadach aktualizacji systemu Android sprawdza, czy są spełnione te wymagania:

  • 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 podwójnych okresów zamrożenia.

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 zwraca wartość SystemUpdatePolicy.ValidationFailedException, gdy którykolwiek z tych testów zakończy się niepowodzeniem.

Aby uzyskać listę okresów blokady ustawionych wcześniej w obiekcie zasad aktualizacji systemu, wszystkie zainstalowane aplikacje mogą wywołać funkcję SystemUpdatePolicy.getFreezePeriods(). W tym przykładzie metoda ta jest wywoływana w celu zarejestrowania okresów zamrożenia 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

Android używa kalendarza ISO 8601 (zwanego też kalendarzem gregoriańskim) do obliczania okresów zamrożenia i ignoruje 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 liczone przy obliczaniu czasu trwania okresu zamrożenia.

Programowanie i testowanie

Podczas tworzenia i testowania funkcji aktualizacji systemu DPC być może muszą utworzyć wiele okresów blokady. Android sprawdza, czy między poprzednimi okresami blokady jest 60-dniowy odstęp, więc nie można ustawić nowego okresu blokady bez wcześniejszego wyczyszczenia rekordu poprzednich okresów. Aby wyczyścić rekord okresu zawieszenia urządzenia, uruchom w powłoce Android Debug Bridge (adb) to polecenie:

adb shell dpm clear-freeze-period-record

Aby sprawdzić, czy urządzenie jest w okresie zamrożenia, sprawdź, czy interfejs użytkownika dla 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 przy następnym uruchomieniu zainicjowanym przez użytkownika, administratora lub zasady. Restarty wywołane przez zasadę aktualizacji systemu powodują zainstalowanie powiązanej aktualizacji systemu Google/OEM oraz wszystkich wcześniej pobranych aktualizacji systemowych 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.

Wycofywanie aktualizacji

W niektórych przypadkach narzędzie do przywracania aktualizacji systemu Google Play (GPSUR) może być używana do przywracania stanu urządzenia z powodu problematycznej aktualizacji systemowej Google Play instalacji. Z tego narzędzia powinni korzystać zaawansowani użytkownicy lub osoby, które otrzymały taką instrukcję od zespołu pomocy, ponieważ może ono spowodować utratę danych. Oto jak korzystać z GPSUR narzędzie:

  1. Jeśli na komputerze jest uruchomiony program Android Debug Bridge (adb), zatrzymaj usługi adb, zanim przejdziesz dalej, aby nie kolidować z procesu przywracania. Aby zatrzymać narzędzie adb, uruchom polecenie adb kill-server.
  2. Otwórz narzędzie GPSUR.
  3. Kliknij Zezwalaj na dostęp ADB, aby umożliwić narzędziu komunikowanie się z urządzeniem testowym za pomocą adb.
  4. Kliknij Dodaj nowe urządzenie.
  5. Wybierz urządzenie z listy i kliknij Połącz. Ta lista może nie być dostępna zawierają pełną nazwę urządzenia.
  6. Na ekranie urządzenia wybierz Zawsze zezwalaj na tym komputerze i kliknij OK, aby zaakceptować połączenie debugowania USB.
  7. Wybierz połączone urządzenie w przeglądarce.
  8. Tekst przycisku na stronie powinien zmienić się z Brak dostępnych przywrócenia na Cofnij ostatnie aktualizacje, jeśli na urządzeniu dostępne są takie funkcje. Kliknij Cofnij ostatnie aktualizacje.
  9. Przeczytaj ostrzeżenia w oknie Potwierdź cofnięcie i kliknij Potwierdź.
  10. Poczekaj na zakończenie przywracania. Po zakończeniu operacji pojawi się okno Przywrócenie do poprzedniej wersji, a urządzenie uruchomi się ponownie. Teraz możesz bezpiecznie odłączyć urządzenie urządzenia.

Dodatkowe materiały

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