PendingIntent mutability is mandatory
Apps targeting Android 12 must specify FLAG_IMMUTABLE or FLAG_MUTABLE for every PendingIntent.
What to doAdd the flag; use immutable unless the system must fill in extras.
Material You dynamic colour
Google introduced Material You, a design language that adapts the system to the user's wallpaper.
Privacy exposure was invisible, and apps could start activities and use exact alarms without restraint.
Android 12 added the Privacy Dashboard, microphone and camera indicators, approximate location, the splash screen API, and mandatory PendingIntent mutability.
Privacy became visible, and the launch experience became the system's.
What changed underneath the APIs. These are the changes this site's architecture modules explain in depth.
The full archive has every recorded change with its migration advice.
Apps targeting Android 12 must specify FLAG_IMMUTABLE or FLAG_MUTABLE for every PendingIntent.
What to doAdd the flag; use immutable unless the system must fill in extras.
SCHEDULE_EXACT_ALARM is required for exact alarms, and it may be denied by default on some devices.
What to doCheck the permission and fall back to inexact alarms, or use USE_EXACT_ALARM only for alarm-clock use cases.
The system shows a splash screen for every app, and the custom splash-screen APIs are deprecated.
What to doAdopt the SplashScreen API and the new starting-window behaviour.
Apps cannot start foreground services from the background, with a small set of exemptions.
What to doStart services while visible or use WorkManager or expedited jobs.
Every component with an intent filter must declare android:exported explicitly.
What to doAdd android:exported to every component with an intent filter.
BLUETOOTH_SCAN and BLUETOOTH_CONNECT replace the old Bluetooth and location permissions for nearby devices.
What to doRequest the new nearby-devices permissions and remove the location workaround.
Users can grant only approximate location, so apps must handle coarsened results.
What to doRequest fine location only when needed and handle approximate grants gracefully.
The system controls the launch animation, so custom launch themes behave differently.
What to doUse the SplashScreen API instead of a launch activity.
The system shows an indicator whenever an app uses the microphone or camera, and a toggle can disable them.
What to doHandle the case where the sensor is blocked by the user's privacy toggle.
Reading the clipboard shows a toast to the user.
What to doRead the clipboard only in response to a user action.
Touches from windows with insufficient trust (for example overlays) are blocked from passing to apps.
What to doDo not rely on overlay windows for touch pass-through.
ACCESS_BLOBS_ACROSS_USERSunknownBIND_COMPANION_DEVICE_SERVICEunknownBLUETOOTH_ADVERTISEdangerousBLUETOOTH_CONNECTdangerousBLUETOOTH_SCANdangerousHIDE_OVERLAY_WINDOWSunknownHIGH_SAMPLING_RATE_SENSORSnormalMANAGE_MEDIAsignature|appop|preinstalledMANAGE_ONGOING_CALLSsignature|appopREQUEST_COMPANION_PROFILE_WATCHnormalREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDnormalREQUEST_OBSERVE_COMPANION_DEVICE_PRESENCEunknownSCHEDULE_EXACT_ALARMsignature|privileged|appopSTART_FOREGROUND_SERVICES_FROM_BACKGROUNDunknownUPDATE_PACKAGES_WITHOUT_USER_ACTIONnormalUSE_ICC_AUTH_WITH_DEVICE_IDENTIFIERsignature|appopUWB_RANGINGdangerousThis release shipped on Linux kernel versions 5.4, 5.10. Kernel versions vary by device.