September 3, 2018

Что нового в Android 9.0 Pie, часть 2

Android 9 (API 28) представляет ряд изменений в системе Android. Следующие изменения поведения применяются исключительно к приложениям, которые поставили targetSdkVersion на 28 или выше. Разработчики должны изменить их приложения, чтобы поддерживать их должным образом

Для изменений, которые влияют на все приложения, работающие на Android 9, независимо от того, какой API уровень они нацелены, см. предыдущую статью на канале

Foreground сервисы

Приложения, ориентированные на Android 9 или выше и использующие службы переднего плана, должны запрашивать разрешение FOREGROUND_SERVICE. Это нормальное разрешение, таким образом, система автоматически предоставляет его запрашивающему приложению.

Если приложение, предназначенное для Android 9 или выше, пытается создать службу переднего плана без запрашивания FOREGROUND_SERVICE, система выкинет SecurityException.

Проверка серийного номера устройства

В 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, доступные везде. Это изменение улучшает целостность песочницы приложения.

Удаление Apache HttpClient

С Android 6.0, мы удалили поддержку Apache HttpClient. Начиная с Android 9, эта библиотека удаляется из bootclasspath и недоступна для приложений по умолчанию.

Чтобы продолжить использование Apache HTTP client, в приложениях, ориентированных на Android 9 и выше можно добавить к их AndroidManifest.xml:

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

В качестве альтернативы использованию библиотеки Apache из рантайма, приложения могут использовать собственную версию библиотеки org.apache.http в APK. Если вы это сделаете, то вы должны переупаковать библиотеку, чтобы избежать проблем с совместимостью классов библиотеки с классами, предоставленными в рантайме.

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

View фокус

View с площадью 0 (ширина или высота равна 0) больше не являются фокусируемыми.

Обработка шестнадцатеричных значений CSS RGBA

Приложения, ориентированные на Android 9 или выше, должны включить CSS 4 для обработки 4 и 8-значных шестнадцатеричных цифр цветов CSS.

Цветной модуль CSS 4 поддерживается Chrome начиная с выпуска 52, но WebView в настоящее время отключает эту функцию, потому что существующие приложения Android были найдены, чтобы поддерживать 32 битные шестнадцатеричные цвета в Android (ARGB), который вызовет ошибки рендеринга.

Например, цвет #80ff8080 в настоящее время отрисовывается в WebView как непрозрачный светло-красный (#ff8080) для приложений, ориентированных на API уровней 27 или ниже. Альфа канал в настоящее время игнорируется. Если приложение имеет целевой уровень API 28 или выше, #80ff8080 отражается как светло-зеленый с 50% прозрачности (#ff8080).

Уведомления от приостановленных приложений

До Android 9 уведомления от приостановленных приложений были отменены. Начиная с Android 9, уведомления от приостановленных приложений скрыты до того как приложение возобновит свою работу.