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
Konfigurowanie lokalnych zasad aktualizacji, aby kontrolować, kiedy Android instaluje aktualizacje systemu
Zablokowanie wersji systemu operacyjnego na czasy krytyczne

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ć, 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 korzystający z Androida w wersji 8.0 (poziom interfejsu API 26) lub nowszej mogą sprawdzić, czy na urządzeniu oczekuje aktualizacja 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. W tym przykładzie pokazujemy, jak można sprawdzić, kiedy oczekująca aktualizacja była po raz pierwszy dostępna 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. 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.
    // ...
  }
}

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.

Aktualizacja zasad

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). Podczas tworzenia nowych zasad okresowych ustaw początek i koniec codziennego okna konserwacji w minutach.
Przełożone
Opóźnia instalację aktualizacji systemu o 30 dni. Po 30 dniach po zakończeniu tego okresu system poprosi użytkownika urządzenia o zainstalowanie aktualizacji.

Okresy przesunięcia

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 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 ustawić 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 ustawić zasady, 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 zmieniać. Aby zmienić ustawienia instaluje aktualizacje, możesz utworzyć i ustawić nowe zasady. Aby usunąć zasadę z urządzenia, wywołaj funkcję setSystemUpdatePolicy(), podając jako argument null. 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 zwracana jest wartość null, oznacza to, że polityka nie jest obecnie ustawiona.

Okresy blokady

Aby zablokować wersję systemu operacyjnego w krytycznych okresach, takich jak święta lub inne okresy wzmożonej aktywności, właściciele urządzeń mogą zawiesić aktualizacje systemu na okres do 90 dni. Gdy urządzenie jest w okresie blokady, działa w następujący sposób:

  • Urządzenie nie otrzymuje powiadomień o oczekujących aktualizacjach systemu.
  • Nie są instalowane aktualizacje systemu operacyjnego.
  • Użytkownicy urządzeń nie mogą ręcznie sprawdzać 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 zablokowanie aktualizacji systemu może uniemożliwić urządzeniom otrzymywanie krytycznych aktualizacji.

Rysunek 1. Na urządzeniu ustawiono 2 okresy blokady
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) lub nowszym. 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. Aby ustawić okresy blokady w zasadach, wywołaj funkcję 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ż 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:

  • Okres blokady nie może być dłuższy niż 90 dni.
  • Interval 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 uznawane za prawidłową datę i jest traktowane jak 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 w DPC może być konieczne utworzenie wielu 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 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.

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. To narzędzie powinno być używane przez zaawansowanych użytkowników lub tylko wtedy, gdy zostaną o to poproszeni. przez personel pomocy, ponieważ może to 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 Zezwól na dostęp ADB, aby narzędzie mogło komunikować się z testem. na urządzeniu za pomocą narzędzia 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ź przywrócenie 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

Więcej informacji o aktualizacjach systemu znajdziesz w dokumentacji aktualizacji OTA projektu Android Open Source.