La plataforma de Android 16 incluye cambios de comportamiento que podrían afectar a tu app. Los siguientes cambios se aplican a todas las apps cuando se ejecutan en Android 16, independientemente de targetSdkVersion
. Debes probar tu app y, luego, modificarla según corresponda para admitir estos cambios.
Asegúrate también de revisar la lista de cambios de comportamiento que solo afectan a las apps orientadas a Android 16.
Funcionalidad principal
Android 16 incluye los siguientes cambios que modifican o expanden varias funciones principales del sistema Android.
Optimizaciones de cuotas de JobScheduler
Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:
- Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
- If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
- If the job is executing while running a Foreground Service: in Android 16, jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.
This change impacts tasks scheduled using WorkManager, JobScheduler, and
DownloadManager. To debug why a job was stopped, we recommend logging why your
job was stopped by calling WorkInfo.getStopReason()
(for
JobScheduler jobs, call JobParameters.getStopReason()
).
For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.
We also recommend leveraging the new
JobScheduler#getPendingJobReasonsHistory
API introduced in
Android 16 to understand why a job has not executed.
Testing
To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.
To disable enforcement of "top state will adhere to job runtime quota", run the
following adb
command:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
To disable enforcement of "jobs that are executing while concurrently with a
foreground service will adhere to the job runtime quota", run the following
adb
command:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
To test certain app standby bucket behavior, you can set the app standby bucket
of your app using the following adb
command:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
To understand the app standby bucket your app is in, you can get the app standby
bucket of your app using the following adb
command:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Motivo de detención de trabajos vacíos abandonados
Una tarea abandonada ocurre cuando se recopiló como elemento no utilizado el objeto JobParameters
asociado con la tarea, pero no se llamó a JobService#jobFinished(JobParameters,
boolean)
para indicar que se completó. Esto indica que
el trabajo puede estar en ejecución y reprogramarse sin que la app lo sepa.
Las apps que dependen de JobScheduler no mantienen una referencia sólida al objeto JobParameters
, y el tiempo de espera ahora se otorgará al nuevo motivo de detención de la tarea STOP_REASON_TIMEOUT_ABANDONED
, en lugar de STOP_REASON_TIMEOUT
.
Si se producen casos frecuentes del nuevo motivo de detención abandonada, el sistema tomará medidas de mitigación para reducir la frecuencia de las tareas.
Las apps deben usar el nuevo motivo de detención para detectar y reducir las tareas abandonadas.
Si usas WorkManager, AsyncTask o DownloadManager, no se te verá afectado porque estas APIs administran el ciclo de vida de la tarea en nombre de tu app.
Se dejó de usar por completo JobInfo#setImportantWhileForeground.
El método JobInfo.Builder#setImportantWhileForeground(boolean)
indica la importancia de una tarea mientras la app de programación está en primer plano o cuando está exenta temporalmente de las restricciones en segundo plano.
Este método dejó de estar disponible a partir de Android 12 (nivel de API 31). A partir de Android 16, ya no funciona de manera eficaz y se ignorará llamar a este método.
Esta eliminación de funcionalidad también se aplica a JobInfo#isImportantWhileForeground()
. A partir de Android 16, si se llama al método, este muestra false
.
El alcance de prioridad de transmisión ordenada ya no es global
Las apps para Android pueden definir prioridades en los receptores de emisión para controlar el orden en que los receptores reciben y procesan la emisión. En el caso de los receptores declarados en el manifiesto, las apps pueden usar el atributo android:priority
para definir la prioridad y, en el caso de los receptores registrados en el contexto, las apps pueden usar la API de IntentFilter#setPriority()
para definir la prioridad. Cuando se envía una transmisión, el sistema la entrega a los receptores en orden de prioridad, de la más alta a la más baja.
En Android 16, no se garantizará el orden de entrega de transmisiones con el atributo android:priority
o IntentFilter#setPriority()
en diferentes procesos. Las prioridades de transmisión solo se respetarán dentro del mismo proceso de la aplicación y no en todos los procesos.
Además, las prioridades de transmisión se limitarán automáticamente al rango (SYSTEM_LOW_PRIORITY
+ 1, SYSTEM_HIGH_PRIORITY
- 1). Solo los componentes del sistema podrán establecer SYSTEM_LOW_PRIORITY
, SYSTEM_HIGH_PRIORITY
como prioridad de transmisión.
Es posible que tu app se vea afectada si realiza alguna de las siguientes acciones:
- Tu aplicación declaró varios procesos con el mismo intent de transmisión y tiene expectativas sobre la recepción de esos intents en un orden determinado según la prioridad.
- El proceso de tu app interactúa con otros procesos y tiene expectativas con respecto a la recepción de un intent de transmisión en un orden determinado.
Si los procesos deben coordinarse entre sí, deben comunicarse a través de otros canales de coordinación.
Cambios internos de ART
Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.
As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.
Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.
All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.
Modo de compatibilidad de tamaño de página de 16 KB
Android 15 introdujo la compatibilidad con páginas de memoria de 16 KB para optimizar el rendimiento de la plataforma. Android 16 agrega un modo de compatibilidad, que permite que algunas apps compiladas para páginas de memoria de 4 KB se ejecuten en un dispositivo configurado para páginas de memoria de 16 KB.
Si Android detecta que tu app tiene páginas de memoria alineadas de 4 KB, usa automáticamente el modo de compatibilidad y muestra un diálogo de notificación al usuario. Si configuras la propiedad android:pageSizeCompat
en AndroidManifest.xml
para habilitar el modo de retrocompatibilidad, se evitará que se muestre el diálogo cuando se inicie la app. Para obtener el mejor rendimiento, confiabilidad y estabilidad, tu app aún debe estar alineada en 16 KB. Consulta
nuestra entrada de blog reciente
sobre cómo actualizar tus apps para que admitan páginas de memoria de 16 KB y obtener más detalles.

Experiencia del usuario y IU del sistema
Android 16 incluye los siguientes cambios, cuyo objetivo es crear una experiencia del usuario más intuitiva y coherente.
Se darán de baja los anuncios de accesibilidad disruptivos
Android 16 deprecates accessibility announcements, characterized by the use of
announceForAccessibility
or the dispatch of
TYPE_ANNOUNCEMENT
accessibility events. These can create
inconsistent user experiences for users of TalkBack and Android's screen reader,
and alternatives better serve a broader range of user needs across a variety of
Android's assistive technologies.
Examples of alternatives:
- For significant UI changes like window changes, use
Activity.setTitle(CharSequence)
andsetAccessibilityPaneTitle(java.lang.CharSequence)
. In Compose, useModifier.semantics { paneTitle = "paneTitle" }
- To inform the user of changes to critical UI, use
setAccessibilityLiveRegion(int)
. In Compose, useModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. These should be used sparingly as they may generate announcements every time a View is updated. - To notify users about errors, send an
AccessibilityEvent
of typeAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
and setAccessibilityNodeInfo#setError(CharSequence)
, or useTextView#setError(CharSequence)
.
The reference documentation for the deprecated
announceForAccessibility
API includes more details about
suggested alternatives.
Compatibilidad con la navegación con 3 botones
Android 16 admite el gesto atrás predictivo en la navegación de 3 botones para las apps que migraron correctamente al gesto atrás predictivo. Si mantienes presionado el botón Atrás, se inicia una animación de atrás predictivo, que te brinda una vista previa de adónde te dirige el gesto de deslizar para volver.
Este comportamiento se aplica a todas las áreas del sistema que admiten animaciones de atrás predictivas, incluidas las animaciones del sistema (volver a la pantalla principal, cambiar de tarea y cambiar de actividad).
Factores de forma de los dispositivos
Android 16 incluye los siguientes cambios para las apps cuando los propietarios de dispositivos virtuales las proyectan en pantallas.
Anulaciones del propietario del dispositivo virtual
Un propietario de dispositivo virtual es una app de confianza o con privilegios que crea y administra un dispositivo virtual. Los propietarios de dispositivos virtuales ejecutan apps en un dispositivo virtual y, luego, las proyectan en la pantalla de un dispositivo remoto, como una computadora personal, un dispositivo de realidad virtual o un sistema de infoentretenimiento para automóviles. El propietario del dispositivo virtual se encuentra en un dispositivo local, como un teléfono celular.

Anulaciones por app
En dispositivos que ejecutan Android 16, los propietarios de dispositivos virtuales pueden anular la configuración de la app en dispositivos virtuales seleccionados que administran. Por ejemplo, para mejorar el diseño de la app, el propietario de un dispositivo virtual puede ignorar las restricciones de orientación, relación de aspecto y cambio de tamaño cuando proyecta apps en una pantalla externa.
Cambios rotundos comunes
El comportamiento de Android 16 podría afectar la IU de tu app en factores de forma de pantalla grande, como pantallas para vehículos o Chromebooks, en especial los diseños que se diseñaron para pantallas pequeñas en orientación vertical. Si deseas obtener información para hacer que tu app sea adaptable a todos los factores de forma de los dispositivos, consulta Acerca de los diseños adaptables.
Referencias
Transmisión de apps complementarias
Seguridad
Android 16 incluye cambios que promueven la seguridad del sistema para ayudar a proteger a las apps y a los usuarios de las apps maliciosas.
Mayor seguridad contra ataques de redireccionamiento de intents
Android 16 proporciona seguridad predeterminada contra ataques generales de redireccionamiento de Intent
, con compatibilidad mínima y cambios necesarios para los desarrolladores.
Presentamos soluciones de endurecimiento de la seguridad de forma predeterminada para los exploits de redireccionamiento de Intent
. En la mayoría de los casos, las apps que usan intents no suelen tener problemas de compatibilidad. Recopilamos métricas durante nuestro proceso de desarrollo para supervisar qué apps podrían tener fallas.
El redireccionamiento de intents en Android se produce cuando un atacante puede controlar de forma parcial o total el contenido de un intent que se usa para iniciar un componente nuevo en el contexto de una app vulnerable, mientras que la app víctima inicia un intent de nivel secundario no confiable en un campo de extras de un intent ("de nivel superior"). Esto puede provocar que la app del atacante inicie componentes privados en el contexto de la app víctima, active acciones con privilegios o obtenga acceso de URI a datos sensibles, lo que podría generar robo de datos y ejecución de código arbitraria.
Cómo inhabilitar el manejo de redireccionamiento de intents
Android 16 presenta una nueva API que permite a las apps inhabilitar las protecciones de seguridad de inicio. Esto puede ser necesario en casos específicos en los que el comportamiento de seguridad predeterminado interfiera con casos de uso legítimos de la app.
Para aplicaciones que compilan con el SDK de Android 16 o versiones posteriores
Puedes usar directamente el método removeLaunchSecurityProtection()
en el objeto Intent.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Para aplicaciones que se compilan con Android 15 (nivel de API 35) o versiones anteriores
Si bien no se recomienda, puedes usar la reflexión para acceder al método removeLaunchSecurityProtection()
.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
// Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }
Conectividad
Android 16 incluye los siguientes cambios en la pila de Bluetooth para mejorar la conectividad con dispositivos periféricos.
Se mejoró el manejo de la pérdida de bonos
A partir de Android 16, se actualizó la pila de Bluetooth para mejorar la seguridad y la experiencia del usuario cuando se detecta una pérdida de vinculación remota. Anteriormente, el sistema quitaba automáticamente la vinculación e iniciaba un nuevo proceso de vinculación, lo que podía provocar una vinculación accidental. En muchos casos, observamos que las apps no se ocupan del evento de pérdida de vínculo de manera coherente.
Para unificar la experiencia, Android 16 mejoró el manejo de la pérdida de vinculación en el sistema. Si no se pudo autenticar un dispositivo Bluetooth vinculado anteriormente cuando se volvió a conectar, el sistema desconectará el vínculo, retendrá la información de vinculación local y mostrará un diálogo del sistema en el que se informará a los usuarios sobre la pérdida de vinculación y se les indicará que vuelvan a vincular el dispositivo.