Wie bei früheren Releases enthält Android 15 Verhaltensänderungen, die sich auf Ihre App auswirken können. Die folgenden Verhaltensänderungen gelten ausschließlich für Apps, die auf Android 15 oder höher ausgerichtet sind. Wenn Ihre App auf Android 15 oder höher ausgerichtet ist, sollten Sie sie gegebenenfalls so ändern, dass sie diese Verhaltensweisen korrekt unterstützt.
Lesen Sie sich auch die Liste der Verhaltensänderungen durch, die sich auf alle Apps auswirken, die unter Android 15 ausgeführt werden, unabhängig von der targetSdkVersion
Ihrer App.
Hauptfunktion
In Android 15 wurden verschiedene Kernfunktionen des Android-Systems geändert oder erweitert.
Änderungen an Diensten im Vordergrund
Mit Android 15 nehmen wir die folgenden Änderungen an Diensten im Vordergrund vor.
- Verhalten bei Zeitüberschreitung des Diensts „Datensynchronisierung im Vordergrund“
- Neuer Typ für Dienste im Vordergrund zur Medienverarbeitung
- Einschränkungen für
BOOT_COMPLETED
-Übertragungsempfänger, die Dienste im Vordergrund starten - Einschränkungen beim Starten von Diensten im Vordergrund, während eine App die Berechtigung
SYSTEM_ALERT_WINDOW
hat
Zeitüberschreitung des Diensts „Datensynchronisierung im Vordergrund“
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
Neuer Typ für Dienste im Vordergrund zur Medienverarbeitung
Android 15 introduces a new foreground service type, mediaProcessing
. This
service type is appropriate for operations like transcoding media files. For
example, a media app might download an audio file and need to convert it to a
different format before playing it. You can use a mediaProcessing
foreground
service to make sure the conversion continues even while the app is in the
background.
The system permits an app's mediaProcessing
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()
. 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 mediaProcessing did not stop within its timeout: [component name]"
To avoid having the exception, you can do one 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
mediaProcessing
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
mediaProcessing
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
mediaProcessing
foreground service, use an alternative API, like WorkManager.
If your app's mediaProcessing
foreground services have run for 6 hours in the
last 24, you cannot start another mediaProcessing
foreground service unless
the user has brought your app to the foreground (which resets the timer). If you
try to start another mediaProcessing
foreground service, the system throws
ForegroundServiceStartNotAllowedException
with an error message like "Time limit already exhausted for foreground service
type mediaProcessing".
For more information about the mediaProcessing
service type, see Changes to
foreground service types for Android 15: Media processing.
Testing
To test your app's behavior, you can enable media processing 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 media_processing_fgs_timeout_duration duration-in-milliseconds
Einschränkungen für BOOT_COMPLETED
-Übertragungsempfänger, die Dienste im Vordergrund starten
Es gelten neue Einschränkungen für die Einführung von BOOT_COMPLETED
Übertragungsempfängern
Dienste im Vordergrund. BOOT_COMPLETED
Empfänger dürfen nicht Folgendes starten:
folgende Arten von Diensten im Vordergrund:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(Diese Einschränkung gilt seit demmicrophone
fürmicrophone
Android 14)
Wenn ein BOOT_COMPLETED
-Empfänger versucht, einen dieser Dienste im Vordergrund zu starten, löst das System ForegroundServiceStartNotAllowedException
aus.
Testen
Um das Verhalten Ihrer App zu testen, können Sie diese neuen Einschränkungen auch dann aktivieren, wenn Ihre
Die App ist nicht auf Android 15 ausgerichtet (solange die App auf einem Android 15 ausgeführt wird)
Gerät). Führen Sie den folgenden adb
-Befehl aus:
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
Wenn Sie eine BOOT_COMPLETED
-Broadcastnachricht senden möchten, ohne das Gerät neu zu starten, führen Sie den folgenden Befehl adb
aus:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
Einschränkungen beim Starten von Diensten im Vordergrund, während eine App die Berechtigung SYSTEM_ALERT_WINDOW
hat
Bisher konnte eine App mit der Berechtigung SYSTEM_ALERT_WINDOW
einen Dienst im Vordergrund starten, auch wenn sie sich gerade im Hintergrund befand (wie unter Ausnahmen von Einschränkungen beim Starten im Hintergrund beschrieben).
Wenn eine App auf Android 15 ausgerichtet ist, ist diese Ausnahme jetzt eingeschränkter. Die App benötigt jetzt die Berechtigung SYSTEM_ALERT_WINDOW
und auch ein sichtbares Overlay-Fenster. Das bedeutet, dass die App zuerst ein TYPE_APPLICATION_OVERLAY
-Fenster öffnen und das Fenster sichtbar sein muss, bevor Sie einen Dienst im Vordergrund starten.
Wenn Ihre App versucht, einen Dienst im Vordergrund aus dem Hintergrund zu starten, ohne diese neuen Anforderungen zu erfüllen (und keine andere Ausnahme vorliegt), löst das System ForegroundServiceStartNotAllowedException
aus.
Wenn Ihre App die Berechtigung SYSTEM_ALERT_WINDOW
deklariert und Dienste im Vordergrund aus dem Hintergrund startet, kann sich diese Änderung auf Ihre App auswirken. Wenn deine App eine ForegroundServiceStartNotAllowedException
erhält, prüfe die Reihenfolge der Vorgänge in deiner App und achte darauf, dass deine App bereits ein aktives Overlay-Fenster hat, bevor sie versucht, einen Dienst im Vordergrund im Hintergrund zu starten. Du kannst mit View.getWindowVisibility()
prüfen, ob dein Overlay-Fenster gerade sichtbar ist. Du kannst auch View.onWindowVisibilityChanged()
überschreiben, um benachrichtigt zu werden, wenn sich die Sichtbarkeit ändert.
Testen
Um das Verhalten deiner App zu testen, kannst du diese neuen Einschränkungen auch dann aktivieren, wenn deine App nicht auf Android 15 ausgerichtet ist, solange sie auf einem Android 15-Gerät ausgeführt wird. Wenn Sie diese neuen Einschränkungen für den Start von Diensten im Vordergrund aus dem Hintergrund aktivieren möchten, führen Sie den folgenden adb
-Befehl aus:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
Änderungen bei der Möglichkeit für Apps, den globalen Status des Modus „Bitte nicht stören“ zu ändern
Apps that target Android 15 (API level 35) and higher can no longer change the
global state or policy of Do Not Disturb (DND) on a device (either by modifying
user settings, or turning off DND mode). Instead, apps must contribute an
AutomaticZenRule
, which the system combines into a global policy with the
existing most-restrictive-policy-wins scheme. Calls to existing APIs that
previously affected global state (setInterruptionFilter
,
setNotificationPolicy
) result in the creation or update of an implicit
AutomaticZenRule
, which is toggled on and off depending on the call-cycle of
those API calls.
Note that this change only affects observable behavior if the app is calling
setInterruptionFilter(INTERRUPTION_FILTER_ALL)
and expects that call to
deactivate an AutomaticZenRule
that was previously activated by their owners.
Änderungen an der OpenJDK API
In Android 15 werden die Kernbibliotheken von Android weiter aktualisiert, um sie an die Funktionen der neuesten OpenJDK-LTS-Releases anzupassen.
Einige dieser Änderungen können sich auf die App-Kompatibilität für Apps auswirken, die auf Android 15 (API-Level 35) ausgerichtet sind:
Änderungen an APIs für die Stringformatierung: Die Validierung von Argumentindex, Flags, Breite und Genauigkeit ist jetzt bei der Verwendung der folgenden
String.format()
- undFormatter.format()
-APIs strenger:String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
Beispielsweise wird die folgende Ausnahme geworfen, wenn der Argumentindex 0 verwendet wird (
%0
im Formatstring):IllegalFormatArgumentIndexException: Illegal format argument index = 0
In diesem Fall kann das Problem durch Verwendung eines Argumentindexes von 1 (
%1
im Formatstring) behoben werden.Änderungen am Komponententyp von
Arrays.asList(...).toArray()
: Bei Verwendung vonArrays.asList(...).toArray()
ist der Komponententyp des resultierenden Arrays jetzt einObject
– nicht der Typ der Elemente des zugrunde liegenden Arrays. Der folgende Code führt daher zu einemClassCastException
:String[] elements = (String[]) Arrays.asList("one", "two").toArray();
Wenn Sie in diesem Fall
String
als Komponententyp im resultierenden Array beibehalten möchten, können Sie stattdessenCollection.toArray(Object[])
verwenden:String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
Änderungen bei der Verarbeitung von Sprachcodes: Bei der Verwendung der
Locale
API werden Sprachcodes für Hebräisch, Jiddisch und Indonesisch nicht mehr in ihre veralteten Formen umgewandelt (Hebräisch:iw
, Jiddisch:ji
und Indonesisch:in
). Geben Sie den Sprachcode für eine dieser Sprachen stattdessen als ISO 639-1-Code an (Hebräisch:he
, Jiddisch:yi
und Indonesisch:id
).Änderungen an Zufallszahlenfolgen: Aufgrund der Änderungen unter https://bugs.openjdk.org/browse/JDK-8301574 geben die folgenden
Random.ints()
-Methoden jetzt eine andere Zahlenfolge zurück als dieRandom.nextInt()
-Methoden:Im Allgemeinen sollte diese Änderung nicht zu einem Absturz der App führen. Ihr Code sollte jedoch nicht davon ausgehen, dass die von
Random.ints()
-Methoden generierte Sequenz mitRandom.nextInt()
übereinstimmt.
Die neue SequencedCollection
API kann sich auf die Kompatibilität Ihrer App auswirken, nachdem Sie compileSdk
in der Build-Konfiguration Ihrer App auf Android 15 (API-Level 35) aktualisiert haben:
Überschneidung mit den Erweiterungsfunktionen
MutableList.removeFirst()
undMutableList.removeLast()
inkotlin-stdlib
Der Typ
List
in Java wird dem TypMutableList
in Kotlin zugeordnet. Da die APIsList.removeFirst()
undList.removeLast()
in Android 15 (API-Ebene 35) eingeführt wurden, löst der Kotlin-Compiler Funktionsaufrufe wielist.removeFirst()
statisch auf die neuenList
APIs statt auf die Erweiterungsfunktionen inkotlin-stdlib
auf.Wenn eine App neu kompiliert wird, wobei
compileSdk
auf35
undminSdk
auf34
oder niedriger festgelegt ist, und dann auf Android 14 oder niedriger ausgeführt wird, wird ein Laufzeitfehler ausgegeben:java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
Mit der vorhandenen
NewApi
-Lint-Option im Android Gradle-Plug-in können diese neuen API-Nutzungen erkannt werden../gradlew lint
MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()Um die Laufzeitausnahme und die Lint-Fehler zu beheben, können die Funktionsaufrufe
removeFirst()
undremoveLast()
in Kotlin durchremoveAt(0)
undremoveAt(list.lastIndex)
ersetzt werden. Wenn Sie Android Studio Ladybug | 2024.1.3 oder höher verwenden, gibt es auch eine Option zur Schnellkorrektur dieser Fehler.Entfernen Sie
@SuppressLint("NewApi")
undlintOptions { disable 'NewApi' }
, wenn die Lint-Option deaktiviert wurde.Überschneidung mit anderen Methoden in Java
Den vorhandenen Typen wurden neue Methoden hinzugefügt, z. B.
List
undDeque
. Diese neuen Methoden sind möglicherweise nicht mit den Methoden mit demselben Namen und denselben Argumenttypen in anderen Schnittstellen und Klassen kompatibel. Bei einer Kollision der Methodensignatur mit Inkompatibilität gibt derjavac
-Compiler einen Buildzeitfehler aus. Beispiel:Beispiel für Fehler 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 ListBeispiel für Fehlermeldung 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 errorBeispiel für Fehler 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 errorUm diese Buildfehler zu beheben, sollte die Klasse, die diese Schnittstellen implementiert, die Methode mit einem kompatiblen Rückgabetyp überschreiben. Beispiel:
@Override public Object getFirst() { return List.super.getFirst(); }
Sicherheit
Android 15 enthält Änderungen, die die Systemsicherheit verbessern und Apps und Nutzer vor schädlichen Apps schützen sollen.
Eingeschränkt zulässige TLS-Versionen
Android 15 restricts the usage of TLS versions 1.0 and 1.1. These versions had previously been deprecated in Android, but are now disallowed for apps targeting Android 15.
Start von sicheren Hintergrundaktivitäten
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.
Sicherere Intents
Android 15 introduces new optional security measures to make intents safer and more robust. These changes are aimed at preventing potential vulnerabilities and misuse of intents that can be exploited by malicious apps. There are two main improvements to the security of intents in Android 15:
- Match target intent-filters: Intents that target specific components must accurately match the target's intent-filter specifications. If you send an intent to launch another app's activity, the target intent component needs to align with the receiving activity's declared intent-filters.
- Intents must have actions: Intents without an action will no longer match any intent-filters. This means that intents used to start activities or services must have a clearly defined action.
In order to check how your app responds to these changes, use
StrictMode
in your app. To see detailed
logs about Intent
usage violations, add the following method:
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Java
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
Nutzerfreundlichkeit und System-UI
Android 15 enthält einige Änderungen, die für eine einheitlichere und intuitivere Nutzererfahrung sorgen sollen.
Änderungen am Fenstereinsatz
In Android 15 gibt es zwei Änderungen im Zusammenhang mit Fenstereinblendungen: Vollbild wird standardmäßig erzwungen. Außerdem gibt es Konfigurationsänderungen, z. B. an der Standardkonfiguration der Systemleisten.
Edge-to-edge enforcement
Apps are edge-to-edge by default on devices running Android 15 if the app is targeting Android 15 (API level 35).

This is a breaking change that might negatively impact your app's UI. The changes affect the following UI areas:
- Gesture handle navigation bar
- Transparent by default.
- Bottom offset is disabled so content draws behind the system navigation bar unless insets are applied.
setNavigationBarColor
andR.attr#navigationBarColor
are deprecated and don't affect gesture navigation.setNavigationBarContrastEnforced
andR.attr#navigationBarContrastEnforced
continue to have no effect on gesture navigation.
- 3-button navigation
- Opacity set to 80% by default, with color possibly matching the window background.
- Bottom offset disabled so content draws behind the system navigation bar unless insets are applied.
setNavigationBarColor
andR.attr#navigationBarColor
are set to match the window background by default. The window background must be a color drawable for this default to apply. This API is deprecated but continues to affect 3-button navigation.setNavigationBarContrastEnforced
andR.attr#navigationBarContrastEnforced
is true by default, which adds an 80% opaque background across 3-button navigation.
- Status bar
- Transparent by default.
- The top offset is disabled so content draws behind the status bar unless insets are applied.
setStatusBarColor
andR.attr#statusBarColor
are deprecated and have no effect on Android 15.setStatusBarContrastEnforced
andR.attr#statusBarContrastEnforced
are deprecated but still have an effect on Android 15.
- Display cutout
layoutInDisplayCutoutMode
of non-floating windows must beLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
.SHORT_EDGES
,NEVER
, andDEFAULT
are interpreted asALWAYS
so that users don't see a black bar caused by the display cutout and appear edge-to-edge.
The following example shows an app before and after targeting Android 15 (API level 35), and before and after applying insets.



What to check if your app is already edge-to-edge
If your app is already edge-to-edge and applies insets, you are mostly unimpacted, except in the following scenarios. However, even if you think you aren't impacted, we recommend you test your app.
- You have a non-floating window, such as an
Activity
that usesSHORT_EDGES
,NEVER
orDEFAULT
instead ofLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
. If your app crashes on launch, this might be due to your splashscreen. You can either upgrade the core splashscreen dependency to 1.2.0-alpha01 or later or setwindow.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
. - There might be lower-traffic screens with occluded UI. Verify these
less-visited screens don't have occluded UI. Lower-traffic screens include:
- Onboarding or sign-in screens
- Settings pages
What to check if your app is not already edge-to-edge
If your app is not already edge-to-edge, you are most likely impacted. In addition to the scenarios for apps that are already edge-to-edge, you should consider the following:
- If your app uses Material 3 Components (
androidx.compose.material3
) in compose, such asTopAppBar
,BottomAppBar
, andNavigationBar
, these components are likely not impacted because they automatically handle insets. - If your app is using Material 2 Components (
androidx.compose.material
) in Compose, these components don't automatically handle insets. However, you can get access to the insets and apply them manually. In androidx.compose.material 1.6.0 and later, use thewindowInsets
parameter to apply the insets manually forBottomAppBar
,TopAppBar
,BottomNavigation
, andNavigationRail
. Likewise, use thecontentWindowInsets
parameter forScaffold
. - If your app uses views and Material Components
(
com.google.android.material
), most views-based Material Components such asBottomNavigationView
,BottomAppBar
,NavigationRailView
, orNavigationView
, handle insets and require no additional work. However, you need to addandroid:fitsSystemWindows="true"
if usingAppBarLayout
. - For custom composables, apply the insets manually as padding. If your
content is within a
Scaffold
, you can consume insets using theScaffold
padding values. Otherwise, apply padding using one of theWindowInsets
. - If your app is using views and
BottomSheet
,SideSheet
or custom containers, apply padding usingViewCompat.setOnApplyWindowInsetsListener
. ForRecyclerView
, apply padding using this listener and also addclipToPadding="false"
.
What to check if your app must offer custom background protection
If your app must offer custom background protection to 3-button navigation or
the status bar, your app should place a composable or view behind the system bar
using WindowInsets.Type#tappableElement()
to get the 3-button
navigation bar height or WindowInsets.Type#statusBars
.
Additional edge-to-edge resources
See the Edge to Edge Views and Edge to Edge Compose guides for additional considerations on applying insets.
Deprecated APIs
The following APIs are deprecated but not disabled:
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
(for 3 button navigation, with 80% alpha)Window#isStatusBarContrastEnforced
Window#setNavigationBarColor
(for 3 button navigation, with 80% alpha)Window#setStatusBarContrastEnforced
The following APIs are deprecated and disabled:
R.attr#navigationBarColor
(for gesture navigation)R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#setDecorFitsSystemWindows
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#setNavigationBarColor
(for gesture navigation)Window#setNavigationBarDividerColor
Window#setStatusBarColor
Stable configuration
If your app targets Android 15 (API level 35) or higher, Configuration
no
longer excludes the system bars. If you use the screen size in the
Configuration
class for layout calculation, you should replace it with better
alternatives like an appropriate ViewGroup
, WindowInsets
, or
WindowMetricsCalculator
depending on your need.
Configuration
has been available since API 1. It is typically obtained from
Activity.onConfigurationChanged
. It provides information like window density,
orientation, and sizes. One important characteristic about the window sizes
returned from Configuration
is that it previously excluded the system bars.
The configuration size is typically used for resource selection, such as
/res/layout-h500dp
, and this is still a valid use case. However, using it for
layout calculation has always been discouraged. If you do so, you should move
away from it now. You should replace the use of Configuration
with something
more suitable depending on your use case.
If you use it to calculate the layout, use an appropriate ViewGroup
, such as
CoordinatorLayout
or ConstraintLayout
. If you use it to determine the height
of the system navbar, use WindowInsets
. If you want to know the current size
of your app window, use computeCurrentWindowMetrics
.
The following list describes the fields affected by this change:
Configuration.screenWidthDp
andscreenHeightDp
sizes no longer exclude the system bars.Configuration.smallestScreenWidthDp
is indirectly affected by changes toscreenWidthDp
andscreenHeightDp
.Configuration.orientation
is indirectly affected by changes toscreenWidthDp
andscreenHeightDp
on close-to-square devices.Display.getSize(Point)
is indirectly affected by the changes inConfiguration
. This was deprecated beginning in API level 30.Display.getMetrics()
has already worked like this since API level 33.
Das Attribut „elegantTextHeight“ hat standardmäßig den Wert „true“.
Bei Apps, die auf Android 15 (API-Level 35) ausgerichtet sind, wird das Attribut elegantTextHeight
TextView
standardmäßig in true
geändert. Dadurch wird die standardmäßig verwendete kompakte Schriftart durch eine Schriftart mit größeren vertikalen Maßen ersetzt, die viel besser lesbar ist.
Die kompakte Schrift wurde eingeführt, um Layouts zu vermeiden. Android 13 (API-Ebene 33) verhindert viele dieser Unterbrechungen, indem das Textlayout die vertikale Höhe mithilfe des Attributs fallbackLineSpacing
maximieren kann.
In Android 15 ist die kompakte Schrift weiterhin im System vorhanden. Sie können in Ihrer App also elegantTextHeight
auf false
festlegen, um das bisherige Verhalten beizubehalten. Es ist jedoch unwahrscheinlich, dass sie in zukünftigen Releases unterstützt wird. Wenn Ihre App die folgenden Schriftarten unterstützt: Arabisch, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Oriya, Telugu oder Thai, testen Sie Ihre App, indem Sie elegantTextHeight
auf true
setzen.

elegantTextHeight
-Verhalten für Apps, die auf Android 14 (API-Level 34) und niedriger ausgerichtet sind.
elegantTextHeight
-Verhalten für Apps, die auf Android 15 ausgerichtet sind.Breite des TextViews ändert sich bei komplexen Buchstabenformen
In früheren Android-Versionen wurden bei einigen Schriftarten mit Kurrentschrift oder Sprachen mit komplexer Schriftbildgestaltung die Buchstaben möglicherweise im Bereich des vorherigen oder nächsten Zeichens gezeichnet.
In einigen Fällen wurden solche Buchstaben am Anfang oder Ende abgeschnitten.
Ab Android 15 weist eine TextView
eine Breite zu, um genügend Platz für solche Buchstaben zu erhalten. Außerdem können Apps auf der linken Seite zusätzliche Abstände anfordern, um das Abschneiden zu verhindern.
Da sich diese Änderung darauf auswirkt, wie TextView
die Breite festlegt, weist TextView
standardmäßig mehr Breite zu, wenn die App auf Android 15 (API-Level 35) oder höher ausgerichtet ist. Sie können dieses Verhalten aktivieren oder deaktivieren, indem Sie die setUseBoundsForWidth
API auf TextView
aufrufen.
Da das Hinzufügen eines linken Abstands zu einer Fehlausrichtung bestehender Layouts führen kann, wird der Abstand auch bei Apps, die auf Android 15 oder höher ausgerichtet sind, nicht standardmäßig hinzugefügt.
Sie können jedoch zusätzliche Abstände hinzufügen, um ein Abschneiden zu verhindern. Rufen Sie dazu setShiftDrawingOffsetForStartOverhang
auf.
Die folgenden Beispiele zeigen, wie sich diese Änderungen auf das Textlayout für bestimmte Schriftarten und Sprachen auswirken können.

<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" />
Localespezifische Standardzeilenhöhe für EditText
In previous versions of Android, the text layout stretched the height of the
text to meet the line height of the font that matched the current locale. For
example, if the content was in Japanese, because the line height of the Japanese
font is slightly larger than the one of a Latin font, the height of the text
became slightly larger. However, despite these differences in line heights, the
EditText
element was sized uniformly, regardless
of the locale being used, as illustrated in the following image:

EditText
elements that
can contain text from English (en), Japanese (ja), and Burmese (my). The
height of the EditText
is the same, even though these languages
have different line heights from each other.For apps targeting Android 15 (API level 35), a minimum line height is now
reserved for EditText
to match the reference font for the specified Locale, as
shown in the following image:

EditText
elements that
can contain text from English (en), Japanese (ja), and Burmese (my). The
height of the EditText
now includes space to accommodate the
default line height for these languages' fonts.If needed, your app can restore the previous behavior by specifying the
useLocalePreferredLineHeightForMinimum
attribute
to false
, and your app can set custom minimum vertical metrics using the
setMinimumFontMetrics
API in Kotlin and Java.
Kamera und Medien
Unter Android 15 werden die folgenden Änderungen am Kamera- und Medienverhalten für Apps vorgenommen, die auf Android 15 oder höher ausgerichtet sind.
Einschränkungen beim Anfordern des Audiofokus
Apps that target Android 15 (API level 35) must be the top app or running a
foreground service in order to request audio focus. If an app
attempts to request focus when it does not meet one of these requirements, the
call returns AUDIOFOCUS_REQUEST_FAILED
.
You can learn more about audio focus at Manage audio focus.
Aktualisierte Einschränkungen für Nicht-SDKs
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.
To learn more about the changes in this release of Android, see Updates to non-SDK interface restrictions in Android 15. To learn more about non-SDK interfaces generally, see Restrictions on non-SDK interfaces.