Android 11 obsługuje ponowne uruchomienie w tle, czyli ponowne uruchomienie procesów w przestrzeni użytkownika w czasie działania systemu. Jest ono używane do stosowania aktualizacji, które wymagają ponownego uruchomienia (np. aktualizacji pakietów APEX). Obecnie ponowne uruchomienie w tle jest ograniczone do procesów, które zostały uruchomione po zamontowaniu partycji userdata.
Ponowne uruchomienie w tle można wywołać na te sposoby:
z poziomu
PowerManagerprzez wywołaniePowerManager.reboot(PowerManager.REBOOT_USERSPACE)z poziomu powłoki za pomocą polecenia
adb shell svc power reboot userspacelubadb reboot userspace
Po ponownym uruchomieniu w tle zaszyfrowany magazyn danych uwierzytelniających pozostaje odblokowany.
Jeśli urządzenie obsługuje ponowne uruchomienie w tle, metoda interfejsu API PowerManager.isRebootingUserspace() zwraca wartość true, a wartość właściwości systemowej init.userspace_reboot.is_supported jest równa 1.
Jeśli urządzenie nie obsługuje ponownego uruchomienia w tle, wywołania
PowerManager.reboot(PowerManager.REBOOT_USERSPACE), adb reboot
userspace, i adb shell svc power reboot userspace kończą się niepowodzeniem.
Wykonanie ponownego uruchomienia w tle
Gdy zażądane zostanie ponowne uruchomienie w tle (za pomocą PowerManager lub z poziomu powłoki), init wykona te czynności:
Otrzyma
sys.powerctl=reboot,userspace.Utworzy osobny
UserspaceRebootWatchdogThread()proces do monitorowania ponownego uruchomienia w tle.Wywoła działanie
userspace-reboot-requested, które zresetuje wszystkie właściwości systemowe, które mogą mieć wpływ na ponowne uruchomienie w tle. Właściwości, których to dotyczy:sys.usb.configsys.usb.statesys.boot_completeddev.bootcompletesys.init.updatable_crashingsys.init.updatable_crashing_process_nameapexd.statussys.user.0.ce_availablesys.shutdown.requestedservice.bootanim.exit
Powyższe właściwości należy ponownie ustawić podczas sekwencji uruchamiania. W razie potrzeby możesz zresetować dodatkowe właściwości. Przykłady znajdziesz w działaniu
on userspace-reboot-requestedwrootdir/init.rc.Uruchomi funkcję
DoUserspaceReboot, która wykona te działania:- Wyśle sygnał
SIGTERMdo procesów uruchomionych po zamontowaniu partycjiuserdatai poczeka na ich zatrzymanie. - Po upływie limitu czasu wyśle sygnał
SIGKILL, aby zakończyć wszystkie działające procesy. - Wywoła polecenie
/system/bin/vdc volume reset. - Odmontuje urządzenie zRAM.
- Odmontuje aktywne pakiety APEX.
- Przełączy się z powrotem do przestrzeni nazw montowania bootstrap.
- Wywoła
userspace-reboot-resumedziałanie.
- Wyśle sygnał
Jeśli przed ponownym uruchomieniem w tle zażądano utworzenia punktu kontrolnego systemu plików, partycja userdata zostanie ponownie zamontowana w trybie punktu kontrolnego podczas działania userspace-reboot-fs-remount (szczegóły znajdziesz w następnej sekcji). Ponowne uruchomienie w tle jest uznawane za zakończone, gdy sys.boot_completed property zostanie ustawione
na 1. Po zakończeniu ponownego uruchomienia w tle wyświetlacz pozostaje wyłączony i wymaga wyraźnej interakcji użytkownika, aby się wybudzić.
Punkty kontrolne systemu plików
Jeśli przed ponownym uruchomieniem w tle zażądano utworzenia punktu kontrolnego systemu plików, partycja userdata zostanie ponownie zamontowana w trybie punktu kontrolnego podczas ponownego uruchomienia w tle.
Logika ponownego montowania jest zaimplementowana w funkcji
fs_mgr_remount_userdata_into_checkpointing
i różni się w zależności od metody tworzenia punktów kontrolnych. Gdy partycja userdata obsługuje:
punkty kontrolne na poziomie systemu plików (np.
f2fs), partycjauserdatajest ponownie montowana z opcjącheckpoint=disable.punkty kontrolne na poziomie bloków (np.
ext4), partycja/datajest odmontowywana, a wszystkie nadrzędne urządzenia mapowania urządzeń, na których była zamontowana, są niszczone. Następnie partycjauserdatajest montowana przy użyciu tej samej ścieżki kodu, która jest używana podczas normalnego uruchamiania z punktu kontrolnego.
Jeśli do zarządzania kluczami zaszyfrowanymi za pomocą danych uwierzytelniających (CE) i kluczami zaszyfrowanymi za pomocą urządzenia (DE) używany jest pęk kluczy na poziomie systemu plików, klucze są tracone po odmontowaniu partycji userdata. Aby umożliwić przywrócenie klucza, podczas instalowania klucza w pęku kluczy systemu plików usługa vold instaluje też ten sam klucz typu fscrypt-provisioning w pęku kluczy na poziomie sesji. Gdy wywoływana jest funkcja init_user0, usługa vold ponownie instaluje klucze w pęku kluczy systemu plików.
Powrót do ponownego uruchomienia
Aby ponowne uruchomienie w tle nie spowodowało, że urządzenie będzie bezużyteczne, Android 11 zawiera powrót do ponownego uruchomienia, który jest wywoływany, gdy zostanie spełniony jeden z tych warunków:
- Urządzenie nie może rozpocząć ponownego uruchomienia w tle (czyli
sys.init.userspace_reboot.in_progress=1) w określonym limicie czasu. - Proces nie może się zatrzymać w określonym limicie czasu.
- Operacja
/system/bin/vdc volume resetnie powiodła się. - Odmontowanie urządzenia zRAM nie powiodło się.
- Aktywny pakiet APEX został nieprawidłowo odmontowany.
- Próba ponownego zamontowania partycji
userdataw trybie punktu kontrolnego nie powiodła się. - Urządzenie nie może się prawidłowo uruchomić (czyli
sys.boot_completed=1) w określonym limicie czasu.
Konfiguracja na urządzenie
Niektóre aspekty ponownego uruchomienia w tle można dostosować, zmieniając wartości tych właściwości:
init.userspace_reboot.is_supportedokreśla, kiedy urządzenie może wykonać ponowne uruchomienie w tle. Jeśli wartość tej właściwości tofalse,0lub nie jest określona, próby ponownego uruchomienia są odrzucane.init.userspace_reboot.sigkill.timeoutmillisokreśla limit czasu w milisekundach na zatrzymanie procesów, które otrzymały sygnałSIGKILL. Jeśli jeden z procesów nie zatrzyma się w określonym limicie czasu, zostanie wywołany powrót do ponownego uruchomienia.init.userspace_reboot.sigterm.timeoutmillisokreśla limit czasu w milisekundach na zakończenie procesów, które otrzymały sygnałSIGTERM. Wszystkie procesy, które nie zakończyły się w określonym limicie czasu, otrzymają sygnałSIGKILL.init.userspace_reboot.started.timeoutmillisokreśla limit czasu w milisekundach na rozpoczęcie ponownego uruchomienia w tle (czylisys.init.userspace_reboot.in_progress=1). Jeśli urządzenie nie może rozpocząć ponownego uruchomienia w tle w określonym limicie czasu, zostanie wywołany powrót do ponownego uruchomienia.init.userspace_reboot.userdata_remount.timeoutmillisokreśla limit czasu w milisekundach na odmontowanie partycjiuserdata. Jeśli urządzenie nie może odmontować partycjiuserdataw określonym limicie czasu, zostanie wywołany powrót do ponownego uruchomienia.init.userspace_reboot.watchdog.timeoutmillisokreśla limit czasu na prawidłowe uruchomienie urządzenia (czylisys.boot_completed=1). Jeśli urządzenie nie może się uruchomić w określonym limicie czasu, zostanie wywołany powrót do ponownego uruchomienia.
Dostosowywanie animacji podczas ponownego uruchomienia w tle
Implementacja referencyjna ponownego uruchomienia w tle umożliwia dostosowanie animacji wyświetlanej podczas ponownego uruchomienia w tle.
Po zakończeniu działania userspace-reboot-fs-remount usługa init uruchamia usługę bootanim. Ta usługa szuka w podanej kolejności tych plików animacji i odtwarza pierwszy znaleziony:
/product/media/userspace-reboot.zip/oem/media/userspace-reboot.zip/system/media/userspace-reboot.zip
Jeśli nie określono plików animacji specyficznych dla ponownego uruchomienia w tle, usługa bootanim wyświetla domyślną animację android.
Testowanie
Android 11 zawiera implementację referencyjną ponownego uruchomienia w tle. Ponadto możesz sprawdzić ponowne uruchomienie w tle za pomocą testów CTS
w
UserspaceRebootHostTest.