Изменения поведения: приложения, ориентированные на API уровня 28+

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, должны учитывать частные DNS API. В частности, приложения должны гарантировать, что если системный DNS-сервер использует DNS-over-TLS, то любой встроенный DNS-клиент либо использует зашифрованный 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 в этом процессе необходимо присвоить каждому процессу уникальный суффикс каталога данных, используя метод WebView.setDataDirectorySuffix() . Этот метод помещает веб-данные из каждого процесса в отдельный каталог внутри каталога данных вашего приложения.

Домены 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, эта библиотека удалена из bootclasspath и по умолчанию недоступна для приложений.

Для продолжения использования HTTP-клиента Apache приложения, ориентированные на Android 9 и выше, могут добавить следующее в свой файл AndroidManifest.xml :

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

В качестве альтернативы использованию встроенной библиотеки Apache приложения могут включать в свои APK-файлы собственную версию библиотеки org.apache.http . В этом случае необходимо перепаковать библиотеку (с помощью такой утилиты, как JarJar ), ​​чтобы избежать проблем совместимости классов с классами, предоставляемыми средой выполнения.

Изменения в пользовательском интерфейсе

Фокусировка взгляда

Элементы, площадь которых равна 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), приложения должны использовать правильное расширение файла при загрузке URI типа file: в 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, уведомления от приостановленных приложений скрываются до тех пор, пока приложение не будет возобновлено.