page.title=Режим Direct Boot page.keywords=preview,sdk,direct boot page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body
Android N работает в защищенном режиме Direct Boot, когда устройство было включено, но не разблокировано пользователем. Для поддержки такого режима работы в системе имеется два хранилища данных:
По умолчанию в режиме Direct Boot приложения не работают. Если вашему приложению требуется выполнять какие-то действия в режиме Direct Boot, вы можете зарегистрировать компоненты приложения, которые должны быть запущены в этом режиме. Некоторые распространенные примеры использования приложений, выполняющих операции в режиме Direct Boot:
Если вашему приложению требуется доступ к данным в режиме Direct Boot, используйте шифрованное хранилище устройства. Шифрованное хранилище устройства содержит данные, зашифрованные с помощью ключа, доступного только после успешной подтвержденной загрузки устройства.
Если данные следует шифровать с помощью ключа, связанного с учетными данными пользователя (например, с PIN-кодом или паролем), используйте хранилище, требующее ввода учетных данных. Такое хранилище доступно только после успешной разблокировки устройства пользователем и до тех пор, пока пользователь не перезапустит устройство. Если пользователь включает экран блокировки после разблокировки устройства, шифрованное хранилище, требующее ввода учетных данных, не блокируется.
Прежде
чем работать в режиме Direct Boot или получать доступ к шифрованному
хранилищу устройства, приложения должны зарегистрировать свои компоненты в системе. Приложения регистрируются в системе, помечая компоненты как
поддерживающие шифрование. Чтобы пометить компонент как поддерживающий шифрование, нужно установить для атрибута
android:encryptionAware
в манифесте значение true.
Компоненты, поддерживающие шифрование, можно регистрировать для получения
LOCKED_BOOT_COMPLETED
широковещательных сообщений от
системы после перезапуска устройства. В этот момент шифрованное хранилище устройства
доступно, и компонент может выполнять необходимые задачи в режиме
Direct Boot, например, включать будильник по расписанию.
В следующем фрагменте кода приведен пример регистрации компонента
{@link android.content.BroadcastReceiver} как поддерживающего шифрование и добавления
фильтра намерения LOCKED_BOOT_COMPLETED
в манифест приложения:
<receiever android:encryptionAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
После разблокировки устройства пользователем все компоненты имеют доступ к шифрованному хранилищу устройства и к шифрованному хранилищу, требующему ввода учетных данных.
Для получения доступа к шифрованному хранилищу устройства следует создать второй экземпляр
{@link android.content.Context} посредством вызова
Context.createDeviceEncryptedStorageContext()
. Все вызовы API
системы хранения данных с использованием этого контекста получают доступ к шифрованному хранилищу устройства. В
следующем примере показано, как получить доступ к шифрованному хранилищу устройства и открыть существующий
файл данных приложения:
Context directBootContext = Context.createDeviceEncryptedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
Шифрованное хранилище устройства следует использовать только для информации, которая должна быть доступна в режиме Direct Boot. Шифрованное хранилище устройства не следует использовать в качестве шифрованного хранилища общего назначения. Для хранения данных пользователя или шифрованных данных, которые не требуются в режиме Direct Boot, следует использовать шифрованное хранилище, требующее ввода учетных данных.
Когда после перезагрузки устройства пользователь разблокирует его, ваше приложение может переключиться на шифрованное хранилище, требующее ввода учетных данных, и использовать обычные системные службы, зависящие от учетных данных пользователя.
Чтобы приложение получало уведомления о разблокировке устройства пользователем после перезагрузки,
необходимо зарегистрировать {@link android.content.BroadcastReceiver} работающего компонента
для отслеживания сообщения ACTION_USER_UNLOCKED
. Также приложение может
получать существующее сообщение {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED}, которое теперь указывает, что устройство загружено и разблокировано
пользователем.
Приложение может направлять запрос напрямую, если пользователь разблокирует устройство посредством вызова
UserManager.isUserUnlocked()
.
Если пользователь обновит свое устройство для использования режима Direct Boot, вашему приложению может потребоваться перенести
имеющиеся данные в шифрованное хранилище устройства. Используйте
Context.migrateSharedPreferencesFrom()
и
Context.migrateDatabaseFrom()
для переноса данных о настройках и содержимого баз данных
между шифрованным хранилищем, требующим ввода учетных данных, и шифрованным хранилищем устройства.
Хорошо обдумайте, какие данные следует перенести из шифрованного хранилища, требующего ввода учетных данных, в шифрованное хранилище устройства. Не следует переносить в шифрованное хранилище устройства личные данные пользователя, такие как пароли или токены авторизации. В некоторых случаях вашему приложению может потребоваться работать с отдельными наборами данных в двух шифрованных хранилищах.
Протестируйте свое приложение с поддержкой шифрования в новом режиме Direct Boot. Существуют два способа включить режим Direct Boot.
Внимание! При включении режима Direct Boot с устройства удаляются все данные пользователя.
Чтобы включить режим Direct Boot на поддерживаемых устройствах с Android N, выполните одну из следующих последовательностей действий.
$ adb reboot-bootloader $ fastboot --wipe-and-use-fbe
Если вам требуется переключать режимы на тестовых устройствах, вы можете использовать эмуляцию режима Direct Boot. Режим эмуляции следует использовать только для целей разработки, в нем возможна потеря данных. Чтобы включить эмуляцию режима Direct Boot, установите режим блокировки устройства, выберите пункт "No thanks", если система предлагает открыть защищенный экран запуска при установке режима блокировки, а затем используйте следующую команду оболочки adb:
$ adb shell sm set-emulate-fbe true
Для отключения эмуляции режима Direct Boot нужно использовать следующую команду:
$ adb shell sm set-emulate-fbe false
При использовании этих команд устройство перезагружается.