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
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.
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:
- Utwórz nową (lub pobierz aktualną) zasadę aktualizacji systemu.
- Ustaw okresy blokady zasad, wywołując
setFreezePeriods()
- 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.