Track: Stable | Predecessor: Android 16 Stable (April)
The first stable Android 17 release. This is a cross-version comparison against Android 16 - every difference is a genuine version change, not a beta progression. The headline story is the typed policy engine and multi-user device provisioning, both of which ship in this release with their API surfaces live.
Multi-admin typed policy engine
setPolicy, getPolicy, getResolvedDeviceWidePolicy, and getResolvedPerUserPolicy with typed PolicyIdentifier<T> parameters. The engine mediates policy conflicts between multiple admins automatically. Eleven typed policies are defined: screen capture, auto-time, auto-timezone, eSIM outgoing transfer, lockscreen message, content restriction apps, app install, app uninstall, easter eggs, factory reset, and Bluetooth sharing. The API surface is live, but individual policy-streamlining flags remain gated at false - expect enablement in QPR releasessetCrossProfileWidgetProviders(Set) is now live. DPCs can set all cross-profile widget providers in a single bulk call rather than adding and removing packages individuallyfalse. These will progressively activate as the legacy DPM methods migrate to the typed engineMulti-user device management
provisionMultiuserManagedDevice() and provisionMultiuserManagedUser() to set up shared-device scenarios - kiosks, frontline workers, education labsDEVICE_CONTROLLER role, lighter than device owner, purpose-built for shared-device controllers. It grants permissions for content protection, debugging features, input methods, lockscreen messages, organisation identity, safe boot, and time setting. Gated by multiUserManagementDeviceProvisioningMultiUser to Multiuser casing. DPCs referencing the old action strings (ACTION_PROVISION_MULTI_USER_DEVICE) should update to ACTION_PROVISION_MULTIUSER_MANAGED_DEVICEUser restrictions
DISALLOW_ADD_GUEST restriction lets DPCs explicitly block guest user creation without the broader DISALLOW_ADD_USERDISALLOW_TASK_CONTINUITY_HANDOFF replaces the A16 DISALLOW_HANDOFF with a clearer name. DPCs should migrate - the old restriction string is removedhasBadge() now returns true for user 0 in headless system user mode, improving app management UX on HSU devicesDPM role holder changes
COPY_ACCOUNTS and REMOVE_ACCOUNTS (gated by splitCreateManagedProfileEnabled), supporting managed profile creation workflowsACCESS_BIOMETRIC_SENSOR_STRENGTHS added to DPM, system activity, and wallet rolesDISCOVER_APP_FUNCTIONS and EXECUTE_APP_FUNCTIONS_SYSTEM added to the system activity and DPM rolesSHOW_POWER_MENU permission added to the assistant and DPM roles (gated by statusbarApiShowPowerMenu)Other enterprise changes
FeatureFlags/FeatureFlagsImpl runtime delegation layer was removed. All admin flags are now hardcoded static methods in the stable image - no runtime override possibleenableNullableAdminComponent shipped true, replacing the A16 dontWriteIsSystemAuthority flag. Allows admin components to be null in policy engine records, supporting role-based management without a concrete DeviceAdminReceivercanAddPrivateProfile() now uses a simpler check, removing multiple legacy flag guardscanAddMoreUsersLegacy() deleted from UserManager; the consistentMaxUsers flag is now assumed truePolicyHandler/PolicyHandlerFactory/PolicyValidator framework landed in the device policy service. This is the typed handler lifecycle that replaces inline DPMS logic and will scale as more policies migrateexpandAppStreamingRolePermissions)LOCK_APPS permission, gated by appLockApis, enabling launcher-level app lockingMANAGE_SUPERVISION (gated by enableSupervisionManagerPolicyApis)