blob: 3392c1355f8faacb5cff547c83e33db7ff182f0a [file] [log] [blame]
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="qv-wrapper">
<div id="qv">
<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>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</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 &gtAbout phone</b> и нажмите семь раз <b>Build number</b>.
Когда параметры разработчика станут доступны, откройте раздел
<b>Settings &gtDeveloper 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>