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
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.
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:
- Utwórz nową (lub pobierz aktualną) zasadę aktualizacji systemu.
- Aby ustawić okresy blokady w zasadach, wywołaj funkcję
setFreezePeriods()
. - 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:
- 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
. - Otwórz narzędzie GPSUR.
- Kliknij Zezwól na dostęp ADB, aby narzędzie mogło komunikować się z testem. na urządzeniu za pomocą narzędzia adb.
- Kliknij Dodaj nowe urządzenie.
- Wybierz urządzenie z listy i kliknij Połącz. Ta lista może nie być dostępna zawierają pełną nazwę urządzenia.
- Na ekranie urządzenia wybierz Zawsze zezwalaj na tym komputerze i kliknij OK, aby zaakceptować połączenie debugowania USB.
- Wybierz połączone urządzenie w przeglądarce.
- 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.
- Przeczytaj ostrzeżenia w oknie Potwierdź przywrócenie i kliknij Potwierdź.
- 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.