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

Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.

Последнее обновление: 2024-08-07 UTC.