Cambios de comportamiento de Android Q: apps orientadas a Q

La plataforma Android Q incluye cambios de comportamiento que podrían afectar a tu app. Los siguientes cambios de comportamiento se aplican exclusivamente a las apps orientadas a Android Q o versiones posteriores. Si tu app tiene configurada como targetSdkVersion "android-Q" o una versión posterior, puedes modificarla para que admita correctamente estos comportamientos, según corresponda.

Asegúrate también de revisar la lista de cambios de comportamiento que afecten a todas las apps que se ejecuten en Android Q.

Actualizaciones a restricciones de interfaces no SDK

Para asegurar la estabilidad y compatibilidad de las apps, la plataforma comenzó a restringir las interfaces no SDK que tu app puede usar en Android 9 (API nivel 28). Android Q incluye listas actualizadas de interfaces no SDK restringidas, basadas en la colaboración con desarrolladores de Android y las pruebas internas más recientes. Nuestro objetivo es asegurarnos de que las alternativas públicas estén disponibles antes de restringir las interfaces que no pertenecen al SDK.

Si no orientarás tu app a Android Q, es posible que no te afecten de inmediato algunos de estos cambios. Sin embargo, aunque actualmente puedes usar interfaces no SDK de lista gris (según el nivel de API objetivo), usar cualquier método o campo no SDK siempre implica un gran riesgo de error para tu app.

Si no sabes con seguridad si tu app usa interfaces no SDK, puedes probarla para verificar. Si tu app depende de interfaces no SDK, deberías empezar a planificar una migración hacia otras alternativas SDK. No obstante, sabemos que algunas apps tienen casos prácticos válidos para usar interfaces que no pertenecen al SDK. Si no puedes encontrar una alternativa al uso de una interfaz que no pertenece al SDK para una función de tu app, deberías solicitar una nueva API pública.

Para obtener más información, consulta las actualizaciones de restricciones de interfaces que no pertenecen al SDK para Android Q y las restricciones para interfaces que no pertenecen al SDK.

Memoria compartida

Ashmem cambió el formato de los mapas dalvik en /proc/<pid>/maps, lo que afecta a las apps que analizan directamente el archivo de mapas. Los desarrolladores de aplicaciones deberían probar el nuevo formato /proc/<pid>/maps en los dispositivos y analizarlo si su app depende de los formatos de mapas dalvik.

Las apps orientadas a Q ya no pueden usar ashmem (/dev/ashmem) directamente, sino que deben acceder a la memoria compartida mediante la clase ASharedMemory del NDK. Además, no pueden enviar comandos IOCTL directos a descriptores de archivos ashmem existentes, sino que deben usar la clase ASharedMemory de NDK o las API de Java de Android para crear regiones de memoria compartida. Este cambio incrementa la seguridad y firmeza del trabajo con memoria compartida, lo que mejora el rendimiento y la seguridad de Android en general.

El tiempo de ejecución de Android solo acepta archivos OAT generados por el sistema

El tiempo de ejecución de Android (ART) ya no invoca dex2oat desde el proceso de la aplicación. Debido a este cambio, el ART solo aceptará archivos OAT que haya generado el sistema.

Implementación de corrección AOT en ART

Antes, la compilación por adelantado (AOT) que realizaba el tiempo de ejecución de Android (ART) podía provocar fallos en el tiempo de ejecución si el entorno de ruta de clase no era el mismo en la compilación que durante el tiempo de ejecución. Ahora, Android Q siempre solicita que los contextos de este entorno sean iguales, lo que deriva en los siguientes cambios de comportamiento:

  • Los cargadores de clase personalizados, es decir, los cargadores de clase escritos por apps (a diferencia de los del paquete dalvik.system), no serán compilados por AOT. Esto se debe a que ART no puede conocer la implementación de consulta de clase personalizada durante el tiempo de ejecución.
  • Los archivos dex secundarios (archivos dex que las apps cargan manualmente y no se encuentran en el APK principal) ahora son compilados por AOT en segundo plano, ya que la compilación en primer plano implica un gran consumo y, por ende, latencia no deseada antes de la ejecución. Ten en cuenta que, para las apps, se recomienda usar archivos divididos y no recurrir a archivos dex secundarios.
  • Las Bibliotecas compartidas en Android (entradas <library> y <uses-library> en el manifiesto de Android) ahora se implementan con una nueva jerarquía de cargador de clases.

Cambios en los permisos para intents de pantalla completa

Las apps orientadas a Android Q o versiones posteriores que usen notificaciones con intents de pantalla completa deben solicitar el permiso USE_FULL_SCREEN_INTENT en su archivo de manifiesto. Este es un permiso normal, por lo que el sistema se lo otorgará automáticamente a la app que lo solicite.

Si una app orientada a Android Q o versiones posteriores intenta crear una notificación con un intent de pantalla completa sin solicitar el permiso USE_FULL_SCREEN_INTENT, el sistema ignorará el intent de pantalla completa y mostrará el siguiente mensaje del registro: Package [pkg]: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

Compatibilidad con dispositivos plegables

Android Q tiene cambios compatibles con dispositivos de pantalla grande y plegables.

Cuando se ejecuta una app en Android Q, los métodos onResume() y onPause() funcionan de manera distinta. Cuando aparecen varias apps al mismo tiempo en Multiventana o el modo de pantallas múltiples, todas las actividades enfocables principales en las pilas visibles tienen el estado reanudado, pero el foco se sitúa solo en una de ellas: la actividad "más reanudada". Cuando se ejecuta en versiones anteriores a Android Q, solo se puede reanudar una actividad en el sistema a la vez; todas las demás actividades visibles quedan pausadas.

No confundas el "foco" con la actividad "más reanudada". El sistema se basa en el orden Z para asignar importancia a las actividades y priorizar más aquellas con las que el usuario interactuó por última vez. Una actividad puede ser la más reanudada, pero no estar enfocada (por ejemplo, si el panel de notificaciones se expande).

En Android Q, puedes suscribirte a la devolución de llamada onTopResumedActivityChanged() para recibir una notificación si tu actividad adquiere o pierde la posición de más reanudada. Esta equivale al estado reanudado antes de la versión Q y puede servir de indicio si tu app está usando recursos exclusivos o singleton que tal vez deban compartirse con otras apps.

También cambió el comportamiento del atributo resizeableActivity del manifiesto. Si una app define resizeableActivity=false en Android Q, es posible que se la establezca en modo de compatibilidad cuando cambie el tamaño de la pantalla disponible o si la app se mueve de una pantalla a otra.

Las apps pueden usar un nuevo atributo android:minAspectRatio para indicar si tu app admite las nuevas proporciones de pantalla.

A partir de la versión 3.5, la herramienta de emulación de Android Studio incluye dispositivos virtuales de 7.3" y 8" para que pruebes tu código con la imagen del sistema de Android Q.

Para obtener más información, consulta Cómo crear apps para dispositivos plegables.