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

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

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

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

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

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

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

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

В прошлом компиляция ahead-of-time (AOT), выполняемая Android Runtime (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 дюймов для тестирования кода на больших экранах.

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