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 > 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 -> GetJavaVM from <jni.h> 380AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or 381JavaVM::AttachCurrentThread from <jni.h>. 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 <sys/system_properties.h> 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> > 476<strong>Display</strong> > <strong>Font size</strong>) и перезапустив затем приложение 477с экрана последних задач. 478</li> 479</ul> 480 481