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