В Android 10 внесены изменения в работу системы, которые могут повлиять на ваше приложение. Изменения, перечисленные на этой странице, касаются только приложений, предназначенных для API 29 или более поздней версии. Если в вашем приложении для параметра targetSdkVersion задано значение 29 или выше, вам следует изменить приложение, чтобы оно поддерживало эти функции.
Также ознакомьтесь со списком изменений в поведении, которые затрагивают все приложения, работающие на Android 10.
Примечание. Помимо изменений, перечисленных на этой странице, в Android 10 появилось множество изменений и ограничений, связанных с конфиденциальностью, в том числе:
- Области хранения данных
- Доступ к серийному номеру USB-устройства
- включать, отключать и настраивать Wi-Fi;
- Разрешения на доступ к данным о местоположении для API подключения
Эти изменения, которые затрагивают приложения с целевым уровнем API 29 или выше, повышают конфиденциальность пользователей. Подробную информацию об этом вы найдете на странице Изменения в области конфиденциальности.
Обновление ограничений для интерфейсов, не относящихся к SDK
Чтобы обеспечить стабильность и совместимость приложений, в Android 9 (уровень API 28) мы начали ограничивать использование интерфейсов, не относящихся к SDK. В 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 map.
Приложения, предназначенные для 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 Runtime принимает только OAT-файлы, созданные системой
Среда выполнения Android (ART) больше не вызывает dex2oat из процесса приложения. Это означает, что ART будет принимать только OAT-файлы, сгенерированные системой.
Обеспечение правильности AOT в ART
Раньше предварительная компиляция, выполняемая Android Runtime (ART), могла приводить к сбоям во время выполнения, если среда classpath не совпадала во время компиляции и выполнения. В Android 10 и более поздних версиях эти контексты всегда должны быть одинаковыми, что приводит к следующим изменениям в поведении:
- Специальные загрузчики классов, то есть написанные приложениями, а не из пакета
dalvik.system, не компилируются заранее. Это связано с тем, что ART не может знать о реализации поиска пользовательских классов во время выполнения. - Дополнительные DEX-файлы, то есть загруженные вручную приложениями, которые не входят в основной APK-файл, компилируются в фоновом режиме. Это связано с тем, что компиляция при первом использовании может быть слишком ресурсоемкой, что приведет к нежелательной задержке перед выполнением. Обратите внимание, что для приложений рекомендуется использовать разделение и отказаться от дополнительных DEX-файлов.
- Общие библиотеки в Android (записи <library> и <uses-library> в манифесте Android) реализованы с использованием иерархии загрузчиков классов, отличной от той, которая использовалась в предыдущих версиях платформы.
Изменения в разрешениях для полноэкранных объектов intent
Приложения, предназначенные для 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 также изменилось. Если в Android 10 (уровень API 29) или более поздней версии для приложения задано значение resizeableActivity=false, то при изменении размера экрана или перемещении приложения с одного экрана на другой оно может быть переведено в режим совместимости.
В Android 10 появился атрибут android:minAspectRatio, с помощью которого можно указать поддерживаемые соотношения сторон экрана.
Начиная с версии 3.5, эмулятор Android Studio включает виртуальные устройства с экранами 7,3 и 8 дюймов для тестирования кода на больших экранах.
Подробнее о том, как разрабатывать приложения для складных устройств…