1page.title=Изменения в работе
2page.keywords=preview,sdk,compatibility
3meta.tags="предварительная версия", "совместимость"
4page.tags="preview", "developer preview"
5page.image=images/cards/card-n-changes_2x.png
6@jd:body
7
8
9<div id="qv-wrapper">
10<div id="qv">
11
12<h2>Содержание документа</h2>
13
14<ol>
15  <li><a href="#perf">Повышение производительности</a>
16    <ol>
17      <li><a href="#doze">Режим Doze</a></li>
18      <li><a href="#bg-opt">Оптимизация фоновых процессов</a></li>
19    </ol>
20  </li>
21  <li><a href="#perm">Изменения разрешений</a></li>
22  <li><a href="#accessibility">Улучшенные специальные возможности</a>
23    <ol>
24      <li><a href="#screen-zoom">Масштабирование экрана</a></li>
25      <li><a href="#vision-settings">Vision Settings в мастере настройки</a></li>
26    </ol>
27  </li>
28  <li><a href="#ndk">Связь приложений NDK с библиотеками платформы</a></li>
29  <li><a href="#afw">Android for Work</a></li>
30</ol>
31
32<h2>Дополнительно</h2>
33<ol>
34  <li><a href="{@docRoot}preview/api-overview.html">Обзор API-интерфейсов Android N</a>
35</li>
36</ol>
37
38</div>
39</div>
40
41
42<p>
43  Наряду с новыми функциями и возможностями в Android N появились различные изменения
44работы системы и API. В этом документе рассматриваются некоторые наиболее важные
45изменения, которые следует понимать и учитывать при разработке приложений.
46
47</p>
48
49<p>
50  Если вы ранее публиковали приложения для Android, то примите во внимание,
51что эти изменения в платформе могут повлиять на работу ваших уже опубликованных приложений.
52</p>
53
54
55<h2 id="perf">Повышение производительности</h2>
56
57<p>
58  Изменения в работе системы Android N нацелены на более экономное использование заряда аккумулятора
59и оперативной памяти, а также на повышение производительности приложений. Эти изменения могут повлиять
60на системные уведомления и доступность системных ресурсов для вашего приложения. Вам следует
61ознакомиться с этими изменениями и оценить, какие исправления могут понадобиться вашему приложению для соответствия этим изменениям.
62
63</p>
64
65<h3 id="doze">Режим Doze</h3>
66
67<p>
68  Появившийся в Android 6.0 (уровень API 23), режим Doze экономит заряд аккумулятора,
69откладывая процессорные и сетевые операции, когда устройство находится не на зарядке,
70оно неподвижно, и его экран погашен. Android N расширяет возможности
71режима Doze, применяя частичный набор процессорных и сетевых ограничений
72в тех случаях, когда устройство находится не на зарядке, с погашенным экраном, но не обязательно неподвижно,
73например, когда оно находится в кармане пользователя.
74</p>
75
76
77<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
78<p class="img-caption">
79  <strong>Рис. 1.</strong> Иллюстрация применения первого уровня ограничений активности системы в режиме Doze
80для экономии заряда аккумулятора.
81</p>
82
83<p>
84  Когда устройство питается от аккумулятора и его экран отключен в течение некоторого промежутка времени,
85устройство переходит в режим Doze и применяет первый частичный набор ограничений: закрывается доступ приложений
86к сети, откладывается выполнение заданий и синхронизации. Если устройство
87остается неподвижным в течение определенного времени после перехода в режим Doze, система применяет
88остальные ограничения Doze для {@link android.os.PowerManager.WakeLock},
89оповещений {@link android.app.AlarmManager}, сканирования GPS и Wi-Fi. Независимо от того, были применены
90все или только некоторые ограничения режима Doze, устройство периодически пробуждается на короткий промежуток времени,
91в течение которого приложениям разрешается сетевой доступ
92и выполнение отложенных заданий или синхронизации.
93</p>
94
95
96<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
97<p class="img-caption">
98  <strong>Рис. 2.</strong> Иллюстрация применения второго уровня ограничений активности системы в режиме Doze
99после того, как устройство неподвижно в течение определенного времени.
100</p>
101
102<p>
103  Следует отметить, что включение экрана или подключение к источнику питания приводит
104к выходу устройства из режима Doze и
105снимает эти ограничения обработки. Эти дополнительные особенности поведения
106не влияют на советы и рекомендации по адаптации приложений к предыдущей
107версии режима Doze из Android 6.0 (уровень API 23), которые были рассмотрены в документе
108<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">Оптимизация для режима Doze и режима ожидания для приложений</a>.
109Вы должны следовать этим рекомендациям (например, использовать Google Cloud Messaging (GCM)
110для отправки и получения сообщений) и приступить к планированию обновлений для соответствия дополнительному поведению режима
111Doze.
112</p>
113
114
115<h3 id="bg-opt">Проект Svelte: оптимизация фоновых процессов</h3>
116
117<p>
118  В Android N удалены три неявных широковещательной рассылки с целью оптимизации
119потребления памяти и энергии. Причиной этого изменения стало то, что неявные
120широковещательные рассылки часто запускали приложения, которые прослушивали их в
121фоновом режиме. Удаление этих рассылок может существенно улучшить производительность устройства
122и работу интерфейса пользователя.
123</p>
124
125<p>
126  На мобильных устройствах часто могут происходить изменения подключения, например, при переключении
127между Wi-Fi и мобильным трафиком. Сейчас приложения могут следить за изменениями
128подключения, зарегистрировавшись в качестве получателя для неявных широковещательных рассылок {@link
129  android.net.ConnectivityManager#CONNECTIVITY_ACTION} в своем манифесте.
130Поскольку для получения этих рассылок регистрируются многие приложения, каждое
131переключение сети может вызвать их активацию и одновременную обработку рассылки.
132
133</p>
134
135<p>
136  Подобным образом приложения могут регистрироваться для получения неявных широковещательных рассылок {@link
137  android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
138  android.hardware.Camera#ACTION_NEW_VIDEO} от других приложений, например от камеры.
139Когда пользователь делает снимок с помощью приложения камеры, эти приложения активируются
140для обработки широковещательной рассылки.
141</p>
142
143<p>
144  Для устранения этих проблем Android N применяет следующие
145способы оптимизации.
146</p>
147
148<ul>
149  <li>Приложения для Android N не получают широковещательные рассылки {@link
150  android.net.ConnectivityManager#CONNECTIVITY_ACTION}, даже если в их манифесте
151указаны требования получения уведомлений об этих событиях. Приложения в активном режиме
152могут следить за событиями {@code CONNECTIVITY_CHANGE} в своем
153основном потоке, если они запрашивают уведомление через {@link
154  android.content.BroadcastReceiver}.
155  </li>
156
157  <li>Приложения не могут отправлять или получать широковещательные рассылки {@link
158  android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
159  android.hardware.Camera#ACTION_NEW_VIDEO}. Эта оптимизация влияет на все приложения, включая те, которые не предназначены для Android N.
160
161  </li>
162</ul>
163
164<p>
165  В будущих выпусках Android могут быть отменены другие неявные широковещательные рассылки,
166а также отменена привязка некоторых фоновых служб. Поэтому следует избегать зависимостей
167(или удалить их) в виде объявленных в манифесте получателей неявных широковещательных рассылок
168или фоновых служб.
169</p>
170
171<p>
172  Платформа Android предоставляет несколько решений, позволяющих отказаться от таких
173неявных широковещательных рассылок или фоновых служб. Например, в API {@link
174  android.app.job.JobScheduler} реализован надежный механизм планирования сетевых операций,
175который запускается при выполнении определенных условий, например при подключении к безлимитной сети. Вы можете даже использовать {@link
176  android.app.job.JobScheduler}, чтобы реагировать на изменения поставщиков контента.
177
178</p>
179
180<p>
181  Дополнительная информация об этом изменении в работе системы и соответствующей
182адаптации приложений содержится в документе <a href="{@docRoot}preview/features/background-optimization.html">Оптимизация фоновых процессов</a>.
183
184</p>
185
186
187<h2 id="perm">Изменения разрешений</h2>
188
189<p>
190  В Android N внесены изменения разрешений, которые могут повлиять на ваше приложение,
191включая разрешения учетных записей пользователей и новое разрешение на запись
192во внешнем хранилище. Ниже приводится краткое описание разрешений, измененных в
193предварительной версии.
194</p>
195
196<ul>
197  <li>{@code GET_ACCOUNTS} (устарело)
198    <p>
199      Разрешение GET_ACCOUNTS теперь считается устаревшим. Система игнорирует это разрешение
200для приложений, разработанных для Android N.
201    </p>
202  </li>
203
204</ul>
205
206
207
208<h2 id="accessibility">Улучшенные специальные возможности</h2>
209
210<p>
211  В Android N внесены изменения, которые должны сделать платформу более удобной для пользователей
212со слабым или нарушенным зрением. Эти изменения в целом
213не требуют исправления кода вашего приложения, однако вам следует проверить их
214и протестировать на своем приложении, чтобы оценить их возможное влияние на интерфейс
215пользователя.
216</p>
217
218
219<h3 id="screen-zoom">Масштабирование экрана</h3>
220
221<p>
222  Android N позволяет пользователям установить параметр <strong>Display size</strong>, который увеличивает или уменьшает
223все элементы на экране, делая таким образом устройство более удобным
224для пользователей со слабым зрением. Пользователи не могут масштабировать экран до ширины менее
225<a href="http://developer.android.com/guide/topics/resources/providing-resources.html">  sw320dp</a> (ширина экрана Nexus 4, обычного телефона среднего размера).
226
227</p>
228
229<div class="cols">
230
231<div class="col-6">
232  <img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" />
233</div>
234<div class="col-6">
235  <img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" />
236</div>
237
238</div> <!-- end cols -->
239<p class="img-caption">
240  <strong>Рис. 3.</strong> На экране справа показан эффект
241увеличения параметра Display size на устройстве под управлением Android N.
242</p>
243
244
245<p>
246  При изменении плотности экрана устройства система уведомляет запущенные приложения следующим способами.
247
248</p>
249
250<ul>
251  <li>Если приложение предназначено для API уровня 23 или ниже, система автоматически завершает
252все его фоновые процессы. Это означает, что если пользователь переходит из такого приложения
253на экран <em>Settings</em> и изменяет параметр
254<strong>Display size</strong>, то система завершает работу приложения таким же образом,
255как в случае нехватки памяти. Если у приложения имеются процессы, работающие в активном режиме,
256система уведомляет эти процессы об изменении конфигурации согласно описанию в документе
257<a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений
258в режиме выполнения</a>, как в случае изменения ориентации устройства.
259  </li>
260
261  <li>Если приложение разработано для Android N, все его процессы
262(активные и фоновые) уведомляются об изменении конфигурации, как это описано в документе
263<a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений в режиме выполнения</a>.
264
265  </li>
266</ul>
267
268<p>
269  Большинству приложений не требуются какие-либо изменения для поддержки этой возможности при условии,
270что эти приложения соответствуют рекомендациям по разработке для Android. Необходимо проверить следующие моменты.
271</p>
272
273<ul>
274  <li>Протестируйте свое приложение на устройстве с шириной экрана <code><a href=
275  "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
276и убедитесь в его корректной работе.
277  </li>
278
279  <li>При изменении конфигурации устройства обновите в кэше все данные, зависящие от плотности экрана,
280такие как кэшированные растровые изображения или ресурсы, загруженные из сети.
281Проверьте изменения конфигурации, когда приложение возобновляет свою работу после паузы.
282
283    <p class="note">
284      <strong>Примечание.</strong> Если вы кэшируете данные, зависящие от конфигурации, рекомендуется
285добавить к ним релевантные метаданные, описывающие, например, подходящий размер экрана
286или плотность пикселей для этих данных. Эти метаданные помогут решить,
287нужно ли обновлять кэшированные данные после изменения конфигурации.
288
289    </p>
290  </li>
291
292  <li>Избегайте указания абсолютных размеров в пикселях, поскольку они не масштабируются вместе с изменением плотности экрана.
293Вместо этого указывайте размеры в <a href="{@docRoot}guide/practices/screens_support.html">независимых от плотности пикселях</a> (<code>dp</code>).
294
295  </li>
296</ul>
297
298<h3 id="vision-settings">Vision Settings в мастере настройки</h3>
299
300<p>
301  В Android N появились настройки Vision Settings на экране приветствия, где пользователи могут установить
302следующие параметры специальных возможностей на новом устройстве:
303<strong>Magnification gesture</strong>, <strong>Font size</strong>,
304<strong>Display size</strong> и <strong>TalkBack</strong>. В результате этого изменения
305становятся более заметными ошибки, связанные с различными настройками экрана. Чтобы
306оценить влияние этой функции, следует протестировать свое приложение, включив эти настройки
307на экране <strong>Settings &gt;
308Accessibility</strong>.
309</p>
310
311<h2 id="ndk">Связь приложений NDK с библиотеками платформы</h2>
312
313<p>
314  В Android N внесены изменения пространства имен, предотвращающие загрузку закрытых API-интерфейсов.
315Если вы используете NDK, то вы должны использовать только открытые API-интерфейсы платформы Android.
316Использование закрытых API в следующем официальном выпуске Android
317может привести к ошибке и завершению работы приложения.
318</p>
319
320<p>
321  Чтобы предупредить вас об использовании закрытых API, приложения, запущенные на устройстве с Android N,
322создают сообщение об ошибке в журнале устройства (logcat) при вызове закрытого API.
323Эта ошибка также отображается на экране устройства в виде сообщения, информирующего о ситуации.
324Вам следует проверить код приложения, отказаться от применения
325закрытых API и тщательно протестировать приложение на
326тестовом устройстве или эмуляторе.
327</p>
328
329<p>
330  Если ваше приложение зависит от библиотек платформы, ознакомьтесь в документации NDK
331со стандартными способами замены общих закрытых API их открытыми эквивалентами.
332Вы можете ссылаться на библиотеки платформы, не замечая этого,
333особенно если ваше приложение использует библиотеку, которая является частью платформы (например,
334<code>libpng</code>), но не входит в состав NDK. В этом случае убедитесь, что ваш
335пакет APK содержит все файлы .so, на которые вы намеревались ссылаться.
336</p>
337
338<p class="caution">
339  <strong>Внимание!</strong> Некоторые сторонние библиотеки могут ссылаться на закрытые
340API. Приложение, использующее такие библиотеки, может завершиться с ошибкой при запуске в следующем
341официальном выпуске Android.
342</p>
343
344<p>
345  Приложения не должны зависеть от библиотек платформы (или использовать их), которые не входят в состав
346NDK, поскольку эти библиотеки могут изменяться или отсутствовать в разных выпусках Android.
347Примером такого изменения может служить переход от OpenSSL к BoringSSL.
348Разные устройства также могут обладать разными уровнями совместимости, поскольку
349для библиотек платформы, не включенных в
350NDK, отсутствуют требования к совместимости. Если вам необходимо обратиться к библиотекам не из состава NDK на более старых устройствах, эту загрузку следует
351сделать зависимой от уровня Android API.
352</p>
353
354<p>
355  Для помощи в диагностике проблем подобного рода ниже приведены несколько примеров ошибок Java и NDK,
356с которым вы можете столкнуться при создании приложения для Android N.
357</p>
358
359<p>Пример ошибки Java:</p>
360<pre class="no-pretty-print">
361java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"
362    is not accessible for the namespace "classloader-namespace"
363</pre>
364
365<p>Пример ошибки NDK:</p>
366<pre class="no-pretty-print">
367dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
368</pre>
369
370
371<p>
372  Ниже приведены некоторые стандартные способы устранения подобных ошибок в приложениях.
373</p>
374
375<ul>
376  <li>Использование getJavaVM и getJNIEnv из libandroid_runtime.so может быть заменено
377стандартными функциями JNI:
378<pre class="no-pretty-print">
379AndroidRuntime::getJavaVM -&gt; GetJavaVM from &lt;jni.h&gt;
380AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
381JavaVM::AttachCurrentThread from &lt;jni.h&gt;.
382</pre>
383  </li>
384
385  <li>Использование символа {@code property_get} из {@code libcutils.so} может быть
386заменено открытой альтернативой {@code __system_property_get}.
387Для этого используйте {@code __system_property_get} со следующим включением include:
388<pre>
389#include &lt;sys/system_properties.h&gt;
390</pre>
391  </li>
392
393  <li>Использование символа {@code SSL_ctrl} из {@code libcrypto.so} должно быть заменено локальной версией.
394Например, вы должны статически связать
395{@code libcyrpto.a} в своем файле {@code .so} или динамически включить в свое приложение собственную библиотеку
396{@code libcrypto.so} из BoringSSL или OpenSSL.
397  </li>
398</ul>
399
400<h2 id="afw">Android for Work</h2>
401<p>
402  Android N содержит изменения для приложений, предназначенных для Android for Work, включая изменения установки сертификата,
403сброса пароля, управления вторичным пользователем,
404и доступа к идентификаторам устройства. Если вы создаете приложение для среды
405Android for Work, вам следует ознакомиться с этими изменениями и откорректировать
406приложение соответствующим образом.
407</p>
408
409<ul>
410  <li>Вы должны установить делегированный установщик сертификатов, прежде чем DPC сможет его настроить.
411 Для приложений владельца профиля и устройства, разработанных под N SDK, необходимо установить
412 делегированный установщик сертификатов, прежде чем контроллер политик устройства
413(DPC) вызовет метод
414<code>DevicePolicyManager.setCertInstallerPackage()</code>. В случае отсутствия установщика
415система выдаст ошибку
416<code>IllegalArgumentException</code>.
417  </li>
418
419  <li>Ограничения сброса пароля для администраторов устройства теперь применяются для владельцев
420профиля. Администраторы устройства более не могут использовать
421<code>DevicePolicyManager.resetPassword()</code> для сброса или изменения
422установленных паролей. Администраторы по-прежнему могут установить пароль, но только тогда, когда для устройства не установлен
423пароль, PIN-код или графический шаблон.
424  </li>
425
426  <li>Владельцы устройства и профиля могут управлять учетными записями даже при наличии ограничений.
427Они могут вызывать API-интерфейсы управления учетными записями
428даже при установленных ограничениях пользователя <code>DISALLOW_MODIFY_ACCOUNTS</code>.
429  </li>
430
431  <li>Владельцам устройства стало проще управлять дополнительными пользователями. Когда устройство
432находится в режиме владельца устройства, автоматически включается ограничение <code>DISALLOW_ADD_USER</code>.
433Это предотвращает создание неуправляемых дополнительных пользователей.
434Кроме того, прекращено использование методов <code>CreateUser()</code> и
435<code>createAndInitial()</code>, которые заменены новым методом
436<code>DevicePolicyManager.createAndManageUser()</code>.
437  </li>
438
439  <li>Владельцы устройства получили доступ к идентификаторам устройства. Владелец устройства может получить MAC-адрес
440Wi-Fi для устройства, используя метод
441<code>DevicePolicyManagewr.getWifiMacAddress()</code>. Если интерфейс Wi-Fi никогда не включался
442на устройстве, этот метод возвращает значение {@code null}.
443  </li>
444</ul>
445
446<p>
447  Дополнительная информация об изменениях Android for Work в Android N содержится в документе
448<a href="{@docRoot}preview/features/afw.html">Обновления Android for Work</a>.
449</p>
450
451<h2 id="other">Другие важные моменты</h2>
452
453<ul>
454<li>Процесс приложения, запущенного под Android N, но разработанного для API более низкого уровня,
455завершается, если пользователь изменяет размер экрана. Приложение
456должно корректно обработать такой сценарий. В противном случае оно завершится с ошибкой, если пользователь
457запустит его с экрана последних задач.
458
459<p>
460Вы должны протестировать свое приложение и убедиться,
461что оно не будет работать подобным образом.
462Для этого можно вызвать аналогичную ошибку,
463принудительно завершив процесс приложения через DDMS.
464</p>
465
466<p>
467Приложения для N и последующих версий Android не завершаются автоматически при изменении плотности экрана,
468однако они могут плохо реагировать на изменения конфигурации.
469</p>
470</li>
471
472<li>
473Приложения для Android N должны уметь корректно обрабатывать изменения конфигурации
474и не должны завершаться с ошибкой при последующих запусках. Вы можете проверить поведение приложения,
475изменив размер шрифта (<strong>Setting</strong> &gt;
476<strong>Display</strong> &gt; <strong>Font size</strong>) и перезапустив затем приложение
477с экрана последних задач.
478</li>
479</ul>
480
481