page.title=Изменения в работе page.keywords=предварительная версия,пакет sdk,совместимость sdk.platform.apiLevel=MNC @jd:body
Наряду с новыми функциями и возможностями, версия M Developer Preview также включает в себя ряд системных изменений и изменений в работе API-интерфейсов. В этом документе рассматриваются определенные ключевые изменения, о которых следует знать, чтобы учитывать их при разработке приложений.
Если вы ранее публиковали приложения для Android, то примите во внимание, что эти изменения в платформе могут повлиять на работу ваших уже опубликованных приложений.
В M Preview представлена новая модель разрешений: теперь пользователи могут управлять разрешениями приложений напрямую во время работы с ними. Такая модель обеспечивает улучшенное управление разрешениями и одновременно позволяет оптимизировать установку и автоматическое обновление для разработчиков. Пользователи могут предоставлять разрешения или отзывать их отдельно для каждого установленного приложения.
В ваших приложениях, предназначенных для M Preview, следует в обязательном порядке проверить такие разрешения и при необходимости запросить их. Чтобы определить, было ли вашему приложению предоставлено разрешение, вызовите новый метод {@code Context.checkSelfPermission()}. Чтобы запросить разрешение, вызовите новый метод {@code Activity.requestPermission()}. Даже если ваше приложение не предназначено для использования в версии M, вам все равно следует протестировать его с использованием новой модели разрешений.
Подробные сведения о поддержке новой модели разрешений вашим приложением представлены в статье Разрешения. Как можно проверить влияние новой модели на ваше приложение, читайте в руководстве по тестированию
В M Preview реализован ряд новых функций оптимизации экономии энергии для неактивных устройств и приложений.
Если устройство отключено от сети и остается неактивным (и с выключенным экраном) в течение определенного времени, оно переходит в режим Doze и старается, чтобы система не выходила из спящего состояния. В этому режиме устройство периодически возобновляет свою обычную работу на краткие промежутки времени, чтобы произвести синхронизацию и позволить системе выполнить какие-либо отложенные операции.
Когда устройство находится в режиме «Doze», к приложениям применяются следующие ограничения:
После выхода из режима «Doze», устройство приступает к выполнению любых отложенных заданий и операций синхронизации.
Чтобы протестировать эту функцию, подключите устройство под управлением M Preview к своему компьютеру для разработки и выполните следующие команды:
$ adb shell dumpsys battery unplug $ adb shell dumpsys deviceidle step $ adb shell dumpsys deviceidle -h
Примечание. В предстоящем выпуске службы Google Cloud Messaging реализована возможность назначения сообщений с высоким приоритетом. При получении вашим приложением сообщений GCM с высоким приоритетом ему на короткое время предоставляется доступ к сети, даже если устройство находится в режиме «Doze».
Советы по тестированию работы приложений в режиме «Doze» представлены в руководстве по тестированию.
В M Preview система может определять, что приложения неактивны, когда они не используются. Приложение считается неактивным по прошествии определенного периода времени до тех пор, пока система не обнаружит один из следующих сигналов:
Если устройство отключено от электросети, для приложений, которые считаются неактивными, закрывается доступ к Интернету, а их операции синхронизации и задания приостанавливаются. После подключения устройства к электросети доступ к Интернету для приложений возобновится и они смогут приступить к выполнению любых ожидающих заданий и операций синхронизации. Если устройство неактивно в течение длительного времени, неактивным приложениям раз в день предоставляется доступ к сети.
Чтобы протестировать эту функцию, подключите устройство под управлением M Preview к своему компьютеру для разработки и выполните следующие команды:
$ adb shell dumpsys battery unplug $ adb shell am set-idle <packageName> true $ adb shell am set-idle <packageName> false $ adb shell am get-idle <packageName>
Примечание. В предстоящем выпуске службы Google Cloud Messaging (GCM) реализована возможность назначения сообщений с высоким приоритетом. При получении вашим приложением сообщений GCM с высоким приоритетом ему на короткий промежуток времени предоставляется доступ к сети, даже если приложение находится в неактивном состоянии.
Советы по тестированию работы приложений в ждущем режиме представлены в руководстве по тестированию.
В M Preview пользователи могут подключать внешние устройства хранения, такие как SD-карты, и использовать их как внутреннее хранилище, зашифровав и отформатировав требуемым образом. Благодаря этому пользователи могут переносить как сами приложения, так свои файлы для этих приложений с одного устройства хранения на другое. При переносе приложений система руководствуется настройкой {@code android:installLocation} в манифесте.
Если ваше приложение работает с указанными ниже API-интерфейсами или полями, следует помнить, что возвращаемые ими пути к файлам будут динамически изменяться при перемещении приложения с внутреннего хранилища на внешнее устройство или наоборот. При создании путей к файлам настоятельно рекомендуется всегда вызывать эти API-интерфейсы динамическим образом. Не используйте жестко запрограммированные пути к файлам и не указывайте созданные ранее полные пути к файлам.
Для отладки этой функции в Developer Preview подключите USB-устройство, к устройству Android посредством USB-кабеля On-The-Go (OTG) и выполните следующую команду:
$ adb shell sm set-force-adoptable true
В M Preview удалена поддержка HTTP-клиента Apache. Если ваше приложение, разработанное для Android 2.3 (уровень API 9) или более поздней версии, использует этот клиент, вам необходимо воспользоваться вместо него классом {@link java.net.HttpURLConnection}. Этот API-интерфейс более эффективный, поскольку он сокращает использование сетевого трафика за счет прозрачного сжатия и кэширования ответов, а также сводит к минимуму потребление энергии. Чтобы продолжить использовать API-интерфейсы HTTP Apache, сначала объявите в своем файле {@code build.gradle} следующую зависимость compile-time:
android { useLibrary 'org.apache.http.legacy' }
Вместо OpenSSL в Android теперь будет использоваться библиотека BoringSSL . Если вы используете в ваших приложениях Android NDK, не связывайте его с криптографическими библиотеками, которые не входят в состав API-интерфейса NDK, такими как {@code libcrypto.so} и {@code libssl.so}. Эти библиотеки не являются общедоступными API-интерфейсами, и в разных выпусках или на разных устройствах они могут быть изменены или разбиты без предварительного уведомления. Кроме того, этим вы можете создать уязвимости в системе безопасности вашего продукта. Вместо этого внесите изменения в собственный код для вызова криптографических API-интерфейсов Java посредством JNI или статической ссылки на библиотеку криптографии по своему выбору.
Теперь в платформе не поддерживается настройка уровня громкости напрямую или отключение звука определенных потоков с помощью класса {@link android.media.AudioManager}. Метод {@link android.media.AudioManager#setStreamSolo(int,boolean) setStreamSolo()} больше не используется. Вместо него следует вызывать метод {@code AudioManager.requestAudioFocus()}. Также больше не используется метод {@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()}; вместо него следует вызывать метод {@code AudioManager.adjustStreamVolume()} и передавать в него значение направления {@code ADJUST_MUTE} или {@code ADJUST_UNMUTE}.
Теперь, когда пользователь выделяет текст в приложении, такие дополнительные действия как Вырезать, Копировать и Вставить, можно отображать на перемещаемой панели инструментов. Реализация взаимодействия пользователя с текстом аналогична той, которая используется для контекстного меню, как описано в статье Запуск контекстного меню для отдельных представлений.
Чтобы реализовать перемещаемую панель инструментов для выделения текста, внесите в ваши существующие приложения следующие изменения.
Если вы используете вспомогательную библиотеку Android версии 22.2, то помните, что перемещаемым панелям инструментов не свойственна обратная совместимость и по умолчанию для управления объектами {@link android.view.ActionMode} используется библиотека appcompat. Это означает, что перемещаемые панели инструментов не будут отображаться. Чтобы включить поддержку {@link android.view.ActionMode} в {@link android.support.v7.app.AppCompatActivity}, вызовите метод {@code android.support.v7.app.AppCompatActivity.getDelegate()}, затем вызовите {@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()} для возвращенного объекта {@link android.support.v7.app.AppCompatDelegate} и задайте для параметра input значение {@code false}. Этот вызов возвращает управление объектами {@link android.view.ActionMode} платформе. На устройствах под управлением M Preview платформа поддерживает как режимы {@link android.support.v7.app.ActionBar}, так и режимы перемещаемых панелей инструментов, тогда как на устройствах под управлением более ранних версий поддерживаются только режимы {@link android.support.v7.app.ActionBar}.
В M Preview поставщик хранилища ключей Android больше не поддерживает DSA. ECDSA по-прежнему поддерживается.
Ключи, для которых не требуется шифрование в хранилище, больше не будут удаляться при отключении или сбросе защищенного экрана блокировки (например, пользователем или администратором устройства). Ключи, для которых требуется шифрование в хранилище, во время таких событий будут удалены.
Ниже перечислены изменения в API-интерфейсах для работы с Wi-Fi и сетями, реализованные в M Preview.
В M Preview изменена модель получения доступа к ресурсам в службе камеры. Если раньше запросы доступа обрабатывались в порядке поступления, то теперь процессы с высоким приоритетом имеют преимущество. В работе службы камеры произошли следующие изменения:
Среда выполнения ART теперь должным образом реализует правила доступа для метода {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()}. Это изменение позволило устранить проблему, связанную с тем, что в предыдущих версиях система Dalvik неправильно проверяла правила доступа. Если ваше приложение использует метод {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} и вы хотите переопределить проверки доступа, вызовите метод {@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()}, присвоив параметру input значение {@code true}. Если ваше приложение использует библиотеку appcompat v7 или библиотеку recyclerview v7, вам необходимо установить актуальные версии этих библиотек. В противном случае убедитесь в том, что любые настраиваемые классы, на которые имеются ссылки из XML, обновлены и их конструкторы классов доступны.
В M Preview обновлено поведение динамического компоновщика. Теперь он распознает разницу между {@code soname} библиотеки и путем к ней (ошибка 6670, о которой сообщалось в открытых источниках), и позволяет выполнять поиск по {@code soname}. Приложения, которые ранее работали, но содержали неправильные записи {@code DT_NEEDED} (обычно абсолютные пути в файловой системе компьютера для сборки), теперь при загрузке могут выдавать ошибки.
В M Preview правильно реализован флаг {@code dlopen(3) RTLD_LOCAL}. Обратите внимание, что {@code RTLD_LOCAL} используется по умолчанию, поэтому будут затронуты вызовы {@code dlopen(3)}, которые явно не используют {@code RTLD_LOCAL} (за исключением случаев, когда ваше приложение явным образом использует{@code RTLD_GLOBAL}). Поскольку используется {@code RTLD_LOCAL}, символы не будут доступны для библиотек, загруженных с использованием последующих вызовов {@code dlopen(3)} (в противоположность ссылкам из записей {@code DT_NEEDED}).
Теперь платформа более строго подходит к проверке пакетов APK. Пакет APK считается поврежденным, если файл объявлен в манифесте, но отсутствует в самом пакете APK. Пакет APK подлежит повторной подписи в случае удаления любого его содержимого.
В M Preview представлены следующие изменения работы Android for Work: