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