1page.title=Режим Direct Boot 2page.keywords=preview,sdk,direct boot 3page.tags=androidn 4page.image=images/cards/card-nyc_2x.jpg 5 6@jd:body 7 8<div id="tb-wrapper"> 9<div id="tb"> 10 <h2>Содержание документа</h2> 11 <ol> 12 <li><a href="#run">Запрос доступа для запуска в режиме Direct Boot</a></li> 13 <li><a href="#access">Доступ к шифрованному хранилищу данных устройства</a></li> 14 <li><a href="#notification">Уведомление о разблокировке пользователем</a></li> 15 <li><a href="#migrating">Перенос имеющихся данных</a></li> 16 <li><a href="#testing">Тестирование приложения с поддержкой шифрования</a></li> 17 </ol> 18</div> 19</div> 20 21<p>Android N работает в защищенном режиме <i>Direct Boot,</i> когда 22устройство было включено, но не разблокировано пользователем. 23 Для поддержки такого режима работы в системе имеется два хранилища данных:</p> 24 25<ul> 26<li><i>Хранилище, зашифрованное на уровне учетных данных.</i>Это хранилище используется по умолчанию 27и доступно только тогда, когда пользователь разблокирует устройство.</li> 28<li><i>Хранилище, зашифрованное на уровне устройства.</i>Это хранилище доступно в режиме 29Direct Boot и тогда, когда пользователь разблокирует устройство.</li> 30</ul> 31 32<p>По умолчанию в режиме Direct Boot приложения не работают. 33Если вашему приложению требуется выполнять какие-то действия в режиме Direct Boot, вы можете зарегистрировать 34компоненты приложения, которые должны быть запущены в этом режиме. Некоторые распространенные примеры использования 35приложений, выполняющих операции в режиме Direct Boot:</p> 36 37<ul> 38<li>Приложения с уведомлениями по расписанию, например, 39будильники.</li> 40<li>Приложения, посылающие пользователю важные уведомления, например, приложения СМС.</li> 41<li>Приложения для лиц с ограниченными возможностями, например, Talkback.</li> 42</ul> 43 44<p>Если вашему приложению требуется доступ к данным в режиме Direct Boot, используйте 45шифрованное хранилище устройства. Шифрованное хранилище устройства содержит данные, 46зашифрованные с помощью ключа, доступного только после 47успешной подтвержденной загрузки устройства.</p> 48 49<p>Если данные следует шифровать с помощью ключа, связанного с учетными данными 50пользователя (например, с PIN-кодом или паролем), используйте хранилище, требующее ввода учетных данных. 51Такое хранилище доступно только после успешной 52разблокировки устройства пользователем и до тех пор, пока пользователь не перезапустит устройство. Если 53пользователь включает экран блокировки после разблокировки устройства, шифрованное хранилище, 54требующее ввода учетных данных, не блокируется.</p> 55 56<h2 id="run">Запрос доступа для запуска в режиме Direct Boot</h2> 57 58<p>Прежде 59чем работать в режиме Direct Boot или получать доступ к шифрованному 60хранилищу устройства, приложения должны зарегистрировать свои компоненты в системе. Приложения регистрируются в системе, помечая компоненты как 61<i>поддерживающие шифрование</i>. Чтобы пометить компонент как поддерживающий шифрование, нужно установить для атрибута 62<code>android:encryptionAware</code> в манифесте значение true.<p> 63 64<p>Компоненты, поддерживающие шифрование, можно регистрировать для получения 65<code>LOCKED_BOOT_COMPLETED</code> широковещательных сообщений от 66системы после перезапуска устройства. В этот момент шифрованное хранилище устройства 67доступно, и компонент может выполнять необходимые задачи в режиме 68Direct Boot, например, включать будильник по расписанию.</p> 69 70<p>В следующем фрагменте кода приведен пример регистрации компонента 71{@link android.content.BroadcastReceiver} как поддерживающего шифрование и добавления 72фильтра намерения <code>LOCKED_BOOT_COMPLETED</code> в манифест приложения:</p> 73 74<pre> 75<receiever 76 android:encryptionAware="true" > 77 ... 78 <intent-filter> 79 <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> 80 </intent-filter> 81</receiver> 82</pre> 83 84<p>После разблокировки устройства пользователем все компоненты имеют доступ к шифрованному хранилищу устройства 85и к шифрованному хранилищу, требующему ввода учетных данных.</p> 86 87<h2 id="access">Доступ к шифрованному хранилищу данных устройства</h2> 88 89<p>Для получения доступа к шифрованному хранилищу устройства следует создать второй экземпляр 90{@link android.content.Context} посредством вызова 91<code>Context.createDeviceEncryptedStorageContext()</code>. Все вызовы API 92системы хранения данных с использованием этого контекста получают доступ к шифрованному хранилищу устройства. В 93следующем примере показано, как получить доступ к шифрованному хранилищу устройства и открыть существующий 94файл данных приложения:</p> 95 96<pre> 97Context directBootContext = Context.createDeviceEncryptedStorageContext(); 98// Access appDataFilename that lives in device encrypted storage 99FileInputStream inStream = directBootContext.openFileInput(appDataFilename); 100// Use inStream to read content... 101</pre> 102 103<p>Шифрованное хранилище устройства следует использовать только для 104информации, которая должна быть доступна в режиме Direct Boot. 105Шифрованное хранилище устройства не следует использовать в качестве шифрованного хранилища общего назначения. 106Для хранения данных пользователя или шифрованных данных, которые не требуются в режиме 107Direct Boot, следует использовать шифрованное хранилище, требующее ввода учетных данных.</p> 108 109<h2 id="notification">Уведомление о разблокировке пользователем</h2> 110 111<p>Когда после перезагрузки устройства пользователь разблокирует его, ваше приложение может переключиться на 112шифрованное хранилище, требующее ввода учетных данных, и использовать обычные системные службы, 113зависящие от учетных данных пользователя.</p> 114 115<p>Чтобы приложение получало уведомления о разблокировке устройства пользователем после перезагрузки, 116необходимо зарегистрировать {@link android.content.BroadcastReceiver} работающего компонента 117для отслеживания сообщения <code>ACTION_USER_UNLOCKED</code>. Также приложение может 118получать существующее сообщение {@link android.content.Intent#ACTION_BOOT_COMPLETED 119ACTION_BOOT_COMPLETED}, которое теперь указывает, что устройство загружено и разблокировано 120пользователем.</p> 121 122<p>Приложение может направлять запрос напрямую, если пользователь разблокирует устройство посредством вызова 123<code>UserManager.isUserUnlocked()</code>.</p> 124 125<h2 id="migrating">Перенос имеющихся данных</h2> 126 127<p>Если пользователь обновит свое устройство для использования режима Direct Boot, вашему приложению может потребоваться перенести 128имеющиеся данные в шифрованное хранилище устройства. Используйте 129<code>Context.migrateSharedPreferencesFrom()</code> и 130<code>Context.migrateDatabaseFrom()</code> для переноса данных о настройках и содержимого баз данных 131между шифрованным хранилищем, требующим ввода учетных данных, и шифрованным хранилищем устройства.</p> 132 133<p>Хорошо обдумайте, какие данные следует перенести из 134шифрованного хранилища, требующего ввода учетных данных, в шифрованное хранилище устройства. Не следует переносить в 135шифрованное хранилище устройства личные данные пользователя, такие как 136пароли или токены авторизации. В некоторых случаях вашему приложению может потребоваться работать 137с отдельными наборами данных в двух шифрованных хранилищах.</p> 138 139<h2 id="testing">Тестирование приложения с поддержкой шифрования</h2> 140 141<p>Протестируйте свое приложение с поддержкой шифрования в новом режиме Direct Boot. Существуют 142два способа включить режим Direct Boot.</p> 143 144<p class="caution"><strong>Внимание!</strong> При включении режима Direct Boot 145с устройства удаляются все данные пользователя.</p> 146 147<p>Чтобы включить режим 148Direct Boot на поддерживаемых устройствах с Android N, выполните одну из следующих последовательностей действий.</p> 149 150<ul> 151<li>Включите на устройстве параметры разработчика <b>Developer options</b>, если вы еще не сделали этого ранее. Для этого 152перейдите на экран <b>Settings > About phone</b> и нажмите семь раз <b>Build number</b>. 153 Когда параметры разработчика станут доступны, откройте раздел 154<b>Settings > Developer options</b> и выберите 155<b>Convert to file encryption</b>.</li> 156<li>Используйте следующие команды оболочки adb для включения режима Direct Boot: 157<pre class="no-pretty-print"> 158$ adb reboot-bootloader 159$ fastboot --wipe-and-use-fbe 160</pre> 161</li> 162</ul> 163 164<p>Если вам требуется переключать 165режимы на тестовых устройствах, вы можете использовать эмуляцию режима Direct Boot. Режим эмуляции следует использовать только для целей 166разработки, в нем возможна потеря данных. Чтобы включить эмуляцию режима Direct Boot, 167установите режим блокировки устройства, выберите пункт "No thanks", если система предлагает открыть 168защищенный экран запуска при установке режима блокировки, а затем используйте 169следующую команду оболочки adb:</p> 170 171<pre class="no-pretty-print"> 172$ adb shell sm set-emulate-fbe true 173</pre> 174 175<p>Для отключения эмуляции режима Direct Boot нужно использовать следующую команду:</p> 176 177<pre class="no-pretty-print"> 178$ adb shell sm set-emulate-fbe false 179</pre> 180 181<p>При использовании этих команд устройство перезагружается.</p> 182