Как и в предыдущих версиях, Android 15 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются исключительно к приложениям, ориентированным на Android 15 или выше. Если ваше приложение ориентировано на Android 15 или выше, вам следует внести в него изменения для корректной поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают все приложения, работающие на Android 15, независимо от targetSdkVersion вашего приложения.
Основная функциональность
Android 15 изменяет или расширяет различные основные возможности системы Android.
Изменения в работе служб переднего плана
Мы вносим следующие изменения в службы переднего плана в Android 15.
- Поведение времени ожидания службы синхронизации данных на переднем плане
- Новый тип приоритетной службы обработки мультимедиа
- Ограничения на широковещательные приемники
BOOT_COMPLETED, запускающие службы приоритета - Ограничения на запуск служб переднего плана, пока приложение имеет разрешение
SYSTEM_ALERT_WINDOW
Поведение тайм-аута службы синхронизации данных на переднем плане
对于以 Android 15(API 级别 35)或更高版本为目标平台的应用,Android 15 为 dataSync 引入了新的超时行为。此行为也适用于新的 mediaProcessing 前台服务类型。
系统允许应用的 dataSync 服务在 24 小时内总共运行 6 小时,之后系统会调用正在运行的服务的 Service.onTimeout(int, int) 方法(在 Android 15 中引入)。此时,该服务有几秒钟时间来调用 Service.stopSelf()。调用 Service.onTimeout() 后,该服务将不再被视为前台服务。如果服务未调用 Service.stopSelf(),系统会抛出内部异常。系统会在 Logcat 中记录此异常,并显示以下消息:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
为避免因行为变更而导致问题,您可以执行以下一项或多项操作:
- 让您的服务实现新的
Service.onTimeout(int, int)方法。当您的应用收到回调时,请务必在几秒钟内调用stopSelf()。(如果您不立即停止应用,系统会生成故障。) - 确保应用的
dataSync服务在任何 24 小时内总运行时间不超过 6 小时(除非用户与应用互动,重置计时器)。 - 仅通过直接的用户互动来启动
dataSync前台服务;由于您的应用在服务启动时位于前台,因此服务会在应用进入后台后的 6 小时内完整运行。 - 请改用替代 API,而不是使用
dataSync前台服务。
如果您的应用的 dataSync 前台服务在过去 24 小时内运行了 6 小时,则您无法启动其他 dataSync 前台服务,除非用户已将您的应用切换到前台(这会重置计时器)。如果您尝试启动其他 dataSync 前台服务,系统会抛出 ForegroundServiceStartNotAllowedException,并显示类似“前台服务类型 dataSync 的时间限制已用尽”的错误消息。
测试
如需测试应用的行为,您可以启用数据同步超时功能,即使应用未以 Android 15 为目标平台也是如此(前提是应用在 Android 15 设备上运行)。如需启用超时,请运行以下 adb 命令:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
您还可以调整超时期限,更轻松地测试应用在达到此限制时的行为。如需设置新的超时期限,请运行以下 adb 命令:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Новый тип приоритетной службы обработки мультимедиа
В Android 15 представлен новый тип службы переднего плана — mediaProcessing . Этот тип службы подходит для таких операций, как перекодирование медиафайлов. Например, мультимедийное приложение может загрузить аудиофайл, и ему необходимо преобразовать его в другой формат перед воспроизведением. Вы можете использовать службу переднего плана mediaProcessing чтобы гарантировать, что преобразование продолжается, даже когда приложение находится в фоновом режиме.
Система разрешает службам mediaProcessing приложения работать в общей сложности 6 часов в течение 24-часового периода, после чего система вызывает метод Service.onTimeout(int, int) работающей службы (представленный в Android 15). В это время у службы есть несколько секунд для вызова Service.stopSelf() . Если служба не вызывает Service.stopSelf() , система выдает внутреннее исключение. Исключение регистрируется в Logcat со следующим сообщением:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"
Чтобы избежать исключения, вы можете сделать одно из следующих действий:
- Пусть ваш сервис реализует новый метод
Service.onTimeout(int, int). Когда ваше приложение получит обратный вызов, обязательно вызовитеstopSelf()в течение нескольких секунд. (Если вы не остановите приложение сразу, система выдаст ошибку.) - Убедитесь, что службы
mediaProcessingвашего приложения не работают более 6 часов в течение любого 24-часового периода (если только пользователь не взаимодействует с приложением, сбрасывая таймер). - Запускайте службы переднего плана
mediaProcessingтолько в результате прямого взаимодействия с пользователем; поскольку ваше приложение находится на переднем плане при запуске службы, у вашей службы есть полные шесть часов после того, как приложение перейдет в фоновый режим. - Вместо использования службы переднего плана
mediaProcessingиспользуйте альтернативный API , например WorkManager.
Если службы переднего плана mediaProcessing вашего приложения работали в течение 6 часов за последние 24, вы не сможете запустить другую службу переднего плана mediaProcessing , пока пользователь не переведет ваше приложение на передний план (что сбрасывает таймер). Если вы попытаетесь запустить другую службу переднего плана mediaProcessing , система выдаст ForegroundServiceStartNotAllowedException с сообщением об ошибке, например «Ограничение времени уже исчерпано для типа службы переднего плана mediaProcessing».
Дополнительные сведения о типе службы mediaProcessing см. в разделе Изменения в типах служб переднего плана для Android 15: обработка мультимедиа .
Тестирование
Чтобы проверить поведение вашего приложения, вы можете включить тайм-ауты обработки мультимедиа, даже если ваше приложение не предназначено для Android 15 (при условии, что приложение работает на устройстве Android 15). Чтобы включить таймауты, выполните следующую команду adb :
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Вы также можете настроить период ожидания, чтобы было проще протестировать поведение вашего приложения при достижении предела. Чтобы установить новый период ожидания, выполните следующую команду adb :
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds
Ограничения на широковещательные приемники BOOT_COMPLETED , запускающие службы приоритета
Существуют новые ограничения на широковещательные приемники BOOT_COMPLETED , запускающие службы приоритета. Получателям BOOT_COMPLETED не разрешено запускать следующие типы служб приоритета:
-
dataSync -
camera -
mediaPlayback -
phoneCall -
mediaProjection -
microphone(это ограничение действует дляmicrophoneначиная с Android 14)
Если получатель BOOT_COMPLETED пытается запустить любой из этих типов служб переднего плана, система выдает исключение ForegroundServiceStartNotAllowedException .
Тестирование
Чтобы проверить поведение вашего приложения, вы можете включить эти новые ограничения, даже если ваше приложение не предназначено для Android 15 (при условии, что приложение работает на устройстве Android 15). Запустите следующую команду adb :
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
Чтобы отправить широковещательную рассылку BOOT_COMPLETED без перезагрузки устройства, выполните следующую команду adb :
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Ограничения на запуск служб переднего плана, пока приложение имеет разрешение SYSTEM_ALERT_WINDOW
以前,如果应用拥有 SYSTEM_ALERT_WINDOW 权限,即使应用当前在后台运行,也可以启动前台服务(如免于后台启动限制中所述)。
如果应用以 Android 15 为目标平台,则此豁免范围现在更窄。现在,应用需要具有 SYSTEM_ALERT_WINDOW 权限,并且还需要有一个可见的叠加窗口。也就是说,应用需要先启动 TYPE_APPLICATION_OVERLAY 窗口,并且该窗口需要处于可见状态,然后您才能启动前台服务。
如果您的应用尝试从后台启动前台服务,但不符合这些新要求(并且没有其他豁免情况),系统会抛出 ForegroundServiceStartNotAllowedException。
如果您的应用声明了 SYSTEM_ALERT_WINDOW 权限并从后台启动前台服务,则可能会受到此变更的影响。如果您的应用获得了 ForegroundServiceStartNotAllowedException,请检查应用的操作顺序,并确保应用在尝试从后台启动前台服务之前已具有有效的叠加层窗口。您可以通过调用 View.getWindowVisibility() 检查叠加层窗口当前是否可见,也可以替换 View.onWindowVisibilityChanged(),以便在可见性发生变化时收到通知。
测试
如需测试应用的行为,您可以启用这些新限制,即使您的应用并未以 Android 15 为目标平台(只要应用在 Android 15 设备上运行)也是如此。如需针对从后台启动前台服务启用这些新限制,请运行以下 adb 命令:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
Изменения в условиях, когда приложения могут изменять глобальное состояние режима «Не беспокоить».
以 Android 15(API 级别 35)及更高版本为目标平台的应用无法再更改设备上的勿扰 (DND) 功能的全局状态或政策(无论是通过修改用户设置还是关闭勿扰模式)。相反,应用必须提供 AutomaticZenRule,系统会将其与现有的“最严格的政策优先”方案合并为一个全局政策。对之前会影响全局状态的现有 API 的调用(setInterruptionFilter、setNotificationPolicy)会导致创建或更新隐式 AutomaticZenRule,该 AutomaticZenRule 会根据这些 API 调用的调用周期开启和关闭。
请注意,只有当应用调用 setInterruptionFilter(INTERRUPTION_FILTER_ALL) 并希望该调用停用之前由其所有者激活的 AutomaticZenRule 时,此更改才会影响可观察到的行为。
Изменения в API OpenJDK
Android 15 将继续更新 Android 的核心库,以与最新 OpenJDK LTS 版本中的功能保持一致。
以下变更可能会影响以 Android 15(API 级别 35)为目标平台的应用的兼容性:
对字符串格式化 API 进行了更改:现在,当使用以下
String.format()和Formatter.format()API 时,对参数索引、标志、 宽度和精度的验证要求变得更加严格:String.format(String, Object[])String.format(Locale, String, Object[])Formatter.format(String, Object[])Formatter.format(Locale, String, Object[])
例如,当使用实参索引 0(格式字符串中的
%0)时,系统会抛出以下异常:IllegalFormatArgumentIndexException: Illegal format argument index = 0在这种情况下,可以使用实参索引 1(格式字符串中的
%1)来解决此问题。对
Arrays.asList(...).toArray()的组件类型进行了更改:使用Arrays.asList(...).toArray()时,生成的数组的组件类型现在是Object,而不是底层数组元素的类型。因此,以下代码会抛出ClassCastException:String[] elements = (String[]) Arrays.asList("one", "two").toArray();在这种情况下,如需在生成的 数组中保留
String作为组件类型,您可以改用Collection.toArray(Object[]):String[] elements = Arrays.asList("two", "one").toArray(new String[0]);对语言代码处理进行了更改:使用
LocaleAPI 时, 希伯来语、意第绪语和印度尼西亚语的语言代码不再转换为 其过时形式(希伯来语:iw,意第绪语:ji,印度尼西亚语:in)。 指定其中一种语言区域的语言代码时,请改用 ISO 639-1 中的代码 (希伯来语:he,意第绪语:yi,印度尼西亚语:id)。对随机 int 序列进行了更改:根据 https://bugs.openjdk.org/browse/JDK-8301574 中所做的更改,以下
Random.ints()方法现在返回的数字序列与 theRandom.nextInt()方法返回的数字序列不同:一般来说,此更改不应导致应用出现破坏性行为,但您的代码不应期望从
Random.ints()方法生成的序列与Random.nextInt()匹配。
新的 SequencedCollection API 可能会影响应用的兼容性
在应用的 build 配置中
更新 以使用
Android 15(API 级别 35)后:compileSdk
与
MutableList.removeFirst()和MutableList.removeLast()扩展函数在kotlin-stdlib中发生冲突Java 中的
List类型映射到 Kotlin 中的MutableList类型。 由于List.removeFirst()和List.removeLast()API 是在 Android 15(API 级别 35)中引入的,因此 Kotlin 编译器 会将函数调用(例如list.removeFirst())静态解析为 新的ListAPI,而不是kotlin-stdlib中的扩展函数。如果使用
compileSdk设置为35且minSdk设置为34或更低版本重新编译应用,然后在 Android 14 及更低版本上运行该应用,则会抛出运行时错误:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;Android Gradle 插件中现有的
NewApilint 选项可以捕获这些新的 API 用法。./gradlew lintMainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()如需修复运行时异常和 lint 错误,可以将
removeFirst()和removeLast()函数调用分别替换为 Kotlin 中的removeAt(0)和removeAt(list.lastIndex)。如果您使用的是 Android Studio Ladybug | 2024.1.3 或更高版本,它还为这些错误提供了快速修复选项。如果 lint 选项已停用,请考虑移除
@SuppressLint("NewApi")和lintOptions { disable 'NewApi' }。与 Java 中的其他方法发生冲突
新的方法已添加到现有类型中,例如,
List和Deque。这些新方法可能与其他接口和类中具有相同名称和实参类型的方法不兼容。如果方法签名冲突且不兼容,javac编译器会输出 build 时错误。例如:错误示例 1:
javac MyList.javaMyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List public void removeLast() { ^ return type void is not compatible with Object where E is a type-variable: E extends Object declared in interface List错误示例 2:
javac MyList.javaMyList.java:7: error: types Deque<Object> and List<Object> are incompatible; public class MyList implements List<Object>, Deque<Object> { both define reversed(), but with unrelated return types 1 error错误示例 3:
javac MyList.javaMyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible; public static class MyList implements List<Object>, MyInterface<Object> { class MyList inherits unrelated defaults for getFirst() from types List and MyInterface where E#1,E#2 are type-variables: E#1 extends Object declared in interface List E#2 extends Object declared in interface MyInterface 1 error如需修复这些 build 错误,实现这些接口的类应使用兼容的返回值类型替换该方法。例如:
@Override public Object getFirst() { return List.super.getFirst(); }
Безопасность
В Android 15 внесены изменения, повышающие безопасность системы и помогающие защитить приложения и пользователей от вредоносных программ.
Ограниченные версии TLS
Android 15 ограничивает использование TLS версий 1.0 и 1.1. Эти версии ранее были признаны устаревшими в Android, но теперь запрещены для приложений, ориентированных на Android 15.
Запуск защищенной фоновой активности
Android 15 защищает пользователей от вредоносных приложений и предоставляет им больше контроля над устройствами, добавляя изменения, которые не позволяют вредоносным фоновым приложениям выводить другие приложения на передний план, повышать их привилегии и злоупотреблять взаимодействием с пользователем. Запуск фоновых приложений ограничен начиная с Android 10 (уровень API 29).
Другие изменения
- Измените создатели
PendingIntentтак, чтобы они блокировали запуск фоновых процессов по умолчанию . Это поможет предотвратить случайное созданиеPendingIntentприложениями, которое может быть использовано злоумышленниками. - Не выводите приложение на передний план, если отправитель
PendingIntentне разрешит это . Это изменение направлено на предотвращение злоупотребления вредоносными приложениями возможностью запуска действий в фоновом режиме. По умолчанию приложениям не разрешено выводить стек задач на передний план, если создатель не предоставил права на запуск фоновых действий или у отправителя нет прав на запуск фоновых действий. - Управляет тем, как верхняя активность в стеке задач может завершить свою задачу . Если верхняя активность завершает задачу, Android возвращается к последней активной задаче. Более того, если не верхняя активность завершает свою задачу, Android возвращается на главный экран; это не блокирует завершение этой не верхней активности.
- Запретите запуск произвольных действий из других приложений в вашей собственной задаче . Это изменение предотвращает фишинг пользователей вредоносными приложениями, создающими действия, имитирующие действия из других приложений.
- Блокировать невидимые окна от запуска фоновых процессов . Это помогает предотвратить использование фоновых процессов вредоносными приложениями для отображения пользователям нежелательного или вредоносного контента.
Более безопасные намерения
В Android 15 представлен StrictMode для намерений.
Чтобы просмотреть подробные журналы нарушений использования Intent , используйте следующий метод:
Котлин
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Ява
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
Пользовательский опыт и пользовательский интерфейс системы
В Android 15 внесены некоторые изменения, призванные обеспечить более согласованный и интуитивно понятный пользовательский интерфейс.
Изменения отступа окна
Есть два изменения, связанных с вставками окон в Android 15: по умолчанию применяется сквозное изображение, а также есть изменения конфигурации, такие как конфигурация системных панелей по умолчанию.
Комплексное обеспечение соблюдения требований
Приложения по умолчанию отображаются без рамок на устройствах под управлением Android 15, если приложение ориентировано на Android 15 (уровень API 35).

Это критическое изменение, которое может негативно повлиять на пользовательский интерфейс вашего приложения. Изменения затрагивают следующие области пользовательского интерфейса:
- Панель навигации с помощью жестов
- По умолчанию прозрачный.
- Функция смещения вниз отключена, поэтому контент отображается за панелью навигации системы, если не применены отступы.
-
setNavigationBarColorиR.attr#navigationBarColorустарели и не влияют на навигацию жестами. -
setNavigationBarContrastEnforcedиR.attr#navigationBarContrastEnforcedпо-прежнему не влияют на навигацию жестами.
- 3-кнопочная навигация
- По умолчанию непрозрачность установлена на 80%, при этом цвет может соответствовать фону окна.
- Отключено смещение снизу, поэтому контент отображается за панелью навигации системы, если не применены отступы.
-
setNavigationBarColorиR.attr#navigationBarColorпо умолчанию устанавливают цвет в соответствии с фоном окна. Для применения этого значения по умолчанию фон окна должен быть задан цветом из графического объекта. Этот API устарел, но продолжает влиять на навигацию с тремя кнопками. -
setNavigationBarContrastEnforcedиR.attr#navigationBarContrastEnforcedпо умолчанию установлено значение true, что добавляет 80% непрозрачный фон к навигации из 3 кнопок.
- Строка состояния
- По умолчанию прозрачный.
- Верхнее смещение отключено, поэтому контент отображается за строкой состояния, если не применены отступы.
-
setStatusBarColorиR.attr#statusBarColorустарели и не оказывают никакого влияния на Android 15. -
setStatusBarContrastEnforcedиR.attr#statusBarContrastEnforcedустарели, но по-прежнему эффективны на Android 15.
- Вырез для дисплея
- Для неплавающих окон
layoutInDisplayCutoutModeдолжен быть установленLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS.SHORT_EDGES,NEVERиDEFAULTинтерпретируются какALWAYS, чтобы пользователи не видели черную полосу, вызванную вырезом в экране, и чтобы окно отображалось от края до края.
- Для неплавающих окон
В следующем примере показано приложение до и после перехода на Android 15 (уровень API 35), а также до и после применения отступов. Этот пример не является исчерпывающим, в Android Auto это может выглядеть иначе.



Что проверить, если ваше приложение уже полностью занимает всю ширину экрана?
Если ваше приложение уже имеет полноэкранный режим и применяет отступы, то в большинстве случаев это вас не затронет, за исключением следующих сценариев. Однако, даже если вы считаете, что это вас не коснется, мы рекомендуем протестировать ваше приложение.
- У вас неплавающее окно, например,
Activity, которое используетSHORT_EDGES,NEVERилиDEFAULTвместоLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS. Если ваше приложение вылетает при запуске, это может быть связано с вашим заставочным экраном. Вы можете либо обновить основную зависимость заставочного экрана до 1.2.0-alpha01 или более поздней, либо установитьwindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always. - Возможно, существуют экраны с низкой посещаемостью, на которых частично перекрыт пользовательский интерфейс. Убедитесь, что на этих менее посещаемых экранах нет перекрытого пользовательского интерфейса. К экранам с низкой посещаемостью относятся:
- Экраны регистрации или входа в систему
- Страницы настроек
Что проверить, если ваше приложение еще не оптимизировано для отображения всего экрана?
Если ваше приложение ещё не является полностью открытым (bread to edge), то, скорее всего, оно вас затронет. Помимо сценариев для приложений, которые уже являются полностью открытыми (bread to edge), следует учитывать следующее:
- Если ваше приложение использует компоненты Material 3 (
androidx.compose.material3) в Compose, такие какTopAppBar,BottomAppBarиNavigationBar, то эти компоненты, скорее всего, не будут затронуты, поскольку они автоматически обрабатывают отступы. - Если ваше приложение использует компоненты Material 2 (
androidx.compose.material) в Compose, эти компоненты не обрабатывают отступы автоматически. Однако вы можете получить доступ к отступам и применить их вручную. В androidx.compose.material версии 1.6.0 и выше используйте параметрwindowInsets, чтобы вручную применить отступы дляBottomAppBar,TopAppBar,BottomNavigationиNavigationRail. Аналогично используйте параметрcontentWindowInsetsдляScaffold. - Если ваше приложение использует представления и компоненты Material (
com.google.android.material), большинство компонентов Material на основе представлений, таких какBottomNavigationView,BottomAppBar,NavigationRailViewилиNavigationView, обрабатывают отступы и не требуют дополнительной работы. Однако вам необходимо добавитьandroid:fitsSystemWindows="true"если вы используетеAppBarLayout. - Для пользовательских элементов, создаваемых с помощью компоновки, задайте отступы вручную. Если ваш контент находится внутри
Scaffold, вы можете использовать значения отступовScaffold. В противном случае задайте отступы с помощью одного изWindowInsets. - Если ваше приложение использует представления и
BottomSheet,SideSheetили пользовательские контейнеры, примените отступы с помощьюViewCompat.setOnApplyWindowInsetsListener. ДляRecyclerViewпримените отступы с помощью этого слушателя, а также добавьтеclipToPadding="false".
Что проверить, если вашему приложению необходима настраиваемая защита от фоновых процессов?
Если вашему приложению необходимо обеспечить настраиваемую защиту фона для трехкнопочной навигации или строки состояния, то следует разместить компонент или представление за системной панелью, используя WindowInsets.Type#tappableElement() для получения высоты трехкнопочной панели навигации или WindowInsets.Type#statusBars .
Дополнительные ресурсы, охватывающие все аспекты.
Дополнительные сведения о применении отступов см. в руководствах « Вид от края до края» и «Композиция от края до края» .
Устаревшие API
Следующие API-интерфейсы устарели, но не отключены:
-
R.attr#enforceStatusBarContrast -
R.attr#navigationBarColor(для навигации с 3 кнопками, с 80% прозрачностью) -
Window#isStatusBarContrastEnforced -
Window#setNavigationBarColor(для навигации с 3 кнопками, с 80% прозрачностью) -
Window#setStatusBarContrastEnforced
Следующие API-интерфейсы устарели и отключены:
-
R.attr#navigationBarColor(для навигации жестами) -
R.attr#navigationBarDividerColor -
R.attr#statusBarColor -
Window#setDecorFitsSystemWindows -
Window#getNavigationBarColor -
Window#getNavigationBarDividerColor -
Window#getStatusBarColor -
Window#setNavigationBarColor(для навигации жестами) -
Window#setNavigationBarDividerColor -
Window#setStatusBarColor
Стабильная конфигурация
Если ваше приложение ориентировано на Android 15 (уровень API 35) или выше, Configuration больше не исключает системные панели. Если вы используете размер экрана в классе Configuration для расчета компоновки, вам следует заменить его на более подходящие альтернативы, такие как соответствующий ViewGroup , WindowInsets или WindowMetricsCalculator в зависимости от ваших потребностей.
Configuration доступны с API 1. Обычно их получают из Activity.onConfigurationChanged . Они предоставляют информацию, такую как плотность окон, ориентация и размеры. Важной особенностью размеров окон, возвращаемых Configuration является то, что ранее они не включали системные панели.
Размер конфигурации обычно используется для выбора ресурсов, например, /res/layout-h500dp , и это по-прежнему допустимый вариант использования. Однако использование его для расчета компоновки всегда не рекомендовалось. Если вы все же используете его, вам следует отказаться от него. Вам следует заменить использование Configuration чем-то более подходящим в зависимости от ваших задач.
Если вы используете его для расчета компоновки, используйте соответствующий ViewGroup , например CoordinatorLayout или ConstraintLayout . Если вы используете его для определения высоты системной панели навигации, используйте WindowInsets . Если вы хотите узнать текущий размер окна вашего приложения, используйте computeCurrentWindowMetrics .
Ниже приведён список полей, затронутых этим изменением:
- Размеры
Configuration.screenWidthDpиscreenHeightDpбольше не исключают системные полосы. - Изменения параметров
screenWidthDpиscreenHeightDpкосвенно влияют наConfiguration.smallestScreenWidthDp. - На устройствах с почти квадратным экраном изменения параметров
screenWidthDpиscreenHeightDpкосвенно влияют наConfiguration.orientation. -
Display.getSize(Point)косвенно зависит от изменений вConfiguration. Он был объявлен устаревшим начиная с уровня API 30. -
Display.getMetrics()работает подобным образом уже с 33-го уровня API.
Атрибут elegantTextHeight по умолчанию имеет значение true.
对于以 Android 15(API 级别 35)为目标平台的应用,elegantTextHeight TextView 属性默认会变为 true,将默认使用的紧凑字体替换为一些具有较大垂直测量的脚本,使其更易于阅读。紧凑字体旨在防止布局中断;Android 13(API 级别 33)允许文本布局利用 fallbackLineSpacing 属性拉伸垂直高度,从而防止许多此类中断。
在 Android 15 中,系统中仍保留了紧凑字体,因此您的应用可以将 elegantTextHeight 设置为 false 以获得与之前相同的行为,但即将发布的版本不太可能支持此字体。因此,如果您的应用支持以下脚本:阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语,请将 elegantTextHeight 设置为 true 以测试您的应用。
elegantTextHeight 行为。
elegantTextHeight 行为。Изменение ширины TextView для сложных форм букв
В предыдущих версиях Android некоторые рукописные шрифты или языки сложной формы могли отображать буквы в области предыдущего или следующего символа. В некоторых случаях такие буквы обрезались в начальной или конечной позиции. Начиная с Android 15, TextView выделяет ширину для рисования достаточного места для таких букв и позволяет приложениям запрашивать дополнительные поля слева, чтобы предотвратить обрезку.
Поскольку это изменение влияет на то, как TextView определяет ширину, TextView по умолчанию выделяет большую ширину, если приложение предназначено для Android 15 (уровень API 35) или выше. Вы можете включить или отключить это поведение, вызвав API setUseBoundsForWidth в TextView .
Поскольку добавление левого отступа может привести к смещению существующих макетов, отступы не добавляются по умолчанию даже для приложений, ориентированных на Android 15 или более позднюю версию. Однако вы можете добавить дополнительные отступы для предотвращения обрезки, вызвав setShiftDrawingOffsetForStartOverhang .
В следующих примерах показано, как эти изменения могут улучшить макет текста для некоторых шрифтов и языков.

<TextView android:fontFamily="cursive" android:text="java" />

<TextView android:fontFamily="cursive" android:text="java" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />

<TextView android:text="คอมพิวเตอร์" />

<TextView android:text="คอมพิวเตอร์" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
Высота строки по умолчанию для EditText с учетом локали
在较低版本的 Android 中,文本布局会拉伸文本的高度,以满足与当前语言区域匹配的字体的行高。例如,如果内容是日语,由于日语字体的行高略高于拉丁字体,因此文本的高度会略高。不过,尽管行高存在这些差异,但无论使用的是哪种语言区域,EditText 元素的大小都是统一的,如下图所示:
EditText 元素。EditText 的高度相同,即使这些语言的行高各不相同。对于以 Android 15(API 级别 35)为目标平台的应用,现在为 EditText 预留了最小行高,以匹配指定语言区域的参考字体,如下图所示:
EditText 元素。EditText 的高度现在包含足够的空间来容纳这些语言字体的默认行高。如有需要,您的应用可以将 useLocalePreferredLineHeightForMinimum 属性指定为 false,以恢复之前的行为;您的应用还可以在 Kotlin 和 Java 中使用 setMinimumFontMetrics API 设置自定义最小垂直指标。
Камера и медиа
В Android 15 внесены следующие изменения в работу камеры и мультимедиа для приложений, ориентированных на Android 15 и выше.
Ограничения на запрос фокусировки звука
Приложения, предназначенные для Android 15 (уровень API 35), должны быть главным приложением или запускать службу переднего плана, чтобы запросить фокус звука . Если приложение пытается запросить фокус, хотя оно не соответствует одному из этих требований, вызов возвращает AUDIOFOCUS_REQUEST_FAILED .
Дополнительную информацию о фокусе звука можно узнать в разделе «Управление фокусом звука» .
Обновлены ограничения, не относящиеся к SDK.
В Android 15 обновлены списки ограниченных интерфейсов, не использующих SDK, на основе сотрудничества с разработчиками Android и последних внутренних тестов. По возможности мы обеспечиваем наличие общедоступных альтернатив, прежде чем ограничивать использование интерфейсов, не использующих SDK.
Если ваше приложение не ориентировано на Android 15, некоторые из этих изменений могут не сразу повлиять на него. Однако, хотя ваше приложение может получить доступ к некоторым интерфейсам, не связанным с SDK, в зависимости от целевого уровня API вашего приложения , использование любого метода или поля, не связанного с SDK, всегда сопряжено с высоким риском нарушения работы вашего приложения.
Если вы не уверены, использует ли ваше приложение интерфейсы, отличные от SDK, вы можете протестировать его , чтобы это выяснить. Если ваше приложение зависит от интерфейсов, отличных от SDK, вам следует начать планировать переход на альтернативы SDK. Тем не менее, мы понимаем, что в некоторых приложениях есть обоснованные сценарии использования интерфейсов, отличных от SDK. Если вы не можете найти альтернативу использованию интерфейса, отличного от SDK, для какой-либо функции в вашем приложении, вам следует запросить новый публичный API .
Дополнительные сведения об изменениях в этой версии Android см. в разделе Обновления ограничений интерфейса, не связанных с SDK, в Android 15 . Дополнительные сведения об интерфейсах, отличных от SDK, см. в разделе Ограничения на интерфейсы, не относящиеся к SDK .