Android 9 (уровень API 28) вносит ряд изменений в систему Android. Следующие изменения поведения применяются исключительно к приложениям, ориентированным на уровень API 28 или выше. Приложения, для которых для targetSdkVersion
задан уровень API 28 или выше, должны изменить свои приложения для правильной поддержки такого поведения, если это применимо к приложению.
Изменения, затрагивающие все приложения, работающие на Android 9, независимо от того, на какой уровень API они нацелены, см. в разделе Изменения поведения: все приложения .
Службы переднего плана
Приложения, предназначенные для Android 9 или более поздней версии и использующие службы переднего плана, должны запрашивать разрешение FOREGROUND_SERVICE
. Это обычное разрешение , поэтому система автоматически предоставляет его запрашивающему приложению.
Если приложение, предназначенное для Android 9 или более поздней версии, пытается создать службу переднего плана без запроса FOREGROUND_SERVICE
, система выдает исключение SecurityException
.
Изменения конфиденциальности
Если ваше приложение предназначено для Android 9, вам следует учитывать следующие изменения в поведении. Эти обновления серийного номера устройства и информации DNS повышают конфиденциальность пользователей.
Устаревание серийного номера сборки
В Android 9 для Build.SERIAL
всегда установлено значение "UNKNOWN"
для защиты конфиденциальности пользователей.
Если вашему приложению требуется доступ к серийному номеру оборудования устройства, вместо этого вам следует запросить разрешение READ_PHONE_STATE
, а затем вызвать getSerial()
.
Конфиденциальность DNS
Приложения, предназначенные для Android 9, должны использовать частные API-интерфейсы DNS. В частности, приложения должны гарантировать, что если системный преобразователь использует DNS-over-TLS, любой встроенный DNS-клиент либо использует зашифрованный DNS для того же имени хоста, что и система, либо отключается в пользу системного преобразователя.
Изменения безопасности платформы
Android 9 включает в себя несколько изменений поведения, которые повышают безопасность вашего приложения, но эти изменения вступают в силу, только если ваше приложение ориентировано на уровень API 28 или выше.
Сетевой TLS включен по умолчанию
Если ваше приложение предназначено для Android 9 или более поздней версии, метод isCleartextTrafficPermitted()
по умолчанию возвращает false
. Если вашему приложению необходимо включить открытый текст для определенных доменов, вы должны явно установить для cleartextTrafficPermitted
значение true
для этих доменов в конфигурации сетевой безопасности вашего приложения.
Каталоги данных в Интернете, разделенные по процессам
Чтобы повысить стабильность приложений и целостность данных в Android 9, приложения не могут совместно использовать один каталог данных WebView
несколькими процессами . Обычно в таких каталогах данных хранятся файлы cookie, HTTP-кэши и другие постоянные и временные хранилища, связанные с просмотром веб-страниц.
В большинстве случаев ваше приложение должно использовать классы из пакета android.webkit
, такие как WebView
и CookieManager
, только в одном процессе. Например, вам следует переместить все объекты Activity
, использующие WebView
в один и тот же процесс. Вы можете более строго обеспечить соблюдение правила «только один процесс», вызвав disableWebView()
в других процессах вашего приложения. Этот вызов предотвращает ошибочную инициализацию WebView
в других процессах, даже если он вызывается из зависимой библиотеки.
Если ваше приложение должно использовать экземпляры WebView
более чем в одном процессе, вы должны назначить уникальный суффикс каталога данных для каждого процесса, используя метод WebView.setDataDirectorySuffix()
, прежде чем использовать данный экземпляр WebView
в этом процессе. Этот метод помещает веб-данные каждого процесса в отдельный каталог внутри каталога данных вашего приложения.
Домены SELinux для каждого приложения
Приложения, предназначенные для Android 9 или более поздней версии, не могут обмениваться данными с другими приложениями, используя общедоступные разрешения Unix. Это изменение улучшает целостность изолированной программной среды приложений Android , в частности требование о том, чтобы личные данные приложения были доступны только этому приложению.
Чтобы обмениваться файлами с другими приложениями, используйте поставщика контента .
Изменения в подключении
Подсчет данных о подключении и многолучевое распространение
В приложениях, предназначенных для Android 9 или более поздних версий, система подсчитывает сетевой трафик в сетях, которые не являются текущими сетями по умолчанию (например, сотовый трафик, когда устройство подключено к Wi-Fi), и предоставляет методы в классе NetworkStatsManager
для запроса этого трафика.
В частности, getMultipathPreference()
теперь возвращает значение на основе вышеупомянутого сетевого трафика. Начиная с Android 9, метод возвращает true
для данных ячейки, но когда за день накапливается более определенного объема трафика, он начинает возвращать false
. Приложения, работающие на Android 9, должны вызывать метод и соблюдать этот намек.
Класс ConnectivityManager.NetworkCallback
теперь отправляет информацию о VPN в приложения. Это изменение значительно упрощает приложениям прослушивание событий подключения без необходимости смешивать синхронные и асинхронные вызовы и использовать ограниченные API. Кроме того, это означает, что передача информации работает должным образом, когда устройство подключено к нескольким сетям Wi-Fi или нескольким сотовым сетям одновременно.
Устаревание HTTP-клиента Apache
В Android 6.0 мы удалили поддержку HTTP-клиента Apache . Начиная с Android 9, эта библиотека удалена из пути к классу загрузки и по умолчанию недоступна для приложений.
Чтобы продолжить использование HTTP-клиента Apache, приложения, предназначенные для Android 9 и более поздних версий, могут добавить в свой AndroidManifest.xml
следующее:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
В качестве альтернативы использованию библиотеки Apache среды выполнения приложения могут включать в свой APK собственную версию библиотеки org.apache.http
. Если вы сделаете это, вам придется переупаковать библиотеку (с помощью такой утилиты, как Jar Jar ), чтобы избежать проблем совместимости классов с классами, предоставляемыми во время выполнения.
Изменения пользовательского интерфейса
Посмотреть фокус
Виды с площадью 0 (ширина или высота равна 0) больше не фокусируются.
Кроме того, действия больше не подразумевают первоначальный фокус в сенсорном режиме. Вместо этого вы можете явно запросить первоначальный фокус, если хотите.
Обработка шестнадцатеричных значений CSS RGBA
Приложения, предназначенные для Android 9 или более поздней версии, должны включить черновой вариант поведения CSS Color Module Level 4 для обработки 4- и 8-разрядных цветов CSS.
Модуль цвета CSS уровня 4 поддерживается Chrome с версии 52, но в настоящее время WebView отключает эту функцию, поскольку было обнаружено, что существующие приложения Android содержат 32-битные шестнадцатеричные цвета в порядке Android (ARGB), что может привести к ошибкам рендеринга.
Например, цвет #80ff8080
в настоящее время отображается в WebView как непрозрачный светло-красный ( #ff8080
) для приложений, ориентированных на уровни API 27 или ниже. Ведущий компонент (который будет интерпретироваться Android как альфа-компонент) в настоящее время игнорируется. Если приложение нацелено на уровень API 28 или выше, #80ff8080
интерпретируется как 50% прозрачный светло-зеленый ( #80ff80
).
Обнаружение MIME-типа файла: URI
Версии Android, предшествующие Android 9, могли определять типы MIME на основе содержимого файла. Начиная с Android 9 (уровень API 28), приложения должны использовать правильное расширение файла при загрузке file:
URI в WebView .
Использование содержимого файла для определения типов MIME может стать источником ошибок безопасности, что обычно не допускается современными браузерами.
Если файл имеет распознаваемое расширение файла, например .html
, .txt
, .js
или .css
тип MIME будет определяться расширением. Если файл не имеет расширения или нераспознан, тип MIME будет обычным текстом.
Например, URI типа file:///sdcard/test.html
будет отображаться как HTML, а URI типа file:///sdcard/test
будет отображаться как обычный текст, даже если файл содержит данные HTML.
Элемент прокрутки документа
Android 9 правильно обрабатывает случай, когда корневым элементом документа является элемент прокрутки. В более ранних версиях позиция прокрутки задавалась для элемента body, а корневой элемент имел нулевые значения прокрутки. Android 9 обеспечивает совместимое со стандартами поведение, при котором элемент прокрутки является корневым элементом.
Кроме того, прямой доступ к document.body.scrollTop
, document.body.scrollLeft
, document.documentElement.scrollTop
или document.documentElement.scrollLeft
будет вести себя по-разному в зависимости от целевого SDK. Чтобы получить доступ к значениям прокрутки области просмотра, используйте document.scrollingElement
, если доступно.
Уведомления от приостановленных приложений
До Android 9 уведомления от приостановленных приложений были отменены. Начиная с Android 9, уведомления от приостановленных приложений скрываются до тех пор, пока приложение не будет возобновлено.