blob: a04866073c5590187dc07080008ba969f17c9f40 [file] [log] [blame]
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 &gt;
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 -&gt; GetJavaVM from &lt;jni.h&gt;
AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
JavaVM::AttachCurrentThread from &lt;jni.h&gt;.
</pre>
</li>
<li>Использование символа {@code property_get} из {@code libcutils.so} может быть
заменено открытой альтернативой {@code __system_property_get}.
Для этого используйте {@code __system_property_get} со следующим включением include:
<pre>
#include &lt;sys/system_properties.h&gt;
</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> &gt;
<strong>Display</strong> &gt; <strong>Font size</strong>) и перезапустив затем приложение
с экрана последних задач.
</li>
</ul>