| page.title=Изменения в работе |
| page.keywords=preview,sdk,compatibility |
| meta.tags="предварительная версия", "совместимость" |
| page.tags="preview", "developer preview" |
| page.image=images/cards/card-n-changes_2x.png |
| @jd:body |
| |
| |
| <div id="qv-wrapper"> |
| <div id="qv"> |
| |
| <h2>Содержание документа</h2> |
| |
| <ol> |
| <li><a href="#perf">Повышение производительности</a> |
| <ol> |
| <li><a href="#doze">Режим Doze</a></li> |
| <li><a href="#bg-opt">Оптимизация фоновых процессов</a></li> |
| </ol> |
| </li> |
| <li><a href="#perm">Изменения разрешений</a></li> |
| <li><a href="#accessibility">Улучшенные специальные возможности</a> |
| <ol> |
| <li><a href="#screen-zoom">Масштабирование экрана</a></li> |
| <li><a href="#vision-settings">Vision Settings в мастере настройки</a></li> |
| </ol> |
| </li> |
| <li><a href="#ndk">Связь приложений NDK с библиотеками платформы</a></li> |
| <li><a href="#afw">Android for Work</a></li> |
| </ol> |
| |
| <h2>Дополнительно</h2> |
| <ol> |
| <li><a href="{@docRoot}preview/api-overview.html">Обзор API-интерфейсов Android N</a> |
| </li> |
| </ol> |
| |
| </div> |
| </div> |
| |
| |
| <p> |
| Наряду с новыми функциями и возможностями в Android N появились различные изменения |
| работы системы и API. В этом документе рассматриваются некоторые наиболее важные |
| изменения, которые следует понимать и учитывать при разработке приложений. |
| |
| </p> |
| |
| <p> |
| Если вы ранее публиковали приложения для Android, то примите во внимание, |
| что эти изменения в платформе могут повлиять на работу ваших уже опубликованных приложений. |
| </p> |
| |
| |
| <h2 id="perf">Повышение производительности</h2> |
| |
| <p> |
| Изменения в работе системы Android N нацелены на более экономное использование заряда аккумулятора |
| и оперативной памяти, а также на повышение производительности приложений. Эти изменения могут повлиять |
| на системные уведомления и доступность системных ресурсов для вашего приложения. Вам следует |
| ознакомиться с этими изменениями и оценить, какие исправления могут понадобиться вашему приложению для соответствия этим изменениям. |
| |
| </p> |
| |
| <h3 id="doze">Режим Doze</h3> |
| |
| <p> |
| Появившийся в Android 6.0 (уровень API 23), режим Doze экономит заряд аккумулятора, |
| откладывая процессорные и сетевые операции, когда устройство находится не на зарядке, |
| оно неподвижно, и его экран погашен. Android N расширяет возможности |
| режима Doze, применяя частичный набор процессорных и сетевых ограничений |
| в тех случаях, когда устройство находится не на зарядке, с погашенным экраном, но не обязательно неподвижно, |
| например, когда оно находится в кармане пользователя. |
| </p> |
| |
| |
| <img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" /> |
| <p class="img-caption"> |
| <strong>Рис. 1.</strong> Иллюстрация применения первого уровня ограничений активности системы в режиме Doze |
| для экономии заряда аккумулятора. |
| </p> |
| |
| <p> |
| Когда устройство питается от аккумулятора и его экран отключен в течение некоторого промежутка времени, |
| устройство переходит в режим Doze и применяет первый частичный набор ограничений: закрывается доступ приложений |
| к сети, откладывается выполнение заданий и синхронизации. Если устройство |
| остается неподвижным в течение определенного времени после перехода в режим Doze, система применяет |
| остальные ограничения Doze для {@link android.os.PowerManager.WakeLock}, |
| оповещений {@link android.app.AlarmManager}, сканирования GPS и Wi-Fi. Независимо от того, были применены |
| все или только некоторые ограничения режима Doze, устройство периодически пробуждается на короткий промежуток времени, |
| в течение которого приложениям разрешается сетевой доступ |
| и выполнение отложенных заданий или синхронизации. |
| </p> |
| |
| |
| <img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" /> |
| <p class="img-caption"> |
| <strong>Рис. 2.</strong> Иллюстрация применения второго уровня ограничений активности системы в режиме Doze |
| после того, как устройство неподвижно в течение определенного времени. |
| </p> |
| |
| <p> |
| Следует отметить, что включение экрана или подключение к источнику питания приводит |
| к выходу устройства из режима Doze и |
| снимает эти ограничения обработки. Эти дополнительные особенности поведения |
| не влияют на советы и рекомендации по адаптации приложений к предыдущей |
| версии режима Doze из Android 6.0 (уровень API 23), которые были рассмотрены в документе |
| <a href="{@docRoot}training/monitoring-device-state/doze-standby.html">Оптимизация для режима Doze и режима ожидания для приложений</a>. |
| Вы должны следовать этим рекомендациям (например, использовать Google Cloud Messaging (GCM) |
| для отправки и получения сообщений) и приступить к планированию обновлений для соответствия дополнительному поведению режима |
| Doze. |
| </p> |
| |
| |
| <h3 id="bg-opt">Проект Svelte: оптимизация фоновых процессов</h3> |
| |
| <p> |
| В Android N удалены три неявных широковещательной рассылки с целью оптимизации |
| потребления памяти и энергии. Причиной этого изменения стало то, что неявные |
| широковещательные рассылки часто запускали приложения, которые прослушивали их в |
| фоновом режиме. Удаление этих рассылок может существенно улучшить производительность устройства |
| и работу интерфейса пользователя. |
| </p> |
| |
| <p> |
| На мобильных устройствах часто могут происходить изменения подключения, например, при переключении |
| между Wi-Fi и мобильным трафиком. Сейчас приложения могут следить за изменениями |
| подключения, зарегистрировавшись в качестве получателя для неявных широковещательных рассылок {@link |
| android.net.ConnectivityManager#CONNECTIVITY_ACTION} в своем манифесте. |
| Поскольку для получения этих рассылок регистрируются многие приложения, каждое |
| переключение сети может вызвать их активацию и одновременную обработку рассылки. |
| |
| </p> |
| |
| <p> |
| Подобным образом приложения могут регистрироваться для получения неявных широковещательных рассылок {@link |
| android.hardware.Camera#ACTION_NEW_PICTURE} и {@link |
| android.hardware.Camera#ACTION_NEW_VIDEO} от других приложений, например от камеры. |
| Когда пользователь делает снимок с помощью приложения камеры, эти приложения активируются |
| для обработки широковещательной рассылки. |
| </p> |
| |
| <p> |
| Для устранения этих проблем Android N применяет следующие |
| способы оптимизации. |
| </p> |
| |
| <ul> |
| <li>Приложения для Android N не получают широковещательные рассылки {@link |
| android.net.ConnectivityManager#CONNECTIVITY_ACTION}, даже если в их манифесте |
| указаны требования получения уведомлений об этих событиях. Приложения в активном режиме |
| могут следить за событиями {@code CONNECTIVITY_CHANGE} в своем |
| основном потоке, если они запрашивают уведомление через {@link |
| android.content.BroadcastReceiver}. |
| </li> |
| |
| <li>Приложения не могут отправлять или получать широковещательные рассылки {@link |
| android.hardware.Camera#ACTION_NEW_PICTURE} и {@link |
| android.hardware.Camera#ACTION_NEW_VIDEO}. Эта оптимизация влияет на все приложения, включая те, которые не предназначены для Android N. |
| |
| </li> |
| </ul> |
| |
| <p> |
| В будущих выпусках Android могут быть отменены другие неявные широковещательные рассылки, |
| а также отменена привязка некоторых фоновых служб. Поэтому следует избегать зависимостей |
| (или удалить их) в виде объявленных в манифесте получателей неявных широковещательных рассылок |
| или фоновых служб. |
| </p> |
| |
| <p> |
| Платформа Android предоставляет несколько решений, позволяющих отказаться от таких |
| неявных широковещательных рассылок или фоновых служб. Например, в API {@link |
| android.app.job.JobScheduler} реализован надежный механизм планирования сетевых операций, |
| который запускается при выполнении определенных условий, например при подключении к безлимитной сети. Вы можете даже использовать {@link |
| android.app.job.JobScheduler}, чтобы реагировать на изменения поставщиков контента. |
| |
| </p> |
| |
| <p> |
| Дополнительная информация об этом изменении в работе системы и соответствующей |
| адаптации приложений содержится в документе <a href="{@docRoot}preview/features/background-optimization.html">Оптимизация фоновых процессов</a>. |
| |
| </p> |
| |
| |
| <h2 id="perm">Изменения разрешений</h2> |
| |
| <p> |
| В Android N внесены изменения разрешений, которые могут повлиять на ваше приложение, |
| включая разрешения учетных записей пользователей и новое разрешение на запись |
| во внешнем хранилище. Ниже приводится краткое описание разрешений, измененных в |
| предварительной версии. |
| </p> |
| |
| <ul> |
| <li>{@code GET_ACCOUNTS} (устарело) |
| <p> |
| Разрешение GET_ACCOUNTS теперь считается устаревшим. Система игнорирует это разрешение |
| для приложений, разработанных для Android N. |
| </p> |
| </li> |
| |
| </ul> |
| |
| |
| |
| <h2 id="accessibility">Улучшенные специальные возможности</h2> |
| |
| <p> |
| В Android N внесены изменения, которые должны сделать платформу более удобной для пользователей |
| со слабым или нарушенным зрением. Эти изменения в целом |
| не требуют исправления кода вашего приложения, однако вам следует проверить их |
| и протестировать на своем приложении, чтобы оценить их возможное влияние на интерфейс |
| пользователя. |
| </p> |
| |
| |
| <h3 id="screen-zoom">Масштабирование экрана</h3> |
| |
| <p> |
| Android N позволяет пользователям установить параметр <strong>Display size</strong>, который увеличивает или уменьшает |
| все элементы на экране, делая таким образом устройство более удобным |
| для пользователей со слабым зрением. Пользователи не могут масштабировать экран до ширины менее |
| <a href="http://developer.android.com/guide/topics/resources/providing-resources.html"> sw320dp</a> (ширина экрана Nexus 4, обычного телефона среднего размера). |
| |
| </p> |
| |
| <div class="cols"> |
| |
| <div class="col-6"> |
| <img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" /> |
| </div> |
| <div class="col-6"> |
| <img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" /> |
| </div> |
| |
| </div> <!-- end cols --> |
| <p class="img-caption"> |
| <strong>Рис. 3.</strong> На экране справа показан эффект |
| увеличения параметра Display size на устройстве под управлением Android N. |
| </p> |
| |
| |
| <p> |
| При изменении плотности экрана устройства система уведомляет запущенные приложения следующим способами. |
| |
| </p> |
| |
| <ul> |
| <li>Если приложение предназначено для API уровня 23 или ниже, система автоматически завершает |
| все его фоновые процессы. Это означает, что если пользователь переходит из такого приложения |
| на экран <em>Settings</em> и изменяет параметр |
| <strong>Display size</strong>, то система завершает работу приложения таким же образом, |
| как в случае нехватки памяти. Если у приложения имеются процессы, работающие в активном режиме, |
| система уведомляет эти процессы об изменении конфигурации согласно описанию в документе |
| <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений |
| в режиме выполнения</a>, как в случае изменения ориентации устройства. |
| </li> |
| |
| <li>Если приложение разработано для Android N, все его процессы |
| (активные и фоновые) уведомляются об изменении конфигурации, как это описано в документе |
| <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений в режиме выполнения</a>. |
| |
| </li> |
| </ul> |
| |
| <p> |
| Большинству приложений не требуются какие-либо изменения для поддержки этой возможности при условии, |
| что эти приложения соответствуют рекомендациям по разработке для Android. Необходимо проверить следующие моменты. |
| </p> |
| |
| <ul> |
| <li>Протестируйте свое приложение на устройстве с шириной экрана <code><a href= |
| "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code> |
| и убедитесь в его корректной работе. |
| </li> |
| |
| <li>При изменении конфигурации устройства обновите в кэше все данные, зависящие от плотности экрана, |
| такие как кэшированные растровые изображения или ресурсы, загруженные из сети. |
| Проверьте изменения конфигурации, когда приложение возобновляет свою работу после паузы. |
| |
| <p class="note"> |
| <strong>Примечание.</strong> Если вы кэшируете данные, зависящие от конфигурации, рекомендуется |
| добавить к ним релевантные метаданные, описывающие, например, подходящий размер экрана |
| или плотность пикселей для этих данных. Эти метаданные помогут решить, |
| нужно ли обновлять кэшированные данные после изменения конфигурации. |
| |
| </p> |
| </li> |
| |
| <li>Избегайте указания абсолютных размеров в пикселях, поскольку они не масштабируются вместе с изменением плотности экрана. |
| Вместо этого указывайте размеры в <a href="{@docRoot}guide/practices/screens_support.html">независимых от плотности пикселях</a> (<code>dp</code>). |
| |
| </li> |
| </ul> |
| |
| <h3 id="vision-settings">Vision Settings в мастере настройки</h3> |
| |
| <p> |
| В Android N появились настройки Vision Settings на экране приветствия, где пользователи могут установить |
| следующие параметры специальных возможностей на новом устройстве: |
| <strong>Magnification gesture</strong>, <strong>Font size</strong>, |
| <strong>Display size</strong> и <strong>TalkBack</strong>. В результате этого изменения |
| становятся более заметными ошибки, связанные с различными настройками экрана. Чтобы |
| оценить влияние этой функции, следует протестировать свое приложение, включив эти настройки |
| на экране <strong>Settings > |
| Accessibility</strong>. |
| </p> |
| |
| <h2 id="ndk">Связь приложений NDK с библиотеками платформы</h2> |
| |
| <p> |
| В Android N внесены изменения пространства имен, предотвращающие загрузку закрытых API-интерфейсов. |
| Если вы используете NDK, то вы должны использовать только открытые API-интерфейсы платформы Android. |
| Использование закрытых API в следующем официальном выпуске Android |
| может привести к ошибке и завершению работы приложения. |
| </p> |
| |
| <p> |
| Чтобы предупредить вас об использовании закрытых API, приложения, запущенные на устройстве с Android N, |
| создают сообщение об ошибке в журнале устройства (logcat) при вызове закрытого API. |
| Эта ошибка также отображается на экране устройства в виде сообщения, информирующего о ситуации. |
| Вам следует проверить код приложения, отказаться от применения |
| закрытых API и тщательно протестировать приложение на |
| тестовом устройстве или эмуляторе. |
| </p> |
| |
| <p> |
| Если ваше приложение зависит от библиотек платформы, ознакомьтесь в документации NDK |
| со стандартными способами замены общих закрытых API их открытыми эквивалентами. |
| Вы можете ссылаться на библиотеки платформы, не замечая этого, |
| особенно если ваше приложение использует библиотеку, которая является частью платформы (например, |
| <code>libpng</code>), но не входит в состав NDK. В этом случае убедитесь, что ваш |
| пакет APK содержит все файлы .so, на которые вы намеревались ссылаться. |
| </p> |
| |
| <p class="caution"> |
| <strong>Внимание!</strong> Некоторые сторонние библиотеки могут ссылаться на закрытые |
| API. Приложение, использующее такие библиотеки, может завершиться с ошибкой при запуске в следующем |
| официальном выпуске Android. |
| </p> |
| |
| <p> |
| Приложения не должны зависеть от библиотек платформы (или использовать их), которые не входят в состав |
| NDK, поскольку эти библиотеки могут изменяться или отсутствовать в разных выпусках Android. |
| Примером такого изменения может служить переход от OpenSSL к BoringSSL. |
| Разные устройства также могут обладать разными уровнями совместимости, поскольку |
| для библиотек платформы, не включенных в |
| NDK, отсутствуют требования к совместимости. Если вам необходимо обратиться к библиотекам не из состава NDK на более старых устройствах, эту загрузку следует |
| сделать зависимой от уровня Android API. |
| </p> |
| |
| <p> |
| Для помощи в диагностике проблем подобного рода ниже приведены несколько примеров ошибок Java и NDK, |
| с которым вы можете столкнуться при создании приложения для Android N. |
| </p> |
| |
| <p>Пример ошибки Java:</p> |
| <pre class="no-pretty-print"> |
| java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" |
| is not accessible for the namespace "classloader-namespace" |
| </pre> |
| |
| <p>Пример ошибки NDK:</p> |
| <pre class="no-pretty-print"> |
| dlopen failed: cannot locate symbol "__system_property_get" referenced by ... |
| </pre> |
| |
| |
| <p> |
| Ниже приведены некоторые стандартные способы устранения подобных ошибок в приложениях. |
| </p> |
| |
| <ul> |
| <li>Использование getJavaVM и getJNIEnv из libandroid_runtime.so может быть заменено |
| стандартными функциями JNI: |
| <pre class="no-pretty-print"> |
| AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> |
| AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or |
| JavaVM::AttachCurrentThread from <jni.h>. |
| </pre> |
| </li> |
| |
| <li>Использование символа {@code property_get} из {@code libcutils.so} может быть |
| заменено открытой альтернативой {@code __system_property_get}. |
| Для этого используйте {@code __system_property_get} со следующим включением include: |
| <pre> |
| #include <sys/system_properties.h> |
| </pre> |
| </li> |
| |
| <li>Использование символа {@code SSL_ctrl} из {@code libcrypto.so} должно быть заменено локальной версией. |
| Например, вы должны статически связать |
| {@code libcyrpto.a} в своем файле {@code .so} или динамически включить в свое приложение собственную библиотеку |
| {@code libcrypto.so} из BoringSSL или OpenSSL. |
| </li> |
| </ul> |
| |
| <h2 id="afw">Android for Work</h2> |
| <p> |
| Android N содержит изменения для приложений, предназначенных для Android for Work, включая изменения установки сертификата, |
| сброса пароля, управления вторичным пользователем, |
| и доступа к идентификаторам устройства. Если вы создаете приложение для среды |
| Android for Work, вам следует ознакомиться с этими изменениями и откорректировать |
| приложение соответствующим образом. |
| </p> |
| |
| <ul> |
| <li>Вы должны установить делегированный установщик сертификатов, прежде чем DPC сможет его настроить. |
| Для приложений владельца профиля и устройства, разработанных под N SDK, необходимо установить |
| делегированный установщик сертификатов, прежде чем контроллер политик устройства |
| (DPC) вызовет метод |
| <code>DevicePolicyManager.setCertInstallerPackage()</code>. В случае отсутствия установщика |
| система выдаст ошибку |
| <code>IllegalArgumentException</code>. |
| </li> |
| |
| <li>Ограничения сброса пароля для администраторов устройства теперь применяются для владельцев |
| профиля. Администраторы устройства более не могут использовать |
| <code>DevicePolicyManager.resetPassword()</code> для сброса или изменения |
| установленных паролей. Администраторы по-прежнему могут установить пароль, но только тогда, когда для устройства не установлен |
| пароль, PIN-код или графический шаблон. |
| </li> |
| |
| <li>Владельцы устройства и профиля могут управлять учетными записями даже при наличии ограничений. |
| Они могут вызывать API-интерфейсы управления учетными записями |
| даже при установленных ограничениях пользователя <code>DISALLOW_MODIFY_ACCOUNTS</code>. |
| </li> |
| |
| <li>Владельцам устройства стало проще управлять дополнительными пользователями. Когда устройство |
| находится в режиме владельца устройства, автоматически включается ограничение <code>DISALLOW_ADD_USER</code>. |
| Это предотвращает создание неуправляемых дополнительных пользователей. |
| Кроме того, прекращено использование методов <code>CreateUser()</code> и |
| <code>createAndInitial()</code>, которые заменены новым методом |
| <code>DevicePolicyManager.createAndManageUser()</code>. |
| </li> |
| |
| <li>Владельцы устройства получили доступ к идентификаторам устройства. Владелец устройства может получить MAC-адрес |
| Wi-Fi для устройства, используя метод |
| <code>DevicePolicyManagewr.getWifiMacAddress()</code>. Если интерфейс Wi-Fi никогда не включался |
| на устройстве, этот метод возвращает значение {@code null}. |
| </li> |
| </ul> |
| |
| <p> |
| Дополнительная информация об изменениях Android for Work в Android N содержится в документе |
| <a href="{@docRoot}preview/features/afw.html">Обновления Android for Work</a>. |
| </p> |
| |
| <h2 id="other">Другие важные моменты</h2> |
| |
| <ul> |
| <li>Процесс приложения, запущенного под Android N, но разработанного для API более низкого уровня, |
| завершается, если пользователь изменяет размер экрана. Приложение |
| должно корректно обработать такой сценарий. В противном случае оно завершится с ошибкой, если пользователь |
| запустит его с экрана последних задач. |
| |
| <p> |
| Вы должны протестировать свое приложение и убедиться, |
| что оно не будет работать подобным образом. |
| Для этого можно вызвать аналогичную ошибку, |
| принудительно завершив процесс приложения через DDMS. |
| </p> |
| |
| <p> |
| Приложения для N и последующих версий Android не завершаются автоматически при изменении плотности экрана, |
| однако они могут плохо реагировать на изменения конфигурации. |
| </p> |
| </li> |
| |
| <li> |
| Приложения для Android N должны уметь корректно обрабатывать изменения конфигурации |
| и не должны завершаться с ошибкой при последующих запусках. Вы можете проверить поведение приложения, |
| изменив размер шрифта (<strong>Setting</strong> > |
| <strong>Display</strong> > <strong>Font size</strong>) и перезапустив затем приложение |
| с экрана последних задач. |
| </li> |
| </ul> |
| |