Compatibility framework changes (Android 15)

Figure 1. The App Compatibility Changes screen in developer options lists the changes that you can toggle.

This page describes toggleable changes that are part of the compatibility framework in Android 15 (API level 35). Use this list in conjunction with the developer options and ADB commands to test and debug your app as you prepare to support and target Android 15.

Here are some of the things you can do using the compatibility framework tools:

  • Test targeted changes without actually changing the app's targetSdkVersion. You can use the toggles to force-enable specific targeted behavior changes to evaluate the impact on your existing app.
  • Focus your testing on specific changes only. Rather than having to address all targeted changes at once, the toggles let you disable all targeted changes except the ones you want to test against.
  • Manage toggles through adb. You can use adb commands to enable and disable the toggleable changes in your automated test environment.
  • Debug faster using standard change IDs. Toggleable changes each have a unique ID and name that you can use to quickly debug root cause in log output.

For complete details on using the tools for each of these use cases, see Compatibility framework tools.

Behavior changes included in the compatibility framework

The list in this section describes toggleable changes that are included in the compatibility framework for Android 15-related changes and toggleable changes that can help with general app testing.

You can filter the list of changes by their Default State.

Toggleable changes in the compatibility framework in Android 15

CAMERA_MIC_INDICATORS_NOT_PRESENT

Change ID: 162547999
Default State: Disabled for all apps.

Indicates that this device supports camera and microphone indicators. The value is false if present, because the CompatChanges#isChangeEnabled method returns true if the Change ID is not present.

CHECK_PARAMS_IN_IS_SESSION_CONFIGURATION_SUPPORTED

Change ID: 320741775
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, isSessionConfigurationSupported also checks for compatibility of session parameters when supported by the HAL.

DEFAULT_RESCIND_BAL_PRIVILEGES_FROM_PENDING_INTENT_CREATOR

Change ID: 296478951
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, the creator of a PendingIntent blocks background activity launches by default.

To learn more about this change, see the section in the Android 15 behavior changes page about Secured background activity launches.

DEPRECATE_UI_FONT

Change ID: 279646685
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, the elegantTextHeight TextView attribute becomes true by default when your app is running on a device with Android 15 or higher, replacing the compact font used by default with some scripts that have large vertical metrics with one that is much more readable.

To learn more about this change, see the section in the Android 15 behavior changes page about elegantTextHeight attribute defaults to true.

DOWNSCALED

Change ID: 168419799
Default State: Disabled for all apps.

This change is the gatekeeper of all per-app buffer downscaling changes. Enabling this change allows the following scaling factors to be applied:

When this change is enabled for an app package, the app is forcibly resized to the highest, enabled scaling factor. For example, 80% is used if both 80% and 70% (DOWNSCALE_80 and DOWNSCALE_70) are enabled. When both this change and DOWNSCALED_INVERSE are enabled, DOWNSCALED_INVERSE takes precedence and the scaling factor is applied inversely.

DOWNSCALED_INVERSE

Change ID: 273564678
Default State: Disabled for all apps.

This change is the gatekeeper of all per-app buffer inverse downscaling changes. Enabling this change allows the following scaling factors to be inversely applied (that is, the resolution is upscaled instead):

When this change is enabled for an app package, the app is forcibly resized to the lowest, enabled scaling factor. For example, 80% is used if both 80% and 70% (DOWNSCALE_80 and DOWNSCALE_70) are enabled because when inversely applied, an 80% scaling factor equals 125%, which is less than the 142.86% scaling that is applied when inversely applying a 70% scaling factor. When both this change and DOWNSCALED are enabled, DOWNSCALED_INVERSE takes precedence and the scaling factor is applied inversely.

DOWNSCALE_30

Change ID: 189970040
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 30% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 333.33% of the vertical and horizontal resolution of the real display.

DOWNSCALE_35

Change ID: 189969749
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 35% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 285.71% of the vertical and horizontal resolution of the real display.

DOWNSCALE_40

Change ID: 189970038
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 40% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 250% of the vertical and horizontal resolution of the real display.

DOWNSCALE_45

Change ID: 189969782
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 45% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 222.22% of the vertical and horizontal resolution of the real display.

DOWNSCALE_50

Change ID: 176926741
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 50% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 200% of the vertical and horizontal resolution of the real display.

DOWNSCALE_55

Change ID: 189970036
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 55% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 181.82% of the vertical and horizontal resolution of the real display.

DOWNSCALE_60

Change ID: 176926771
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 60% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 166.67% of the vertical and horizontal resolution of the real display.

DOWNSCALE_65

Change ID: 189969744
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 65% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 153.85% of the vertical and horizontal resolution of the real display.

DOWNSCALE_70

Change ID: 176926829
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 70% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 142.86% of the vertical and horizontal resolution of the real display.

DOWNSCALE_75

Change ID: 189969779
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 75% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 133.33% of the vertical and horizontal resolution of the real display.

DOWNSCALE_80

Change ID: 176926753
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 80% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 125% of the vertical and horizontal resolution of the real display.

DOWNSCALE_85

Change ID: 189969734
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 85% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 117.65% of the vertical and horizontal resolution of the real display.

DOWNSCALE_90

Change ID: 182811243
Default State: Disabled for all apps.

If DOWNSCALED is also enabled, enabling this change for a package forces the app to assume it's running on a display with 90% of the vertical and horizontal resolution of the real display. If DOWNSCALED_INVERSE is also enabled, enabling this change for a package forces the app to assume it's running on a display with 111.11% of the vertical and horizontal resolution of the real display.

DO_NOT_CLONE_IN_ARRAYS_AS_LIST

Change ID: 202956589
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, when using Arrays.asList(...).toArray(), the component type of the resulting array is now an Object—not the type of the underlying array's elements. So the following code throws a ClassCastException:

String[] elements = (String[]) Arrays.asList("one", "two").toArray();

For this case, to preserve String as the component type in the resulting array, you could use Collection.toArray(Object[]) instead:

String[] elements = Arrays.asList("two", "one").toArray(new String[0]);

To learn more about this change, see the section in the Android 15 behavior changes page about OpenJDK API changes.

ENABLE_BUNDLE_LAUNCH_ACTIVITY_ITEM

Change ID: 324203798
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, to prevent any existing apps from having app compatibility issues with non-SDK usages of ClientTransaction#getActivityToken(), only allow bundling LaunchActivityItem.

ENABLE_MATCH_LOCAL_NETWORK

Change ID: 319212206
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, apps receive network callbacks from local networks by default. Apps targeting Android 14 (API level 34) or lower still need to add NetworkCapabilities.NET_CAPABILITY_LOCAL_NETWORK to the NetworkCapabilities of the NetworkRequest to receive ConnectivityManager.NetworkCallback from local networks.

ENABLE_STRICT_FORMATTER_VALIDATION

Change ID: 270674727
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, validation of argument index, flags, width, and precision are now more strict when using the String.format() and Formatter.format() APIs.

To learn more about this change, see the section in the Android 15 behavior changes page about OpenJDK API changes.

ENFORCE_EDGE_TO_EDGE

Change ID: 309578419
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, apps will be edge-to-edge by default on devices running Android 15 or higher.

To learn more about this change, see the section in the Android 15 behavior changes page about Edge-to-edge enforcement.

ENFORCE_STRICT_QUERY_BUILDER

Change ID: 143231523
Default State: Disabled for all apps.

When enabled, the SQLiteQueryBuilder verifies all CalendarProvider2 query selections against malicious arguments.

FGS_BOOT_COMPLETED_RESTRICTIONS

Change ID: 296558535
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, disables foreground service background starts from BOOT_COMPLETED broadcasts for all types except:

To learn more about this change, see the section in the Android 15 behavior changes page about Restrictions on BOOT_COMPLETED broadcast receivers launching foreground services.

FGS_INTRODUCE_TIME_LIMITS

Change ID: 317799821
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, foreground services of certain types have a time limit. If the foreground service of the offending type is not stopped within the allocated time limit, it will receive a callback using Service.onTimeout(int, int) and it must then be stopped within a few seconds. If an app fails to do so, it will be declared an ANR.

To learn more about this change, see the sections in the Android 15 behavior changes page about timeout behavior for the data sync and media processing foreground service types.

FGS_SAW_RESTRICTIONS

Change ID: 319471980
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, disables foreground service background starts in System Alert Window for all types unless it already has a System Overlay Window.

To learn more about this change, see the section in the Android 15 behavior changes page about Restrictions on starting foreground services while an app holds the SYSTEM_ALERT_WINDOW permission.

FORCE_DISABLE_HEVC_SUPPORT

Change ID: 174227820
Default State: Disabled for all apps.

Force disable an app from supporting the HEVC media capability. Apps should declare their supported media capabilities in their manifest but this flag can be used to force an app into not supporting HEVC, hence forcing transcoding while accessing media encoded in HEVC. Setting this flag overrides any OS level defaults for apps. It is disabled by default, meaning that the OS defaults take precedence. If both this flag and FORCE_ENABLE_HEVC_SUPPORT are enabled, the OS ignores both flags.

FORCE_ENABLE_HEVC_SUPPORT

Change ID: 174228127
Default State: Disabled for all apps.

Force enable an app to support the HEVC media capability Apps should declare their supported media capabilities in their manifest but this flag can be used to force an app into supporting HEVC, hence avoiding transcoding while accessing media encoded in HEVC. Setting this flag overrides any OS level defaults for apps. It is disabled by default, meaning that the OS defaults would take precedence. If both this flag and FORCE_DISABLE_HEVC_SUPPORT are enabled, the OS ignores both flags.

FORCE_NON_RESIZE_APP

Change ID: 181146395
Default State: Disabled for all apps.

Forces the packages it is applied to to be non-resizable.

FORCE_RESIZE_APP

Change ID: 174042936
Default State: Disabled for all apps.

Forces the packages it is applied to to be resizable. We only allow resizing in fullscreen windowing mode, but not forcing the app into resizable multi-windowing mode.

GWP_ASAN

Change ID: 145634846
Default State: Disabled for all apps.

Enables sampled native memory bug detection in apps.

To learn more about using GWP-ASan, see the GWP-ASan guide.

IS_DEVICE_OWNER_USER_AWARE

Change ID: 307233716
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, the isDeviceOwnerApp(String) method will use the user contained within the context. For apps targeting Android 14 (API level 34) or lower, the user of the calling process will be used (Process.myUserHandle()).

MANAGE_GLOBAL_ZEN_VIA_IMPLICIT_RULES

Change ID: 308670109
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, apps 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..

To learn more about this change, see the section in the Android 15 behavior changes page about Changes to when apps can modify the global state of Do Not Disturb mode.

NATIVE_HEAP_ZERO_INIT

Change ID: 178038272
Default State: Disabled for all apps.

Enable automatic zero-initialization of native heap memory allocations.

NATIVE_MEMTAG_ASYNC

Change ID: 145772972
Default State: Disabled for all apps.

Enable asynchronous (ASYNC) memory tag checking in this process. This flag only affects hardware supporting the ARM Memory Tagging Extension (MTE).

NATIVE_MEMTAG_SYNC

Change ID: 177438394
Default State: Disabled for all apps.

Enables synchronous (SYNC) memory tag checking in this process. This flag only affects hardware supporting the ARM Memory Tagging Extension (MTE). If both NATIVE_MEMTAG_ASYNC and this option are enabled, this option takes precedence and MTE is enabled in SYNC mode.

OVERRIDE_ANY_ORIENTATION

Change ID: 265464455
Default State: Disabled for all apps.

When enabled, this change allows the following orientation overrides to be applied regardless of the orientation requested by the activity:

OVERRIDE_ANY_ORIENTATION_TO_USER

Change ID: 310816437
Default State: Disabled for all apps.

When enabled, enables SCREEN_ORIENTATION_USER, which overrides any orientation requested by the activity. Fixed orientation apps can be overridden to fullscreen on large screen devices with ignoreOrientationRequest enabled with this override.

OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT

Change ID: 314961188
Default State: Disabled for all apps.

When enabled, excludes the packages the override is applied to from the camera compatibility treatment in free-form windowing mode for fixed-orientation apps.

In free-form windowing mode, the compatibility treatment emulates running on a portrait device by letterboxing the app window and changing the camera characteristics to what apps commonly expect in a portrait device: 90 and 270 degree sensor rotation for back and front cameras, respectively, and setting display rotation to 0.

Use this flag to disable the compatibility treatment for apps that don't respond well to the treatment.

OVERRIDE_CAMERA_RESIZABLE_AND_SDK_CHECK

Change ID: 191514214
Default State: Disabled for all apps.

When enabled, this change forces the packages it is applied to ignore the current value of android:resizeableActivity as well as target SDK equal to or lower than Android 6.0 (API level 23) and consider the activity as non-resizable. In this case, the value of camera rotate and crop only depends on the needed compensation considering the current display rotation.

OVERRIDE_CAMERA_ROTATE_AND_CROP_DEFAULTS

Change ID: 189229956
Default State: Disabled for all apps.

When enabled, this change forces the packages it is applied to override the default camera rotate and crop behavior and always return CaptureRequest.SCALER_ROTATE_AND_CROP_NONE.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Change ID: 316897322
Default State: Disabled for all apps.

When enabled, ensures that users are presented with a choice of capturing a single app or the entire screen when initiating a MediaProjection session, overriding the usage of MediaProjectionConfig#createConfigForDefaultDisplay.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Change ID: 266124927
Default State: Disabled for all apps.

Enables SCREEN_ORIENTATION_REVERSE_LANDSCAPE for the app it's applied to. Unless OVERRIDE_ANY_ORIENTATION is also enabled, SCREEN_ORIENTATION_REVERSE_LANDSCAPE is used only when the activity specifies landscape orientation. Enabling this change can help you test your app behavior for differences between devices where landscape orientation corresponds to Surface.ROTATION_90 and devices where it corresponds to Surface.ROTATION_270.

OVERRIDE_LAYOUT_IN_DISPLAY_CUTOUT_MODE

Change ID: 332679525
Default State: Disabled for all apps.

When enabled, overrides the layout in display cutout mode behavior. This will only apply if edge-to-edge is not enforced.

OVERRIDE_MIN_ASPECT_RATIO

Change ID: 174042980
Default State: Disabled for all apps.

This change is the gatekeeper of all changes that force a given minimum aspect ratio. Enabling this change allows the following minimum aspect ratios to be applied:

When this change is enabled for an app package, the minimum aspect ratio given in the app's manifest is overridden to the largest enabled aspect ratio unless the app's manifest value is higher.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Change ID: 218959984
Default State: Disabled for all apps.

When enabled, overrides the minimum aspect ratio restriction in portrait fullscreen in order to use all available screen space.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Change ID: 180326787
Default State: Disabled for all apps.

When OVERRIDE_MIN_ASPECT_RATIO is also enabled, enabling this change for a package sets the activity's minimum aspect ratio to a large value as defined by OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Change ID: 180326845
Default State: Disabled for all apps.

When OVERRIDE_MIN_ASPECT_RATIO is also enabled, enabling this change for a package sets the activity's minimum aspect ratio to a medium value as defined by OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE.

OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA

Change ID: 325586858
Default State: Disabled for all apps.

When enabled, restricts treatments that force a given min aspect ratio to apply so that they only apply when an app is connected to the camera.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Change ID: 203647190
Default State: Enabled for all apps.

When OVERRIDE_MIN_ASPECT_RATIO is also enabled, this change limits any other changes that force an activity's minimum aspect ratio to a certain value—such as OVERRIDE_MIN_ASPECT_RATIO_LARGE and OVERRIDE_MIN_ASPECT_RATIO_MEDIUM—to activities that also have a portrait orientation.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Change ID: 236283604
Default State: Disabled for all apps.

When enabled, this change excludes packages that is applied to from the ignore orientation restrictions that device manufacturers can set.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Change ID: 265451093
Default State: Disabled for all apps.

Enables SCREEN_ORIENTATION_NOSENSOR for the app it's applied to. Unless OVERRIDE_ANY_ORIENTATION is also enabled, SCREEN_ORIENTATION_NOSENSOR is used only when the activity doesn't specify any other fixed orientation.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Change ID: 265452344
Default State: Disabled for all apps.

Enables SCREEN_ORIENTATION_PORTRAIT for the app it's applied to. Unless OVERRIDE_ANY_ORIENTATION is also enabled, SCREEN_ORIENTATION_PORTRAIT is used only when the activity doesn't specify any other fixed orientation.

PARSE_CONTENT_DISPOSITION_USING_RFC_6266

Change ID: 319400769
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, allows parsing of Content-Disposition headers that conform to RFC 6266. In particular, this enables parsing of filename* values that can use a different character encoding.

RATE_LIMIT_TOASTS

Change ID: 174840628
Default State: This change can't be toggled. It is only logged by the compatibility framework.

Enables rate limiting on the number of Toast.show() calls to prevent overburdening the user with too many toasts in a limited time. Any attempt to show more toasts than allowed in a certain timeframe results in the toast being discarded.

STREAM_INT_DIFFERS_FROM_NEXT_INT

Change ID: 308103782
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, the Random.ints() methods now return a different sequence of numbers than the Random.nextInt() methods do. This follows from the changes in https://bugs.openjdk.org/browse/JDK-8301574.

To learn more about this change, see the section in the Android 15 behavior changes page about OpenJDK API changes.

USE_EXPERIMENTAL_COMPONENT_ALIAS

Change ID: 196254758
Default State: Disabled for all apps.

When enabled, the system allows the "android" package to use component aliases.

USE_NEW_ISO_LOCALE_CODES

Change ID: 291868760
Default State: Enabled for apps that target Android 15 (API level 35) or higher.

When enabled, language codes for Hebrew, Yiddish, and Indonesian are no longer converted to their obsolete forms (Hebrew: iw, Yiddish: ji, and Indonesian: in).

To learn more about this change, see the section in the Android 15 behavior changes page about OpenJDK API changes.