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

В Android 10 внесены изменения в поведение системы, которые могут повлиять на ваше приложение. Изменения, перечисленные на этой странице, применяются исключительно к приложениям, ориентированным на API 29 или выше. Если в вашем приложении targetSdkVersion установлен на "29" или выше, вам следует внести изменения, чтобы обеспечить корректную поддержку этих изменений, где это применимо.

Обязательно ознакомьтесь также со списком изменений в поведении, затрагивающих все приложения, работающие на Android 10 .

Примечание: Помимо изменений, перечисленных на этой странице, Android 10 вводит большое количество изменений и ограничений, связанных с конфиденциальностью, в том числе следующие:

  • Ограниченное хранение
  • Доступ к серийному номеру USB-устройства
  • Возможность включать, выключать и настраивать Wi-Fi.
  • Разрешения на доступ к местоположению для API подключения

Эти изменения, затрагивающие приложения, работающие с API уровня 29 и выше, повышают уровень конфиденциальности пользователей. Чтобы узнать больше о том, как поддержать эти изменения, см. страницу « Изменения в политике конфиденциальности» .

Обновления ограничений интерфейса, не относящегося к SDK.

Для обеспечения стабильности и совместимости приложений платформа начала ограничивать использование не-SDK интерфейсов вашими приложениями в Android 9 (уровень API 28). Android 10 включает обновленные списки ограниченных не-SDK интерфейсов, основанные на сотрудничестве с разработчиками Android и результатах последнего внутреннего тестирования. Наша цель — обеспечить наличие общедоступных альтернатив до того, как мы начнем ограничивать не-SDK интерфейсы.

Если вы не планируете использовать Android 10 (уровень API 29), некоторые из этих изменений могут не сразу повлиять на вас. Однако, хотя в настоящее время вы можете использовать некоторые интерфейсы, не связанные с SDK ( в зависимости от целевого уровня API вашего приложения ), использование любого метода или поля, не связанного с SDK, всегда сопряжено с высоким риском нарушения работы вашего приложения.

Если вы не уверены, использует ли ваше приложение интерфейсы, отличные от SDK, вы можете протестировать его , чтобы это выяснить. Если ваше приложение зависит от интерфейсов, отличных от SDK, вам следует начать планировать переход на альтернативы SDK. Тем не менее, мы понимаем, что в некоторых приложениях есть обоснованные сценарии использования интерфейсов, отличных от SDK. Если вы не можете найти альтернативу использованию интерфейса, отличного от SDK, для какой-либо функции в вашем приложении, вам следует запросить новый публичный API .

Для получения дополнительной информации см. разделы «Обновления ограничений интерфейсов, не относящихся к SDK, в Android 10» и « Ограничения интерфейсов, не относящихся к SDK» .

Общая память

Ashmem изменил формат карт Dalvik в /proc/<pid>/maps, что затронуло приложения, которые напрямую анализируют этот файл карт. Разработчикам приложений следует протестировать формат /proc/<pid>/maps на устройствах под управлением Android 10 или выше и соответствующим образом выполнить анализ, если приложение зависит от форматов карт Dalvik.

Приложения, ориентированные на Android 10, не могут напрямую использовать ashmem (/dev/ashmem) и должны вместо этого обращаться к разделяемой памяти через класс ASharedMemory из NDK. Кроме того, приложения не могут напрямую выполнять IOCTL-запросы к существующим файловым дескрипторам ashmem и должны вместо этого использовать либо класс ASharedMemory из NDK, либо API Android Java для создания областей разделяемой памяти. Это изменение повышает безопасность и надежность при работе с разделяемой памятью, улучшая производительность и безопасность Android в целом.

Удалено разрешение на выполнение для домашнего каталога приложения.

Выполнение файлов из каталога приложения, доступного для записи, является нарушением W^X . Приложения должны загружать только двоичный код, встроенный в APK-файл приложения.

Ненадежные приложения, ориентированные на Android 10, не могут напрямую вызывать execve() для файлов, находящихся в домашнем каталоге приложения.

Кроме того, приложения, ориентированные на Android 10, не могут изменять исполняемый код файлов, открытых с помощью dlopen() , в оперативной памяти и ожидать, что эти изменения будут записаны на диск, поскольку библиотека не может быть сопоставлена ​​с PROT_EXEC через доступный для записи дескриптор файла. Это относится и к любым разделяемым объектным файлам ( .so ) с текстовыми перемещениями.

Среда выполнения Android принимает только сгенерированные системой OAT-файлы.

Среда выполнения Android (ART) больше не вызывает dex2oat из процесса приложения. Это изменение означает, что ART будет принимать только OAT-файлы, сгенерированные системой.

Обеспечение корректности AOT в ART

Ранее предварительная компиляция (AOT), выполняемая средой выполнения Android (ART), могла приводить к сбоям во время выполнения, если среда classpath не совпадала во время компиляции и выполнения. В Android 10 и более поздних версиях всегда требуется, чтобы эти контексты среды были одинаковыми, что приводит к следующим изменениям в поведении:

  • Пользовательские загрузчики классов — то есть загрузчики классов, написанные самими приложениями, в отличие от загрузчиков классов из пакета dalvik.system — не компилируются AOT. Это связано с тем, что ART не может знать о пользовательской реализации поиска классов во время выполнения.
  • Вторичные dex-файлы — то есть dex-файлы, загружаемые вручную приложениями, не входящими в основной APK-файл, — компилируются AOT в фоновом режиме. Это связано с тем, что компиляция при первом использовании может быть слишком затратной, что приводит к нежелательным задержкам перед выполнением. Следует отметить, что для приложений рекомендуется использовать разделение файлов и отказаться от вторичных dex-файлов.
  • В Android разделяемые библиотеки (записи <library> и <uses-library> в манифесте Android) реализованы с использованием иной иерархии загрузчиков классов, чем та, что использовалась в предыдущих версиях платформы.

Изменения разрешений для полноэкранных интентов

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

Если приложение, ориентированное на Android 10 или более поздние версии, пытается создать уведомление с полноэкранным интентом, не запросив необходимые разрешения, система игнорирует полноэкранный интент и выводит следующее сообщение в журнал:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

Поддержка складных устройств

В Android 10 внесены изменения, обеспечивающие поддержку складных устройств и устройств с большими экранами.

При работе приложения на Android 10 методы onResume() и onPause() работают по-другому. Когда несколько приложений отображаются одновременно в многооконном или многоэкранном режиме, все доступные для фокусировки верхние активности в видимых стеках находятся в состоянии возобновления, но фокус фактически имеет только одна из них — «самая верхняя возобновленная» активность. При работе на версиях Android младше 10 одновременно может быть возобновлена ​​только одна активность в системе, все остальные видимые активности приостанавливаются.

Не следует путать «фокус» с «самым верхним возобновленным» действием. Система назначает приоритеты действиям на основе z-порядка, отдавая более высокий приоритет тем действиям, с которыми пользователь взаимодействовал последним. Действие может быть возобновлено сверху, но при этом не иметь фокуса (например, если панель уведомлений развернута).

В Android 10 (уровень API 29) и более поздних версиях вы можете подписаться на коллбэк onTopResumedActivityChanged() , чтобы получать уведомления о том, когда ваше приложение занимает или теряет верхнюю позицию в списке возобновленных действий. Это эквивалент состояния возобновления до Android 10 и может быть полезно в качестве подсказки, если ваше приложение использует эксклюзивные или синглтонные ресурсы, которые могут потребоваться для совместного использования с другими приложениями.

Изменилось и поведение атрибута манифеста resizeableActivity . Если приложение устанавливает resizeableActivity=false в Android 10 (уровень API 29) или более поздней версии, оно может перейти в режим совместимости при изменении доступного размера экрана или при переходе приложения с одного экрана на другой.

Приложения могут использовать атрибут android:minAspectRatio , появившийся в Android 10, для указания поддерживаемых вашим приложением соотношений сторон экрана .

Начиная с версии 3.5, инструмент эмулятора Android Studio включает виртуальные устройства с диагональю экрана 7,3 и 8 дюймов для тестирования кода на больших экранах.

Для получения дополнительной информации см. раздел «Разработка приложений для складных устройств» .