Как и в предыдущих версиях, Android 15 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются исключительно к приложениям, предназначенным для Android 15 и более поздних версий. Если ваше приложение предназначено для Android 15 и более поздних версий, вам следует изменить его для корректной поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь со списком изменений поведения, которые влияют на все приложения, работающие на Android 15, независимо от targetSdkVersion
вашего приложения.
Основная функциональность
Android 15 изменяет или расширяет различные основные возможности системы Android.
Изменения в приоритетных службах
We are making the following changes to foreground services with Android 15.
- Data sync foreground service timeout behavior
- New media processing foreground service type
- Restrictions on
BOOT_COMPLETED
broadcast receivers launching foreground services - Restrictions on starting foreground services while an app holds the
SYSTEM_ALERT_WINDOW
permission
Data sync foreground service timeout behavior
Android 15 introduces a new timeout behavior to dataSync
for apps targeting
Android 15 (API level 35) or higher. This behavior also applies to the new
mediaProcessing
foreground service type.
The system permits an app's dataSync
services to run for a total of 6 hours
in a 24-hour period, after which the system calls the running service's
Service.onTimeout(int, int)
method (introduced in Android
15). At this time, the service has a few seconds to call
Service.stopSelf()
. When Service.onTimeout()
is called, the
service is no longer considered a foreground service. If the service does not
call Service.stopSelf()
, the system throws an internal exception. The
exception is logged in Logcat with the following message:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
To avoid problems with this behavior change, you can do one or more of the following:
- Have your service implement the new
Service.onTimeout(int, int)
method. When your app receives the callback, make sure to callstopSelf()
within a few seconds. (If you don't stop the app right away, the system generates a failure.) - Make sure your app's
dataSync
services don't run for more than a total of 6 hours in any 24-hour period (unless the user interacts with the app, resetting the timer). - Only start
dataSync
foreground services as a result of direct user interaction; since your app is in the foreground when the service starts, your service has the full six hours after the app goes to the background. - Instead of using a
dataSync
foreground service, use an alternative API.
If your app's dataSync
foreground services have run for 6 hours in the last
24, you cannot start another dataSync
foreground service unless the user
has brought your app to the foreground (which resets the timer). If you try to
start another dataSync
foreground service, the system throws
ForegroundServiceStartNotAllowedException
with an error message like "Time limit already exhausted for foreground service
type dataSync".
Testing
To test your app's behavior, you can enable data sync timeouts even if your app
is not targeting Android 15 (as long as the app is running on an Android 15
device). To enable timeouts, run the following adb
command:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
You can also adjust the timeout period, to make it easier to test how your
app behaves when the limit is reached. To set a new timeout period, run the
following adb
command:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
New media processing foreground service type
В 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
Restrictions on BOOT_COMPLETED
broadcast receivers launching foreground services
There are new restrictions on BOOT_COMPLETED
broadcast receivers launching
foreground services. BOOT_COMPLETED
receivers are not allowed to launch the
following types of foreground services:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(this restriction has been in place formicrophone
since Android 14)
If a BOOT_COMPLETED
receiver tries to launch any of those types of foreground
services, the system throws ForegroundServiceStartNotAllowedException
.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). Run the following adb
command:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
To send a BOOT_COMPLETED
broadcast without restarting the device,
run the following adb
command:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Restrictions on starting foreground services while an app holds the SYSTEM_ALERT_WINDOW
permission
Previously, if an app held the SYSTEM_ALERT_WINDOW
permission, it could launch
a foreground service even if the app was currently in the background (as
discussed in exemptions from background start restrictions).
If an app targets Android 15, this exemption is now narrower. The app now needs
to have the SYSTEM_ALERT_WINDOW
permission and also have a visible overlay
window. That is, the app needs to first launch a
TYPE_APPLICATION_OVERLAY
window and the window
needs to be visible before you start a foreground service.
If your app attempts to start a foreground service from the background without
meeting these new requirements (and it does not have some other exemption), the
system throws ForegroundServiceStartNotAllowedException
.
If your app declares the SYSTEM_ALERT_WINDOW
permission
and launches foreground services from the background, it may be affected by this
change. If your app gets a ForegroundServiceStartNotAllowedException
, check
your app's order of operations and make sure your app already has an active
overlay window before it attempts to start a foreground service from the
background. You can check if your overlay window is currently visible
by calling View.getWindowVisibility()
, or you
can override View.onWindowVisibilityChanged()
to get notified whenever the visibility changes.
Testing
To test your app's behavior, you can enable these new restrictions even if your
app is not targeting Android 15 (as long as the app is running on an Android 15
device). To enable these new restrictions on starting foreground services
from the background, run the following adb
command:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
Изменения в том, когда приложения могут изменять глобальное состояние режима «Не беспокоить»
Приложения, предназначенные для Android 15 (уровень API 35) и выше, больше не могут изменять глобальное состояние или политику режима «Не беспокоить» (DND) на устройстве (путем изменения пользовательских настроек или отключения режима «Не беспокоить»). Вместо этого приложения должны внести AutomaticZenRule
, которое система объединяет в глобальную политику с существующей схемой наиболее ограничительной политики. Вызовы к существующим API, которые ранее влияли на глобальное состояние ( setInterruptionFilter
, setNotificationPolicy
), приводят к созданию или обновлению неявного AutomaticZenRule
, который включается и выключается в зависимости от цикла вызовов этих вызовов API.
Обратите внимание, что это изменение влияет на наблюдаемое поведение только в том случае, если приложение вызывает setInterruptionFilter(INTERRUPTION_FILTER_ALL)
и ожидает, что этот вызов деактивирует AutomaticZenRule
, который ранее был активирован его владельцами.
Изменения API OpenJDK
Android 15 продолжает работу по обновлению основных библиотек Android для приведения их в соответствие с функциями последних выпусков OpenJDK LTS.
Некоторые из этих изменений могут повлиять на совместимость приложений для Android 15 (уровень API 35):
Изменения в API форматирования строк : Проверка индекса аргумента, флагов, ширины и точности теперь более строгая при использовании следующих API
String.format()
иFormatter.format()
:-
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]);
Изменения в обработке языковых кодов : при использовании
Locale
API языковые коды иврита, идиша и индонезийского языка больше не преобразуются в устаревшие формы (иврит:iw
, идиш:ji
и индонезийский:in
). При указании языкового кода для одной из этих локалей вместо этого используйте коды из ISO 639-1 (иврит:he
, идиш:yi
и индонезийский:id
).Изменения в случайных последовательностях целых чисел : после изменений, внесенных в https://bugs.openjdk.org/browse/JDK-8301574 , следующие методы
Random.ints()
теперь возвращают другую последовательность чисел, чем методыRandom.nextInt()
:Как правило, это изменение не должно приводить к нарушению работы приложения, но ваш код не должен ожидать, что последовательность, сгенерированная методами
Random.ints()
, будет соответствоватьRandom.nextInt()
.
Новый API SequencedCollection
может повлиять на совместимость вашего приложения после обновления compileSdk
в конфигурации сборки вашего приложения для использования Android 15 (уровень API 35) :
Столкновение с функциями расширения
MutableList.removeFirst()
иMutableList.removeLast()
вkotlin-stdlib
Тип
List
в Java сопоставлен с типомMutableList
в Kotlin. Поскольку APIList.removeFirst()
иList.removeLast()
появились в Android 15 (уровень API 35), компилятор Kotlin статически разрешает вызовы функций, например,list.removeFirst()
, в новые APIList
, а не в функции расширения изkotlin-stdlib
.Если приложение перекомпилировано с
compileSdk
, установленным на35
, иminSdk
установленным на34
или ниже, а затем запущено на Android 14 и ниже, возникает ошибка времени выполнения:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
Существующая опция lint
NewApi
в плагине Android Gradle может отследить эти новые случаи использования API../gradlew lint
MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()Чтобы исправить исключение времени выполнения и ошибки линтинга, вызовы функций
removeFirst()
иremoveLast()
в Kotlin можно заменить наremoveAt(0)
иremoveAt(list.lastIndex)
соответственно. Если вы используете Android Studio Ladybug | 2024.1.3 или более позднюю версию, она также предоставляет возможность быстрого исправления этих ошибок.Рассмотрите возможность удаления
@SuppressLint("NewApi")
иlintOptions { disable 'NewApi' }
если опция lint была отключена.Столкновение с другими методами в Java
В существующие типы, например,
List
иDeque
, были добавлены новые методы. Эти новые методы могут быть несовместимы с методами с теми же именами и типами аргументов в других интерфейсах и классах. В случае конфликта сигнатур методов и несовместимости компиляторjavac
выводит ошибку во время сборки. Например:Пример ошибки 1:
javac MyList.java
MyList.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.java
MyList.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.java
MyList.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Чтобы исправить эти ошибки сборки, класс, реализующий эти интерфейсы, должен переопределить метод, указав совместимый тип возвращаемого значения. Например:
@Override public Object getFirst() { return List.super.getFirst(); }
Безопасность
В Android 15 включены изменения, повышающие безопасность системы и помогающие защитить приложения и пользователей от вредоносных приложений.
Ограниченные версии TLS
Android 15 ограничивает использование TLS версий 1.0 и 1.1. Эти версии ранее были признаны устаревшими в Android, но теперь запрещены для приложений, ориентированных на Android 15.
Защищенные запуски фоновой активности
Android 15 protects users from malicious apps and gives them more control over their devices by adding changes that prevent malicious background apps from bringing other apps to the foreground, elevating their privileges, and abusing user interaction. Background activity launches have been restricted since Android 10 (API level 29).
Other changes
In addition to the restriction for UID matching, these other changes are also included:
- Change
PendingIntent
creators to block background activity launches by default. This helps prevent apps from accidentally creating aPendingIntent
that could be abused by malicious actors. - Don't bring an app to the foreground unless the
PendingIntent
sender allows it. This change aims to prevent malicious apps from abusing the ability to start activities in the background. By default, apps are not allowed to bring the task stack to the foreground unless the creator allows background activity launch privileges or the sender has background activity launch privileges. - Control how the top activity of a task stack can finish its task. If the top activity finishes a task, Android will go back to whichever task was last active. Moreover, if a non-top activity finishes its task, Android will go back to the home screen; it won't block the finish of this non-top activity.
- Prevent launching arbitrary activities from other apps into your own task. This change prevents malicious apps from phishing users by creating activities that appear to be from other apps.
- Block non-visible windows from being considered for background activity launches. This helps prevent malicious apps from abusing background activity launches to display unwanted or malicious content to users.
Более безопасные намерения
В Android 15 представлены новые дополнительные меры безопасности, которые делают действия более безопасными и надежными. Эти изменения направлены на предотвращение потенциальных уязвимостей и неправомерного использования намерений, которые могут быть использованы вредоносными приложениями. В Android 15 есть два основных улучшения безопасности намерений:
- Соответствие целевым фильтрам намерений: намерения, нацеленные на определенные компоненты, должны точно соответствовать спецификациям целевого фильтра намерений. Если вы отправляете намерение запустить действие другого приложения, целевой компонент намерения должен согласовываться с объявленными фильтрами намерений принимающего действия.
- Намерения должны иметь действия: намерения без действия больше не будут соответствовать никаким фильтрам намерений. Это означает, что намерения, используемые для запуска действий или служб, должны иметь четко определенное действие.
Котлин
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Ява
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
В Android 15 представлены новые дополнительные меры безопасности, которые делают действия более безопасными и надежными. Эти изменения направлены на предотвращение потенциальных уязвимостей и неправомерного использования намерений, которые могут быть использованы вредоносными приложениями. В Android 15 есть два основных улучшения безопасности намерений:
- Соответствие целевым фильтрам намерений: намерения, нацеленные на определенные компоненты, должны точно соответствовать спецификациям целевого фильтра намерений. Если вы отправляете намерение запустить действие другого приложения, целевой компонент намерения должен согласовываться с объявленными фильтрами намерений принимающего действия.
- Намерения должны иметь действия: намерения без действия больше не будут соответствовать никаким фильтрам намерений. Это означает, что намерения, используемые для запуска действий или служб, должны иметь четко определенное действие.
Котлин
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Ява
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
В Android 15 представлены новые дополнительные меры безопасности, которые делают действия более безопасными и надежными. Эти изменения направлены на предотвращение потенциальных уязвимостей и неправомерного использования намерений, которые могут быть использованы вредоносными приложениями. В Android 15 есть два основных улучшения безопасности намерений:
- Соответствие целевым фильтрам намерений: намерения, нацеленные на определенные компоненты, должны точно соответствовать спецификациям целевого фильтра намерений. Если вы отправляете намерение запустить действие другого приложения, целевой компонент намерения должен согласовываться с объявленными фильтрами намерений принимающего действия.
- Намерения должны иметь действия: намерения без действия больше не будут соответствовать никаким фильтрам намерений. Это означает, что намерения, используемые для запуска действий или служб, должны иметь четко определенное действие.
Котлин
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Ява
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
Пользовательский опыт и системный пользовательский интерфейс
В Android 15 внесены некоторые изменения, направленные на создание более последовательного и интуитивно понятного пользовательского опыта.
Изменения в оконной вставке
There are two changes related to window insets in Android 15: edge-to-edge is enforced by default, and there are also configuration changes, such as the default configuration of system bars.
Комплексное обеспечение соблюдения требований
Приложения по умолчанию являются безрамочными на устройствах под управлением 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), а также до и после применения вставок.



Что нужно проверить, если ваше приложение уже развернуто на всех устройствах
Если ваше приложение уже развернуто от края до края и использует вставки, то, как правило, это не повлияет на вас, за исключением следующих случаев. Однако, даже если вы считаете, что это не повлияет, мы рекомендуем вам протестировать приложение.
- У вас есть неплавающее окно, например
Activity
, которое используетSHORT_EDGES
,NEVER
илиDEFAULT
вместоLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
. Если ваше приложение вылетает при запуске, это может быть связано с заставкой. Вы можете обновить основную зависимость заставки до 1.2.0-alpha01 или более поздней, либо установитьwindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
. - Возможно, есть экраны с низкой посещаемостью и перекрытым пользовательским интерфейсом. Убедитесь, что на этих экранах с низкой посещаемостью пользовательский интерфейс не перекрыт. К экранам с низкой посещаемостью относятся:
- Экраны регистрации и входа в систему
- Страницы настроек
Что проверить, если ваше приложение еще не является полноэкранным
Если ваше приложение ещё не является полноэкранным, скорее всего, вы пострадаете. Помимо сценариев для полноэкранных приложений, вам следует учесть следующее:
- Если ваше приложение использует компоненты Material 3 (
androidx.compose.material3
) в компоновке, такие как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
, обрабатывают вставки и не требуют дополнительных действий. Однако при использованииAppBarLayout
необходимо добавитьandroid:fitsSystemWindows="true"
. - Для пользовательских компонуемых элементов отступы можно задать вручную в качестве отступов. Если ваш контент находится в
Scaffold
, вы можете использовать отступы, используя значения отступовScaffold
. В противном случае отступы можно задать с помощью одного изWindowInsets
. - Если ваше приложение использует представления и
BottomSheet
,SideSheet
или пользовательские контейнеры, задайте отступы с помощьюViewCompat.setOnApplyWindowInsetsListener
. ДляRecyclerView
задайте отступы с помощью этого прослушивателя, а также добавьтеclipToPadding="false"
.
Что нужно проверить, если ваше приложение должно предлагать настраиваемую фоновую защиту
Если ваше приложение должно предлагать настраиваемую защиту фона для 3-кнопочной навигации или строки состояния, ваше приложение должно разместить компонуемый элемент или представление за системной панелью, используя WindowInsets.Type#tappableElement()
для получения высоты 3-кнопочной панели навигации или WindowInsets.Type#statusBars
.
Дополнительные ресурсы Edge-to-Edge
Дополнительную информацию о применении вставок см. в руководствах Edge to Edge Views и Edge to Edge Compose.
Устаревшие API
Следующие API устарели, но не отключены:
-
R.attr#enforceStatusBarContrast
-
R.attr#navigationBarColor
(для навигации с тремя кнопками, с альфа-каналом 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
больше не исключают системные панели. -
Configuration.smallestScreenWidthDp
косвенно влияют измененияscreenWidthDp
иscreenHeightDp
. -
Configuration.orientation
косвенно влияют измененияscreenWidthDp
иscreenHeightDp
на устройствах с экранами, близкими к квадратным. - Изменения в
Configuration
косвенно затрагиваютDisplay.getSize(Point)
. Этот метод устарел, начиная с API уровня 30. -
Display.getMetrics()
работает таким образом, начиная с API уровня 33.
Атрибут elegantTextHeight по умолчанию имеет значение true
For apps targeting Android 15 (API level 35), the
elegantTextHeight
TextView
attribute
becomes true
by default, replacing the compact font used by default with some
scripts that have large vertical metrics with one that is much more readable.
The compact font was introduced to prevent breaking layouts; Android 13 (API
level 33) prevents many of these breakages by allowing the text layout to
stretch the vertical height utilizing the fallbackLineSpacing
attribute.
In Android 15, the compact font still remains in the system, so your app can set
elegantTextHeight
to false
to get the same behavior as before, but it is
unlikely to be supported in upcoming releases. So, if your app supports the
following scripts: Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam,
Odia, Telugu or Thai, test your app by setting elegantTextHeight
to true
.

elegantTextHeight
behavior for apps targeting Android 14 (API level 34) and lower.
elegantTextHeight
behavior for apps targeting Android 15.Изменение ширины TextView для сложных форм букв
In previous versions of Android, some cursive fonts or languages that have
complex shaping might draw the letters in the previous or next character's area.
In some cases, such letters were clipped at the beginning or ending position.
Starting in Android 15, a TextView
allocates width for drawing enough space
for such letters and allows apps to request extra paddings to the left to
prevent clipping.
Because this change affects how a TextView
decides the width, TextView
allocates more width by default if the app targets Android 15 (API level 35) or
higher. You can enable or disable this behavior by calling the
setUseBoundsForWidth
API on TextView
.
Because adding left padding might cause a misalignment for existing layouts, the
padding is not added by default even for apps that target Android 15 or higher.
However, you can add extra padding to preventing clipping by calling
setShiftDrawingOffsetForStartOverhang
.
The following examples show how these changes can improve text layout for some fonts and languages.

<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
, которые могут содержать текст на английском (en), японском (ja) и бирманском (my). Высота EditText
одинакова, хотя эти языки имеют разную высоту строк. Для приложений, ориентированных на Android 15 (уровень API 35), минимальная высота строки теперь зарезервирована для EditText
, чтобы соответствовать эталонному шрифту для указанного языкового стандарта, как показано на следующем изображении:

EditText
, которые могут содержать текст на английском (en), японском (ja) и бирманском (my). Высота EditText
теперь включает пространство для размещения высоты строки по умолчанию для шрифтов этих языков. При необходимости ваше приложение может восстановить предыдущее поведение, указав для атрибута useLocalePreferredLineHeightForMinimum
значение false
, а ваше приложение может установить собственные минимальные вертикальные метрики с помощью API setMinimumFontMetrics
в Kotlin и Java.
Камера и медиа
Android 15 вносит следующие изменения в поведение камеры и мультимедиа для приложений, предназначенных для Android 15 или более поздних версий.
Ограничения на запрос аудиофокуса
Приложения, предназначенные для Android 15 (уровень API 35), должны быть главным приложением или запускать службу переднего плана, чтобы запросить фокус звука . Если приложение пытается запросить фокус, хотя оно не соответствует одному из этих требований, вызов возвращает AUDIOFOCUS_REQUEST_FAILED
.
Дополнительную информацию о фокусе звука можно узнать в разделе «Управление фокусом звука» .
Обновлены ограничения, не связанные с SDK
Android 15 includes updated lists of restricted non-SDK interfaces based on collaboration with Android developers and the latest internal testing. Whenever possible, we make sure that public alternatives are available before we restrict non-SDK interfaces.
If your app does not target Android 15, some of these changes might not immediately affect you. However, while it's possible for your app to access some non-SDK interfaces depending on your app's target API level, using any non-SDK method or field always carries a high risk of breaking your app.
If you are unsure if your app uses non-SDK interfaces, you can test your app to find out. If your app relies on non-SDK interfaces, you should begin planning a migration to SDK alternatives. Nevertheless, we understand that some apps have valid use cases for using non-SDK interfaces. If you can't find an alternative to using a non-SDK interface for a feature in your app, you should request a new public API.
Дополнительные сведения об изменениях в этой версии Android см. в разделе Обновления ограничений интерфейса, не связанных с SDK, в Android 15 . Дополнительные сведения об интерфейсах, отличных от SDK, см. в разделе Ограничения на интерфейсы, не относящиеся к SDK .