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