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

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