Платформа Android 17 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются ко всем приложениям, работающим на Android 17, независимо от targetSdkVersion . Вам следует протестировать свое приложение, а затем внести в него необходимые изменения для поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают только приложения, ориентированные на Android 17 .
Основная функциональность
В Android 17 (уровень API 37) внесены следующие изменения, которые модифицируют или расширяют различные основные возможности системы Android.
Ограничения памяти приложения
Android 17 introduces app memory limits based on the device's total RAM to create a more stable and deterministic environment for your applications and Android users. In Android 17, limits are set conservatively to establish system baselines, targeting extreme memory leaks and other outliers before they trigger system-wide instability resulting in UI stuttering, higher battery drain, and apps being killed. While we anticipate minimal impact on the vast majority of app sessions, we recommend the following memory best practices, including establishing a baseline for memory.
You can determine if your app session was impacted by calling
getDescription in ApplicationExitInfo; if your app was
affected, the exit reason will be REASON_OTHER and
the description will contain the string "MemoryLimiter:AnonSwap" along with
other information. You can also use trigger-based profiling with
TRIGGER_TYPE_ANOMALY to get heap dumps that are collected when the
memory limit is hit.
To help you find memory leaks, Android Studio Panda adds LeakCanary integration directly in the Android Studio Profiler as a dedicated task, contextualized within the IDE and fully integrated with your source code.
Безопасность
В Android 17 включены следующие улучшения безопасности устройств и приложений.
используется план амортизации ClearTraffic
В одном из будущих релизов мы планируем отказаться от элемента usesCleartextTraffic . Приложениям, которым необходимо устанавливать незашифрованные (HTTP) соединения, следует перейти на использование файла конфигурации сетевой безопасности , который позволяет указывать, к каким доменам ваше приложение должно устанавливать соединения в открытом виде.
Обратите внимание, что файлы конфигурации сетевой безопасности поддерживаются только для уровней API 24 и выше. Если минимальное значение API вашего приложения ниже 24, вам следует выполнить оба следующих действия:
- Установите атрибут
usesCleartextTrafficвtrue - Используйте файл конфигурации сети.
Если минимальный уровень API вашего приложения равен 24 или выше, вы можете использовать файл сетевой конфигурации, и вам не нужно устанавливать параметр usesCleartextTraffic .
Ограничить неявные URI-гранты
В настоящее время, если приложение запускает интент с URI, содержащим действие Send , SendMultiple или ImageCapture , система автоматически предоставляет целевому приложению права на чтение и запись по этому URI. Мы планируем изменить это поведение в Android 18. Поэтому мы рекомендуем приложениям явно предоставлять соответствующие разрешения по URI, а не полагаться на автоматическое предоставление этих прав системой.
Ограничения на хранилище ключей для каждого приложения
Приложениям следует избегать создания чрезмерного количества ключей в Android Keystore, поскольку это общий ресурс для всех приложений на устройстве. Начиная с Android 17, система устанавливает ограничение на количество ключей, которыми может владеть приложение. Лимит составляет 50 000 ключей для приложений, не являющихся системными и ориентированных на Android 17 (уровень API 37) или выше, и 200 000 ключей для всех остальных приложений. Для системных приложений установлен лимит в 200 000 ключей, независимо от того, на какой уровень API они ориентированы.
Если приложение попытается создать ключи сверх установленного лимита, создание завершится ошибкой KeyStoreException . В сообщении об исключении содержится информация о лимите ключей. Если приложение вызывает getNumericErrorCode() для обработки исключения, возвращаемое значение зависит от того, какой уровень API использует приложение.
- Приложения, ориентированные на Android 17 (уровень API 37) или выше:
getNumericErrorCode()возвращает новое значениеERROR_TOO_MANY_KEYS. - Для всех остальных приложений:
getNumericErrorCode()возвращаетERROR_INCORRECT_USAGE.
Пользовательский опыт и пользовательский интерфейс системы
В Android 17 внесены следующие изменения, призванные обеспечить более согласованный и интуитивно понятный пользовательский интерфейс.
Восстановление видимости IME по умолчанию после поворота экрана.
Beginning with Android 17, when the device's configuration changes (for example, through rotation), and this is not handled by the app itself, the previous IME visibility is not restored.
If your app undergoes a configuration change that it does not handle, and the app needs the keyboard to be visible after the change, you must explicitly request this. You can make this request in one of the following ways:
- Set the
android:windowSoftInputModeattribute tostateAlwaysVisible. - Programmatically request the soft keyboard in your activity's
onCreate()method, or add theonConfigurationChanged()method.
Вклад человека
В Android 17 внесены следующие изменения, влияющие на взаимодействие приложений с устройствами ввода, такими как клавиатуры и сенсорные панели.
Сенсорные панели по умолчанию передают относительные события во время захвата указателя.
Beginning with Android 17, if an app requests pointer capture using
View.requestPointerCapture() and the user uses a touchpad, the system
recognizes pointer movement and scrolling gestures from the user's touches and
reports them to the app in the same way as pointer and scroll wheel movements
from a captured mouse. In most cases, this removes the need for apps that
support captured mice to add special handling logic for touchpads. For more
details, see the documentation for View.POINTER_CAPTURE_MODE_RELATIVE.
Previously, the system did not attempt to recognize gestures from the touchpad,
and instead delivered the raw, absolute finger locations to the app in a similar
format to touchscreen touches. If an app still requires this absolute data, it
should call the new View.requestPointerCapture(int) method with
View.POINTER_CAPTURE_MODE_ABSOLUTE instead.
СМИ
В Android 17 внесены следующие изменения в работу с мультимедиа.
Фоновое усиление защиты звука
Beginning with Android 17, the audio framework enforces restrictions on background audio interactions including audio playback, audio focus requests, and volume change APIs to ensure that these changes are started intentionally by the user.
If the app tries to call audio APIs while the app is not in a valid lifecycle,
the audio playback and volume change APIs fail silently without throwing an
exception or providing a failure message. The audio focus API fails with the
result code AUDIOFOCUS_REQUEST_FAILED.
For more information, including mitigation strategies, see Background audio hardening.
Подключение
В Android 17 внесены следующие изменения для улучшения возможностей подключения устройств.
Автономное повторное сопряжение при потере соединения Bluetooth
В Android 17 появилась функция автономного повторного сопряжения — системное улучшение, предназначенное для автоматического устранения потери соединения Bluetooth.
Ранее, если связь с устройством терялась, пользователям приходилось вручную переходить в «Настройки», чтобы отменить сопряжение, а затем повторно его установить. Эта функция основана на улучшении безопасности Android 16 и позволяет системе восстанавливать связь в фоновом режиме без необходимости вручную переходить в «Настройки» для отмены и повторного сопряжения устройств.
Хотя большинству приложений не потребуется вносить изменения в код, разработчикам следует учитывать следующие изменения в поведении стека Bluetooth:
- Новый контекст сопряжения: теперь параметр
ACTION_PAIRING_REQUESTвключает дополнительный параметрEXTRA_PAIRING_CONTEXT, который позволяет приложениям различать стандартный запрос на сопряжение и попытку повторного сопряжения, инициированную автономной системой. - Условное обновление ключей: существующие ключи безопасности будут заменены только в том случае, если повторное сопряжение пройдет успешно и новое соединение будет соответствовать или превосходить уровень безопасности предыдущего соединения.
- Изменена синхронизация интента: теперь интент
ACTION_KEY_MISSINGпередается только в том случае, если попытка автономного повторного сопряжения не удалась. Это уменьшает ненужную обработку ошибок в приложении, если система успешно восстанавливает соединение в фоновом режиме. - Уведомление пользователя: Система управляет повторным сопряжением посредством новых уведомлений и диалоговых окон пользовательского интерфейса. Пользователям будет предложено подтвердить попытку повторного сопряжения, чтобы убедиться, что они осведомлены о повторном подключении.
Производители периферийных устройств и разработчики сопутствующих приложений должны убедиться, что оборудование и приложение корректно обрабатывают переходы между состояниями соединения. Для проверки этого поведения смоделируйте удаленную потерю соединения, используя один из следующих методов:
- Вручную удалите информацию о соединении из периферийного устройства.
- Отключите устройство вручную в разделе: Настройки > Подключенные устройства