Платформа Android 17 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются ко всем приложениям, работающим на Android 17, независимо от targetSdkVersion . Вам следует протестировать свое приложение, а затем внести в него необходимые изменения для поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают только приложения, ориентированные на Android 17 .
Основная функциональность
В Android 17 (уровень API 37) внесены следующие изменения, которые модифицируют или расширяют различные основные возможности системы Android.
Ограничения памяти приложения
В Android 17 введены ограничения на использование памяти приложениями, основанные на общем объеме оперативной памяти устройства, что создает более стабильную и предсказуемую среду для ваших приложений и пользователей Android. Эти ограничения позволяют выявлять утечки памяти и другие аномалии до того, как они вызовут системную нестабильность, приводящую к зависаниям пользовательского интерфейса, повышенному расходу заряда батареи и закрытию приложений. Хотя мы ожидаем минимального влияния на подавляющее большинство сеансов работы приложений, мы рекомендуем следующие рекомендации по использованию памяти , включая установление базового уровня памяти.
Вы можете определить, повлияло ли это на работу вашего приложения, вызвав getDescription в ApplicationExitInfo ; если ваше приложение пострадало, причина завершения будет REASON_OTHER , а описание будет содержать строку "MemoryLimiter:AnonSwap" вместе с другой информацией. Вы также можете использовать профилирование на основе триггеров с TRIGGER_TYPE_ANOMALY для получения дампов кучи, которые собираются при достижении лимита памяти.
В разделе «Управление памятью вашего приложения» содержится информация, которая поможет вам диагностировать проблемы с памятью вашего приложения и оптимизировать потребление ресурсов.
Протестируйте работу вашего приложения с учетом ограничений по объему памяти.
Вы можете использовать Android Debug Bridge ( adb ) для настройки или отключения ограничений памяти на любом устройстве, которое их устанавливает. Команда оболочки am предоставляет три подкоманды для настройки ограничений памяти. (Эти команды не действуют на устройствах, которые не устанавливают ограничения памяти.)
-
am memory-limiter ignore <uid>|none|all -
am memory-limiter manual <pid> <limit>|max|none -
am memory-limiter status
-
ignore Указывает ограничителю памяти игнорировать некоторые или все процессы. Передача UID (идентификатора пользователя Android) указывает ограничителю памяти игнорировать применение ограничений ко всем процессам, связанным с этим UID. Вы также можете передать
all(игнорировать все приложения) илиnone(не игнорировать ни одно приложение). Передачаnoneотменяет все предыдущие вызовы функцииam memory-limiter ignore.Если вы укажете ограничителю памяти игнорировать UID, вы все равно сможете применить ручное ограничение памяти к процессу внутри приложения, вызвав
am memory-limiter manual.-
manual Указывает системе установить ограничение на использование памяти для процесса с указанным PID (идентификатором процесса). Ограничение на использование памяти указывается в виде целого числа в МБ; например, передача значения
30означает, что процесс ограничен 30 МБ памяти. Передача значенияmaxснимает все ограничения на использование памяти для этого процесса. Передача значенияnoneснимает любые установленные вручную ограничения для процесса, восстанавливая ограничение по умолчанию (если таковое имеется).-
status Сообщает о текущем состоянии ограничителя памяти. Состояние включает в себя ограничения памяти, наложенные на видимые и невидимые процессы.
Конфиденциальность
В Android 17 внесены следующие изменения для повышения конфиденциальности пользователей.
Защита от SMS-уведомлений с одноразовым паролем (OTP)
从 Android 17 开始,Android 将扩大对包含一次性密码 (OTP) 的短信的保护范围。
在之前的 Android 版本中,此保护主要侧重于 SMS Retriever 格式。对于大多数应用,包含 SMS Retriever 哈希的消息的递送延迟了 3 小时。不过,某些应用(例如默认短信处理程序)不受此延迟的影响,拥有哈希的应用也不受此延迟的影响。
从 Android 17 开始,此保护也适用于 WebOTP 格式的消息。如果应用有权读取短信,但不是 WebOTP 消息的预期接收者(由网域验证确定),则该应用在收到消息后 3 小时内无法访问该消息。此变更旨在提高用户安全性,确保只有与消息中提及的网域关联的应用才能以编程方式读取验证码。
在这 3 小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION 广播,并过滤 短信提供商 数据库查询。延迟结束后,这些应用即可使用短信。此变更适用于
所有应用,无论其目标 API 级别如何。
某些应用(例如默认短信助理应用、关联设备配套应用等)不受此延迟的影响。所有依赖于读取短信 来提取 OTP 的应用都应过渡到使用 SMS Retriever 或 SMS User Consent API,以确保功能持续可用。
Безопасность
В Android 17 включены следующие улучшения безопасности устройств и приложений.
используется план амортизации ClearTraffic
В одном из будущих релизов мы планируем отказаться от элемента usesCleartextTraffic . Приложениям, которым необходимо устанавливать незашифрованные (HTTP) соединения, следует перейти на использование файла конфигурации сетевой безопасности , который позволяет указывать, к каким доменам ваше приложение должно устанавливать соединения в открытом виде.
Обратите внимание, что файлы конфигурации сетевой безопасности поддерживаются только для уровней API 24 и выше. Если минимальное значение API вашего приложения ниже 24, вам следует выполнить оба следующих действия:
- Установите атрибут
usesCleartextTrafficвtrue - Используйте файл конфигурации сети.
Если минимальный уровень API вашего приложения равен 24 или выше, вы можете использовать файл сетевой конфигурации, и вам не нужно устанавливать параметр usesCleartextTraffic .
Ограничить неявные URI-гранты
目前,如果应用启动的 intent 具有 URI,且该 URI 具有操作
ACTION_SEND、ACTION_SEND_MULTIPLE或
ACTION_IMAGE_CAPTURE,则系统会自动向目标应用授予读取和
写入 URI 权限。从 Android 18 开始,系统将
不再自动授予这些权限。因此,我们建议应用明确授予相关 URI 权限,而不是依赖系统授予这些权限。
如需检测应用中这些 intent 的使用情况,请将 StrictMode 与
detectImplicitUriPermissionGrant() 结合使用,以触发违规行为:
Kotlin
val policy = StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build() StrictMode.setVmPolicy(policy)
Java
StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build(); StrictMode.setVmPolicy(policy);
或者,您也可以监控包含消息 Please set the grant explicitly in the app 的已记录异常,该消息会在系统隐式设置授予时显示。您可以使用以下 adb 命令监控这些日志:
adb logcat | grep "Please set the grant explicitly in the app"
如需明确授予必要的权限,请将
FLAG_GRANT_READ_URI_PERMISSION标志添加到ACTION_SEND和
ACTION_SEND_MULTIPLEintent:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
对于
ACTION_IMAGE_CAPTURE intent,请同时添加FLAG_GRANT_READ_URI_PERMISSION 和
FLAG_GRANT_WRITE_URI_PERMISSION 标志:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Ограничения на хранилище ключей для каждого приложения
Apps should avoid creating excessive numbers of keys in Android Keystore, because it is a shared resource for all apps on the device. Beginning with Android 17, the system enforces a limit on the number of keys an app can own. The limit is 50,000 keys for non-system apps targeting Android 17 (API level 37) or higher, and 200,000 keys for all other apps. System apps have a limit of 200,000 keys, regardless of which API level they target.
If an app attempts to create keys beyond the limit, the creation fails with a
KeyStoreException. The exception's message string contains information
about the key limit. If the app calls getNumericErrorCode() on the
exception, the return value depends on what API level the app targets:
- Apps targeting Android 17 (API level 37) or higher:
getNumericErrorCode()returns the newERROR_TOO_MANY_KEYSvalue. - All other apps:
getNumericErrorCode()returnsERROR_INCORRECT_USAGE.
Блокировка трафика обратной связи между профилями.
Начиная с Android 17, межпрофильный трафик обратной связи по умолчанию больше не разрешен. Трафик обратной связи внутри одного профиля не затрагивается. Это изменение применяется ко всем приложениям, работающим на Android 17 или выше, независимо от того, какой уровень API использует приложение.
Пользовательский опыт и пользовательский интерфейс системы
В Android 17 внесены следующие изменения, призванные обеспечить более согласованный и интуитивно понятный пользовательский интерфейс.
Восстановление видимости IME по умолчанию после поворота экрана.
Начиная с Android 17, при изменении конфигурации устройства (например, при повороте экрана), если это не обрабатывается самим приложением, предыдущая видимость IME не восстанавливается.
Если в вашем приложении происходит изменение конфигурации, которое оно не обрабатывает, и приложению необходимо, чтобы клавиатура оставалась видимой после этого изменения, вы должны явно запросить это. Вы можете сделать этот запрос одним из следующих способов:
- Установите атрибут
android:windowSoftInputModeв значениеstateAlwaysVisible. - Запросите экранную клавиатуру программным способом в методе
onCreate()вашего Activity или добавьте методonConfigurationChanged().
Вклад человека
В Android 17 внесены следующие изменения, влияющие на взаимодействие приложений с устройствами ввода, такими как клавиатуры и сенсорные панели.
Сенсорные панели по умолчанию передают относительные события во время захвата указателя.
从 Android 17 开始,如果应用使用 View.requestPointerCapture() 请求捕获指针,并且用户使用触控板,系统会识别用户触摸操作产生的指针移动和滚动手势,并以与捕获的鼠标产生的指针和滚轮移动相同的方式将这些信息报告给应用。在大多数情况下,这使得支持捕获鼠标的应用无需为触控板添加特殊的处理逻辑。如需了解详情,请参阅 View.POINTER_CAPTURE_MODE_RELATIVE 的文档。
之前,系统不会尝试识别触控板的手势,而是以类似于触摸屏触摸的格式将原始的绝对手指位置传递给应用。如果应用仍需要此绝对数据,则应改为使用 View.POINTER_CAPTURE_MODE_ABSOLUTE 调用新的 View.requestPointerCapture(int) 方法。
СМИ
В Android 17 внесены следующие изменения в работу с мультимедиа.
Фоновое усиление защиты звука
Начиная с Android 17, аудиофреймворк вводит ограничения на фоновые взаимодействия со звуком, включая воспроизведение аудио, запросы на фокусировку на аудио и API изменения громкости, чтобы гарантировать, что эти изменения инициируются пользователем осознанно.
Если приложение пытается вызвать API для работы со звуком, находясь вне допустимого жизненного цикла, API воспроизведения звука и изменения громкости завершаются с ошибкой без генерации исключения или предоставления сообщения об ошибке. API фокусировки звука завершается с кодом ошибки AUDIOFOCUS_REQUEST_FAILED .
Для получения дополнительной информации, включая стратегии смягчения последствий, см. раздел «Усиление защиты фонового звука» .
Подключение
В Android 17 внесены следующие изменения для улучшения возможностей подключения устройств.
Автономное повторное сопряжение при потере соединения Bluetooth
В Android 17 появилась функция автономного повторного сопряжения — системное улучшение, предназначенное для автоматического устранения потери соединения Bluetooth.
Ранее, если связь с устройством терялась, пользователям приходилось вручную переходить в «Настройки», чтобы отменить сопряжение, а затем повторно его установить. Эта функция основана на улучшении безопасности Android 16 и позволяет системе восстанавливать связь в фоновом режиме без необходимости вручную переходить в «Настройки» для отмены и повторного сопряжения устройств.
Хотя большинству приложений не потребуется вносить изменения в код, разработчикам следует учитывать следующие изменения в поведении стека Bluetooth:
- Новый контекст сопряжения: теперь параметр
ACTION_PAIRING_REQUESTвключает дополнительный параметрEXTRA_PAIRING_CONTEXT, который позволяет приложениям различать стандартный запрос на сопряжение и попытку повторного сопряжения, инициированную автономной системой. - Условное обновление ключей: существующие ключи безопасности будут заменены только в том случае, если повторное сопряжение пройдет успешно и новое соединение будет соответствовать или превосходить уровень безопасности предыдущего соединения.
- Изменена синхронизация интента: теперь интент
ACTION_KEY_MISSINGпередается только в том случае, если попытка автономного повторного сопряжения не удалась. Это уменьшает ненужную обработку ошибок в приложении, если система успешно восстанавливает соединение в фоновом режиме. - Уведомление пользователя: Система управляет повторным сопряжением посредством новых уведомлений и диалоговых окон пользовательского интерфейса. Пользователям будет предложено подтвердить попытку повторного сопряжения, чтобы убедиться, что они осведомлены о повторном подключении.
Производители периферийных устройств и разработчики сопутствующих приложений должны убедиться, что оборудование и приложение корректно обрабатывают переходы между состояниями соединения. Для проверки этого поведения смоделируйте удаленную потерю соединения, используя один из следующих методов:
- Вручную удалите информацию о соединении из периферийного устройства.
- Отключите устройство вручную в разделе: Настройки > Подключенные устройства