page.title=Режим Direct Boot page.keywords=preview,sdk,direct boot page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body

Содержание документа

  1. Запрос доступа для запуска в режиме Direct Boot
  2. Доступ к шифрованному хранилищу данных устройства
  3. Уведомление о разблокировке пользователем
  4. Перенос имеющихся данных
  5. Тестирование приложения с поддержкой шифрования

Android N работает в защищенном режиме Direct Boot, когда устройство было включено, но не разблокировано пользователем. Для поддержки такого режима работы в системе имеется два хранилища данных:

По умолчанию в режиме Direct Boot приложения не работают. Если вашему приложению требуется выполнять какие-то действия в режиме Direct Boot, вы можете зарегистрировать компоненты приложения, которые должны быть запущены в этом режиме. Некоторые распространенные примеры использования приложений, выполняющих операции в режиме Direct Boot:

Если вашему приложению требуется доступ к данным в режиме Direct Boot, используйте шифрованное хранилище устройства. Шифрованное хранилище устройства содержит данные, зашифрованные с помощью ключа, доступного только после успешной подтвержденной загрузки устройства.

Если данные следует шифровать с помощью ключа, связанного с учетными данными пользователя (например, с PIN-кодом или паролем), используйте хранилище, требующее ввода учетных данных. Такое хранилище доступно только после успешной разблокировки устройства пользователем и до тех пор, пока пользователь не перезапустит устройство. Если пользователь включает экран блокировки после разблокировки устройства, шифрованное хранилище, требующее ввода учетных данных, не блокируется.

Запрос доступа для запуска в режиме Direct Boot

Прежде чем работать в режиме 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, выполните одну из следующих последовательностей действий.

Если вам требуется переключать режимы на тестовых устройствах, вы можете использовать эмуляцию режима Direct Boot. Режим эмуляции следует использовать только для целей разработки, в нем возможна потеря данных. Чтобы включить эмуляцию режима Direct Boot, установите режим блокировки устройства, выберите пункт "No thanks", если система предлагает открыть защищенный экран запуска при установке режима блокировки, а затем используйте следующую команду оболочки adb:

$ adb shell sm set-emulate-fbe true

Для отключения эмуляции режима Direct Boot нужно использовать следующую команду:

$ adb shell sm set-emulate-fbe false

При использовании этих команд устройство перезагружается.