| page.title=Режим Direct Boot |
| page.keywords=preview,sdk,direct boot |
| page.tags=androidn |
| page.image=images/cards/card-nyc_2x.jpg |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| <h2>Содержание документа</h2> |
| <ol> |
| <li><a href="#run">Запрос доступа для запуска в режиме Direct Boot</a></li> |
| <li><a href="#access">Доступ к шифрованному хранилищу данных устройства</a></li> |
| <li><a href="#notification">Уведомление о разблокировке пользователем</a></li> |
| <li><a href="#migrating">Перенос имеющихся данных</a></li> |
| <li><a href="#testing">Тестирование приложения с поддержкой шифрования</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <p>Android N работает в защищенном режиме <i>Direct Boot,</i> когда |
| устройство было включено, но не разблокировано пользователем. |
| Для поддержки такого режима работы в системе имеется два хранилища данных:</p> |
| |
| <ul> |
| <li><i>Хранилище, зашифрованное на уровне учетных данных.</i>Это хранилище используется по умолчанию |
| и доступно только тогда, когда пользователь разблокирует устройство.</li> |
| <li><i>Хранилище, зашифрованное на уровне устройства.</i>Это хранилище доступно в режиме |
| Direct Boot и тогда, когда пользователь разблокирует устройство.</li> |
| </ul> |
| |
| <p>По умолчанию в режиме Direct Boot приложения не работают. |
| Если вашему приложению требуется выполнять какие-то действия в режиме Direct Boot, вы можете зарегистрировать |
| компоненты приложения, которые должны быть запущены в этом режиме. Некоторые распространенные примеры использования |
| приложений, выполняющих операции в режиме Direct Boot:</p> |
| |
| <ul> |
| <li>Приложения с уведомлениями по расписанию, например, |
| будильники.</li> |
| <li>Приложения, посылающие пользователю важные уведомления, например, приложения СМС.</li> |
| <li>Приложения для лиц с ограниченными возможностями, например, Talkback.</li> |
| </ul> |
| |
| <p>Если вашему приложению требуется доступ к данным в режиме Direct Boot, используйте |
| шифрованное хранилище устройства. Шифрованное хранилище устройства содержит данные, |
| зашифрованные с помощью ключа, доступного только после |
| успешной подтвержденной загрузки устройства.</p> |
| |
| <p>Если данные следует шифровать с помощью ключа, связанного с учетными данными |
| пользователя (например, с PIN-кодом или паролем), используйте хранилище, требующее ввода учетных данных. |
| Такое хранилище доступно только после успешной |
| разблокировки устройства пользователем и до тех пор, пока пользователь не перезапустит устройство. Если |
| пользователь включает экран блокировки после разблокировки устройства, шифрованное хранилище, |
| требующее ввода учетных данных, не блокируется.</p> |
| |
| <h2 id="run">Запрос доступа для запуска в режиме Direct Boot</h2> |
| |
| <p>Прежде |
| чем работать в режиме Direct Boot или получать доступ к шифрованному |
| хранилищу устройства, приложения должны зарегистрировать свои компоненты в системе. Приложения регистрируются в системе, помечая компоненты как |
| <i>поддерживающие шифрование</i>. Чтобы пометить компонент как поддерживающий шифрование, нужно установить для атрибута |
| <code>android:encryptionAware</code> в манифесте значение true.<p> |
| |
| <p>Компоненты, поддерживающие шифрование, можно регистрировать для получения |
| <code>LOCKED_BOOT_COMPLETED</code> широковещательных сообщений от |
| системы после перезапуска устройства. В этот момент шифрованное хранилище устройства |
| доступно, и компонент может выполнять необходимые задачи в режиме |
| Direct Boot, например, включать будильник по расписанию.</p> |
| |
| <p>В следующем фрагменте кода приведен пример регистрации компонента |
| {@link android.content.BroadcastReceiver} как поддерживающего шифрование и добавления |
| фильтра намерения <code>LOCKED_BOOT_COMPLETED</code> в манифест приложения:</p> |
| |
| <pre> |
| <receiever |
| android:encryptionAware="true" > |
| ... |
| <intent-filter> |
| <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> |
| </intent-filter> |
| </receiver> |
| </pre> |
| |
| <p>После разблокировки устройства пользователем все компоненты имеют доступ к шифрованному хранилищу устройства |
| и к шифрованному хранилищу, требующему ввода учетных данных.</p> |
| |
| <h2 id="access">Доступ к шифрованному хранилищу данных устройства</h2> |
| |
| <p>Для получения доступа к шифрованному хранилищу устройства следует создать второй экземпляр |
| {@link android.content.Context} посредством вызова |
| <code>Context.createDeviceEncryptedStorageContext()</code>. Все вызовы API |
| системы хранения данных с использованием этого контекста получают доступ к шифрованному хранилищу устройства. В |
| следующем примере показано, как получить доступ к шифрованному хранилищу устройства и открыть существующий |
| файл данных приложения:</p> |
| |
| <pre> |
| Context directBootContext = Context.createDeviceEncryptedStorageContext(); |
| // Access appDataFilename that lives in device encrypted storage |
| FileInputStream inStream = directBootContext.openFileInput(appDataFilename); |
| // Use inStream to read content... |
| </pre> |
| |
| <p>Шифрованное хранилище устройства следует использовать только для |
| информации, которая должна быть доступна в режиме Direct Boot. |
| Шифрованное хранилище устройства не следует использовать в качестве шифрованного хранилища общего назначения. |
| Для хранения данных пользователя или шифрованных данных, которые не требуются в режиме |
| Direct Boot, следует использовать шифрованное хранилище, требующее ввода учетных данных.</p> |
| |
| <h2 id="notification">Уведомление о разблокировке пользователем</h2> |
| |
| <p>Когда после перезагрузки устройства пользователь разблокирует его, ваше приложение может переключиться на |
| шифрованное хранилище, требующее ввода учетных данных, и использовать обычные системные службы, |
| зависящие от учетных данных пользователя.</p> |
| |
| <p>Чтобы приложение получало уведомления о разблокировке устройства пользователем после перезагрузки, |
| необходимо зарегистрировать {@link android.content.BroadcastReceiver} работающего компонента |
| для отслеживания сообщения <code>ACTION_USER_UNLOCKED</code>. Также приложение может |
| получать существующее сообщение {@link android.content.Intent#ACTION_BOOT_COMPLETED |
| ACTION_BOOT_COMPLETED}, которое теперь указывает, что устройство загружено и разблокировано |
| пользователем.</p> |
| |
| <p>Приложение может направлять запрос напрямую, если пользователь разблокирует устройство посредством вызова |
| <code>UserManager.isUserUnlocked()</code>.</p> |
| |
| <h2 id="migrating">Перенос имеющихся данных</h2> |
| |
| <p>Если пользователь обновит свое устройство для использования режима Direct Boot, вашему приложению может потребоваться перенести |
| имеющиеся данные в шифрованное хранилище устройства. Используйте |
| <code>Context.migrateSharedPreferencesFrom()</code> и |
| <code>Context.migrateDatabaseFrom()</code> для переноса данных о настройках и содержимого баз данных |
| между шифрованным хранилищем, требующим ввода учетных данных, и шифрованным хранилищем устройства.</p> |
| |
| <p>Хорошо обдумайте, какие данные следует перенести из |
| шифрованного хранилища, требующего ввода учетных данных, в шифрованное хранилище устройства. Не следует переносить в |
| шифрованное хранилище устройства личные данные пользователя, такие как |
| пароли или токены авторизации. В некоторых случаях вашему приложению может потребоваться работать |
| с отдельными наборами данных в двух шифрованных хранилищах.</p> |
| |
| <h2 id="testing">Тестирование приложения с поддержкой шифрования</h2> |
| |
| <p>Протестируйте свое приложение с поддержкой шифрования в новом режиме Direct Boot. Существуют |
| два способа включить режим Direct Boot.</p> |
| |
| <p class="caution"><strong>Внимание!</strong> При включении режима Direct Boot |
| с устройства удаляются все данные пользователя.</p> |
| |
| <p>Чтобы включить режим |
| Direct Boot на поддерживаемых устройствах с Android N, выполните одну из следующих последовательностей действий.</p> |
| |
| <ul> |
| <li>Включите на устройстве параметры разработчика <b>Developer options</b>, если вы еще не сделали этого ранее. Для этого |
| перейдите на экран <b>Settings > About phone</b> и нажмите семь раз <b>Build number</b>. |
| Когда параметры разработчика станут доступны, откройте раздел |
| <b>Settings > Developer options</b> и выберите |
| <b>Convert to file encryption</b>.</li> |
| <li>Используйте следующие команды оболочки adb для включения режима Direct Boot: |
| <pre class="no-pretty-print"> |
| $ adb reboot-bootloader |
| $ fastboot --wipe-and-use-fbe |
| </pre> |
| </li> |
| </ul> |
| |
| <p>Если вам требуется переключать |
| режимы на тестовых устройствах, вы можете использовать эмуляцию режима Direct Boot. Режим эмуляции следует использовать только для целей |
| разработки, в нем возможна потеря данных. Чтобы включить эмуляцию режима Direct Boot, |
| установите режим блокировки устройства, выберите пункт "No thanks", если система предлагает открыть |
| защищенный экран запуска при установке режима блокировки, а затем используйте |
| следующую команду оболочки adb:</p> |
| |
| <pre class="no-pretty-print"> |
| $ adb shell sm set-emulate-fbe true |
| </pre> |
| |
| <p>Для отключения эмуляции режима Direct Boot нужно использовать следующую команду:</p> |
| |
| <pre class="no-pretty-print"> |
| $ adb shell sm set-emulate-fbe false |
| </pre> |
| |
| <p>При использовании этих команд устройство перезагружается.</p> |