summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/ru/preview/features/direct-boot.jd
blob: b49624bf9216d161e0617598842a1d190da92a9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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 &gt; About phone</b> и нажмите семь раз <b>Build number</b>.
 Когда параметры разработчика станут доступны, откройте раздел
<b>Settings &gt; 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>