Obsługa trybu bezpośredniego rozruchu

Android 7.0 działa w bezpiecznym trybie bezpośredniego uruchamiania, gdy urządzenie jest włączone, ale użytkownik nie odblokował urządzenia. W tym celu system udostępnia 2 miejsca przechowywania danych:

  • zaszyfrowany magazyn danych logowania, który jest domyślną lokalizacją przechowywania i jest dostępny tylko po odblokowaniu urządzenia przez użytkownika;
  • Zaszyfrowana pamięć urządzenia, czyli miejsce na dane dostępne zarówno w trybie bezpośredniego uruchamiania, jak i po odblokowaniu urządzenia przez użytkownika.

Domyślnie aplikacje nie działają w trybie bezpośredniego rozruchu. Jeśli aplikacja musi podejmować działania w trybie bezpośredniego uruchamiania, możesz zarejestrować komponenty aplikacji, które będą uruchamiane w tym trybie. Do typowych przypadków użycia aplikacji, które muszą działać w trybie bezpośredniego rozruchu, należą:

  • Aplikacje, które mają zaplanowane powiadomienia, np. aplikacje z budzikiem.
  • Aplikacje, które wysyłają ważne powiadomienia dla użytkowników, np. aplikacje do obsługi SMS-ów.
  • Aplikacje, które udostępniają usługi ułatwień dostępu, np. TalkBack.

Jeśli aplikacja musi mieć dostęp do danych podczas działania w trybie bezpośredniego rozruchu, użyj zaszyfrowanego miejsca na dane na urządzeniu. Zaszyfrowana pamięć urządzenia zawiera dane zaszyfrowane kluczem, który jest dostępny tylko po pomyślnym uruchomieniu urządzenia z weryfikacją.

W przypadku danych, które muszą być szyfrowane za pomocą klucza powiązanego z danymi logowania użytkownika, np. kodem PIN lub hasłem, używaj magazynu szyfrowanego za pomocą danych logowania. Szyfrowane przechowywanie danych logowania jest dostępne po odblokowaniu urządzenia przez użytkownika i do momentu ponownego uruchomienia urządzenia. Jeśli użytkownik włączy ekran blokady po odblokowaniu urządzenia, zaszyfrowany magazyn danych logowania pozostanie dostępny.

Prośba o dostęp do uruchamiania podczas bezpośredniego rozruchu

Aplikacje muszą zarejestrować swoje komponenty w systemie, zanim będą mogły działać w trybie bezpośredniego uruchamiania lub uzyskać dostęp do zaszyfrowanej pamięci urządzenia. Aplikacje rejestrują się w systemie, oznaczając komponenty jako obsługujące szyfrowanie. Aby oznaczyć komponent jako obsługujący szyfrowanie, ustaw w pliku manifestu atrybut android:directBootAware na wartość true.

Komponenty obsługujące szyfrowanie mogą zarejestrować się, aby otrzymywać komunikat rozgłoszeniowy ACTION_LOCKED_BOOT_COMPLETED z systemu po ponownym uruchomieniu urządzenia. W tym momencie dostępne jest zaszyfrowane miejsce na dane urządzenia, a komponent może wykonywać zadania, które muszą być uruchamiane w trybie bezpośredniego uruchamiania, np. wywoływać zaplanowany alarm.

Ten fragment kodu pokazuje, jak zarejestrować BroadcastReceiver jako aplikację obsługującą szyfrowanie i dodać filtr intencji dla ACTION_LOCKED_BOOT_COMPLETED w pliku manifestu aplikacji:

<receiver
  android:directBootAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

Gdy użytkownik odblokuje urządzenie, wszystkie komponenty będą miały dostęp zarówno do zaszyfrowanego miejsca na dane na urządzeniu, jak i do zaszyfrowanego miejsca na dane logowania.

Dostęp do zaszyfrowanej pamięci urządzenia

Aby uzyskać dostęp do zaszyfrowanego miejsca na dane na urządzeniu, utwórz drugą instancję, wywołując funkcję Context Context.createDeviceProtectedStorageContext(). Wszystkie wywołania interfejsu API pamięci masowej wykonane w tym kontekście uzyskują dostęp do zaszyfrowanej pamięci urządzenia. W poniższym przykładzie uzyskuje się dostęp do zaszyfrowanego miejsca na dane na urządzeniu i otwiera istniejący plik danych aplikacji:

Kotlin

val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...

Java

Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

Używaj zaszyfrowanej pamięci urządzenia tylko w przypadku informacji, które muszą być dostępne w trybie bezpośredniego uruchamiania. Nie używaj zaszyfrowanej pamięci urządzenia jako ogólnego zaszyfrowanego magazynu. W przypadku prywatnych informacji o użytkowniku lub zaszyfrowanych danych, które nie są potrzebne w trybie bezpośredniego rozruchu, używaj pamięci zaszyfrowanej za pomocą danych logowania.

Otrzymywanie powiadomień o odblokowaniu przez użytkownika

Gdy użytkownik odblokuje urządzenie po ponownym uruchomieniu, aplikacja może przełączyć się na dostęp do zaszyfrowanego miejsca na dane logowania i korzystać ze zwykłych usług systemowych, które zależą od danych logowania użytkownika.

Aby otrzymywać powiadomienia, gdy użytkownik odblokuje urządzenie po ponownym uruchomieniu, zarejestruj BroadcastReceiver w działającym komponencie, aby nasłuchiwać wiadomości z powiadomieniami o odblokowaniu. Gdy użytkownik odblokuje urządzenie po uruchomieniu:

  • Jeśli Twoja aplikacja ma procesy działające na pierwszym planie, które wymagają natychmiastowego powiadomienia, nasłuchuj wiadomości ACTION_USER_UNLOCKED.
  • Jeśli Twoja aplikacja używa tylko procesów działających w tle, które mogą reagować na opóźnione powiadomienie, nasłuchuj komunikatu ACTION_BOOT_COMPLETED.

Jeśli użytkownik odblokował urządzenie, możesz to sprawdzić, dzwoniąc pod numer UserManager.isUserUnlocked().

Migracja dotychczasowych danych

Jeśli użytkownik zaktualizuje urządzenie, aby korzystać z trybu bezpośredniego rozruchu, możesz mieć istniejące dane, które należy przenieść do zaszyfrowanej pamięci urządzenia. Użyj funkcji Context.moveSharedPreferencesFrom()Context.moveDatabaseFrom(), gdzie kontekst docelowy jest wywołującym metodę, a kontekst źródłowy jest argumentem, aby przenieść dane preferencji i bazy danych między zaszyfrowanym za pomocą danych logowania a zaszyfrowanym na urządzeniu miejscem na dane.

Nie migruj prywatnych informacji o użytkowniku, takich jak hasła czy tokeny autoryzacji, z zaszyfrowanego miejsca przechowywania danych logowania do zaszyfrowanego miejsca przechowywania danych na urządzeniu. Decydując o tym, jakie inne dane przenieść do zaszyfrowanej pamięci urządzenia, kieruj się zdrowym rozsądkiem. W niektórych przypadkach może być konieczne zarządzanie oddzielnymi zestawami danych w obu zaszyfrowanych miejscach.

Testowanie aplikacji obsługującej szyfrowanie

Przetestuj aplikację obsługującą szyfrowanie z włączonym trybem bezpośredniego uruchamiania.

Większość urządzeń z najnowszymi wersjami Androida włącza tryb bezpośredniego uruchamiania, gdy tylko zostanie ustawione hasło blokady ekranu (kod PIN, wzór lub hasło). Dotyczy to w szczególności wszystkich urządzeń, które korzystają z szyfrowania opartego na plikach. Aby sprawdzić, czy urządzenie korzysta z szyfrowania opartego na plikach, uruchom to polecenie powłoki:

adb shell getprop ro.crypto.type

Jeśli dane wyjściowe to file, na urządzeniu jest włączone szyfrowanie oparte na plikach.

Na urządzeniach, które domyślnie nie używają szyfrowania opartego na plikach, mogą być dostępne inne opcje testowania trybu bezpośredniego uruchamiania:

  • Niektóre urządzenia, które korzystają z szyfrowania całego dysku (ro.crypto.type=block) i mają Androida w wersji od 7.0 do 12, można przekonwertować na szyfrowanie oparte na plikach. Można to zrobić na dwa sposoby:

      Ostrzeżenie: każda z metod przekształcania na szyfrowanie oparte na plikach powoduje wyczyszczenie wszystkich danych użytkownika na urządzeniu.

    • Jeśli nie masz jeszcze włączonych opcji programisty, włącz je na urządzeniu. Aby to zrobić, otwórz Ustawienia > Informacje o telefonie i 7 razy kliknij Numer kompilacji. Następnie otwórz Ustawienia > Opcje programisty i kliknij Konwertuj na szyfrowanie plików.
    • Możesz też uruchomić te polecenia w powłoce:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Urządzenia z Androidem 13 lub starszym obsługują „emulowany” tryb bezpośredniego rozruchu, który wykorzystuje uprawnienia do plików, aby symulować efekty blokowania i odblokowywania zaszyfrowanych plików. Trybu emulacji używaj tylko podczas programowania, ponieważ może on spowodować utratę danych. Aby włączyć emulowany tryb bezpośredniego uruchamiania, ustaw na urządzeniu wzór blokady, a gdy pojawi się prośba o skonfigurowanie bezpiecznego ekranu startowego, wybierz „Nie, dziękuję”. Następnie uruchom to polecenie w powłoce:

    adb shell sm set-emulate-fbe true
    

    Aby wyłączyć emulowany tryb bezpośredniego uruchamiania, uruchom to polecenie powłoki:

    adb shell sm set-emulate-fbe false
    

    Uruchomienie dowolnego z tych poleceń spowoduje ponowne uruchomienie urządzenia.

Sprawdzanie stanu szyfrowania zasad dotyczących urządzenia

Aplikacje do zarządzania urządzeniami mogą używać tego interfejsu, aby sprawdzać bieżący stan szyfrowania urządzenia.DevicePolicyManager.getStorageEncryptionStatus()

Jeśli aplikacja jest kierowana na poziom interfejsu API niższy niż Android 7.0 (API 24), funkcja getStorageEncryptionStatus() zwraca ENCRYPTION_STATUS_ACTIVE wartość, jeśli urządzenie korzysta z szyfrowania całego dysku lub szyfrowania opartego na plikach z bezpośrednim rozruchem. W obu tych przypadkach dane są zawsze przechowywane w spoczynku w postaci zaszyfrowanej.

Jeśli Twoja aplikacja jest kierowana na Androida 7.0 (API 24) lub nowszego,getStorageEncryptionStatus() zwracaENCRYPTION_STATUS_ACTIVE wartość, jeśli urządzenie korzysta z szyfrowania całego dysku. Zwraca wartość ENCRYPTION_STATUS_ACTIVE_PER_USER, jeśli urządzenie używa szyfrowania opartego na plikach z bezpośrednim rozruchem.

Jeśli tworzysz aplikację do zarządzania urządzeniami, która jest przeznaczona na Androida 7.0, sprawdź, czy urządzenie jest zaszyfrowane, korzystając z ENCRYPTION_STATUS_ACTIVEENCRYPTION_STATUS_ACTIVE_PER_USER.

Dodatkowe przykłady kodu

Przykład DirectBoot dodatkowo ilustruje użycie interfejsów API omówionych na tej stronie.