Skip to content

Most visited

Recently visited

navigation

Cambios de comportamiento en Android 7.0

Además de nuevas funciones y capacidades, Android 7.0 incorpora varios cambios en el comportamiento del sistema y de la API. En este documento, se destacan algunos de los cambios claves que debes comprender y contemplar en tus apps.

Si publicaste anteriormente una app para Android, ten en cuenta que tu app podría verse afectada por estos cambios en la plataforma.

Batería y memoria

En Android 7.0 se incluyen cambios en los comportamientos del sistema para mejorar la duración de la batería de los dispositivos y reducir el uso de la memoria RAM. Estos cambios pueden afectar el acceso de tu app a recursos del sistema, y también la manera en que tu app interactúa con otras mediante determinadas intents implícitas.

Descanso

La función Descanso, presentada en Android 6.0 (nivel de API 23), prolonga la duración de la batería aplazando actividades de CPU y red cuando un usuario deja un dispositivo desenchufado, quieto y con la pantalla apagada. En Android 7.0 se ofrecen más mejoras para Descanso mediante la aplicación de un subconjunto de restricciones de CPU y red mientras el dispositivo se encuentra desenchufado y con la pantalla apagada, aunque no necesariamente quieto; por ejemplo, al ir dentro del bolsillo de un usuario en movimiento.

Figura 1: Ilustración del modo en que Descanso aplica un primer nivel de restricciones de actividad del sistema para prolongar la duración de la batería.

Cuando un dispositivo funciona con la batería y la pantalla permanece apagada durante un tiempo determinado, se activa en este el modo Descanso y se aplica el primer subconjunto de restricciones: Se desactiva el acceso de las apps a la red y se aplazan tareas y sincronizaciones. Si el dispositivo permanece quieto durante un tiempo determinado tras activarse el modo Descanso, el sistema aplica el resto de las restricciones del modo a PowerManager.WakeLock, alarmas de AlarmManager, GPS y análisis de Wi-Fi. Independientemente de que se apliquen algunas restricciones del modo Descanso o todas ellas, el sistema activa el dispositivo durante períodos de mantenimiento breves en los cuales las aplicaciones tienen acceso a la red y pueden ejecutar sincronizaciones o procesos aplazados.

Figura 2: Ilustración del modo en que Descanso aplica un segundo nivel de restricciones de actividad del sistema después de que el dispositivo permanece quieto durante un tiempo determinado.

Ten en cuenta que, cuando se activa la pantalla o se enchufa el dispositivo, se desactiva el modo Descanso y se quitan estas restricciones de procesamiento. El comportamiento adicional no tiene efecto sobre las recomendaciones ni las prácticas recomendadas para adaptar tu app a la versión anterior de Descanso, presentada en Android 6.0 (nivel de API 23), según lo descrito en Optimización para Descanso y App Standby. De todos modos, debes seguir las recomendaciones; por ejemplo, la de usar Google Cloud Messaging (GCM) para enviar y recibir mensajes, y la de planificar actualizaciones para adaptar el comportamiento adicional de Descanso.

Project Svelte: optimizaciones en segundo plano

En Android 7.0, se quitan tres transmisiones implícitas para ayudar a optimizar el uso de la memoria y el consumo de energía. Este cambio es necesario porque las transmisiones implícitas a menudo inician apps registradas para recibirlas en segundo plano. La eliminación de estas transmisiones puede mejorar sustancialmente el rendimiento del dispositivo y la experiencia del usuario.

Los dispositivos móviles están sujetos a cambios de conectividad frecuentes; por ejemplo, al realizar cambios de datos Wi-Fi a móviles. Actualmente, las apps pueden realizar controles en busca de cambios en la conectividad registrando un receptor para la transmisión implícita CONNECTIVITY_ACTION en su manifiesto. Debido a que muchas apps se registran para recibir esta transmisión, un único cambio de red puede hacer que todas se activen y procesen la transmisión a la vez.

Asimismo, en versiones anteriores de Android, las apps podían registrarse para recibir las transmisiones implícitas ACTION_NEW_PICTURE y ACTION_NEW_VIDEO de otras apps, como Cámara. Cuando un usuario toma una foto con la app Cámara, estas apps se activan para procesar la transmisión.

Para corregir estos problemas, en Android 7.0 se aplican las siguientes optimizaciones:

Si la app usa alguna de estas intents, debes quitar las dependencias en ellas lo antes posible a fin de poder orientar los dispositivos con Android 7.0 correctamente. El framework de Android ofrece varias soluciones para mitigar la necesidad de estas transmisiones implícitas. Por ejemplo, la JobScheduler API proporciona un mecanismo sólido para programar operaciones de red cuando se cumplen las condiciones especificadas, como una conexión a una red de uso no medido. Puedes, incluso, usar JobScheduler para responder a cambios en proveedores de contenido.

Para obtener más información sobre optimizaciones en segundo plano en Android N y la manera de adaptar tu app, consulta Optimizaciones en segundo plano.

Cambios en los permisos

En Android 7.0, se incorporan cambios en permisos que pueden afectar tu app.

Cambios en los permisos del sistema de archivos

Para mejorar la seguridad de los archivos privados, el directorio privado de las apps orientadas a Android 7.0 o versiones posteriores tiene acceso restringido (0700). Esta configuración evita la fuga de metadatos de archivos privados, como su tamaño o existencia. Este cambio en los permisos tiene varios efectos secundarios:

Intercambio de archivos entre apps

En las apps orientadas a Android 7.0, el framework de Android aplica la política de la StrictMode API que prohíbe exponer URI file:// fuera de tu app. Si una intent con un URI de archivo sale de tu app, esta última experimenta una falla con una excepción FileUriExposedException.

Para compartir archivos entre apps, debes enviar un URI content:// y otorgar un permiso de acceso temporal en el URI. La forma más sencilla de otorgar este permiso es a través de la clase FileProvider. Para obtener más información sobre permisos e intercambio de archivos, consulta Intercambio de archivos.

Mejoras de accesibilidad

En Android 7.0, se incluyen cambios destinados a mejorar la usabilidad de la plataforma para usuarios con defectos o discapacidades visuales. Estos cambios generalmente no deben exigir modificaciones en el código de tu app. Sin embargo, debes revisar estas funciones y probarlas con tu app para evaluar el posible impacto en la experiencia del usuario.

Zoom de la pantalla

Android 7.0 permite a los usuarios configurar Display size, el ajuste que expande o contrae todos los elementos de la pantalla, lo cual mejora la accesibilidad al dispositivo para usuarios con poca visión. Estos no podrán superar el valor de zoom mínimo de sw320dp para el ancho de pantalla, que es el ancho de un Nexus 4, un teléfono común de tamaño intermedio.

Figura 3: En la pantalla de la derecha, se muestra el efecto que tiene aumentar Display size para un dispositivo con una imagen de sistema de Android 7.0.

Al cambiar la densidad del dispositivo, el sistema notifica a las apps en ejecución de las siguientes maneras:

En la mayoría de las apps no se necesitan cambios para admitir esta función si en ellas se siguen las prácticas recomendadas de Android. Verificaciones específicas que deben realizarse:

Vision Settings en el asistente de configuración

Vision Settings se incluye en la pantalla de bienvenida de Android 7.0, en la cual los usuarios pueden configurar los siguientes ajustes de accesibilidad para un nuevo dispositivo: Magnification gesture, Font size, Display size y TalkBack. Este cambio aumenta la visibilidad de errores relacionados con diferentes ajustes de pantalla. Para evaluar el impacto de esta función, debes probar tus apps con estos ajustes habilitados. Puedes encontrarlos en Settings > Accessibility.

Apps del NDK con vínculos a bibliotecas de plataformas

A partir de Android 7.0, el sistema evita que las apps se vinculen dinámicamente con bibliotecas que no pertenezcan al NDK, lo cual puede hacer que tu app falle. El objetivo de este cambio en el comportamiento es crear una experiencia de app coherente en diferentes actualizaciones de plataforma y dispositivos. Si bien es posible que tu código no se vincule con bibliotecas privadas, es posible que una biblioteca estática de terceros de tu app sí lo haga. Por lo tanto, todos los desarrolladores deben garantizar que sus apps no fallen en dispositivos con Android 7.0. Si tu app usa código nativo, solo debes usar NDK API públicas.

Hay tres formas en las cuales tu app puede intentar acceder a API de plataformas privadas:

Las apps no deben usar bibliotecas nativas que no estén incluidas en el NDK porque pueden cambiar o desaparecer entre diferentes versiones de Android. El cambio de OpenSSL a BoringSSL es un ejemplo de modificaciones como esta. A su vez, los diferentes dispositivos pueden ofrecer distintos niveles de compatibilidad, debido a que no existen requisitos de compatibilidad para bibliotecas de plataformas no incluidas en el NDK.

A fin de reducir el impacto de esta restricción sobre las apps lanzadas actualmente, identificamos un conjunto de bibliotecas que se usa mucho (por ejemplo, libandroid_runtime.so, libcutils.so, libcrypto.so y libssl.so) y al cual se puede acceder temporalmente en Android N para las apps orientadas al nivel de API 23 o a niveles inferiores. Si tu app carga una de estas bibliotecas, logcat genera una advertencia y aparece una notificación en el dispositivo objetivo. Si ves estas advertencias, debes actualizar tu app para incluir su propia copia de esas bibliotecas o usar solo las NDK API públicas. Las versiones futuras de la plataforma Android pueden restringir el uso de bibliotecas privadas y hacer que tu app falle.

Todas las apps generan un error en tiempo de ejecución cuando llaman a una API a la que no se puede acceder de forma pública ni temporal. Como resultado, System.loadLibrary y dlopen(3) muestran un valor NULL, y pueden hacer que tu app falle. Debes revisar el código de tu app para quitar el uso de API de plataformas privadas y probar por completo tus apps con un dispositivo de vista previa o emulador. Si no estás seguro acerca de si tu app usa bibliotecas privadas, puedes revisar logcat para identificar el error en tiempo de ejecución.

En la siguiente tabla, se describe el comportamiento que deberías esperar de una app según su uso de bibliotecas nativas privadas y su nivel de API de destino (android:targetSdkVersion).

Bibliotecas Nivel de API de destino Acceso en tiempo de ejecución por medio de un vinculador dinámico Comportamiento de N Developer Preview Comportamiento de la versión N final Comportamiento de la plataforma Android futura
Pública incluida en el NDK Cualquiera Accesible Funciona como se espera. Funciona como se espera. Funciona como se espera.
Privada (bibliotecas privadas temporalmente disponibles) 23 o inferior Temporalmente disponible Funciona como se espera, pero aparecen una advertencia de logcat y un mensaje en el dispositivo de destino. Funciona como se espera, pero aparece una advertencia de logcat. Error en tiempo de ejecución
Privada (bibliotecas privadas temporalmente disponibles) 24 o superior Restringido Error en tiempo de ejecución Error en tiempo de ejecución Error en tiempo de ejecución
Privada (otra) Cualquiera Restringido Error en tiempo de ejecución Error en tiempo de ejecución Error en tiempo de ejecución

Verifica si tu app usa bibliotecas privadas

Para ayudarte a identificar problemas al cargar bibliotecas privadas, logcat puede generar una advertencia o un error en tiempo de ejecución. Por ejemplo, si tu app se orienta al nivel de API 23 o a niveles inferiores e intenta acceder a una biblioteca privada en un dispositivo con Android 7.0, es posible que recibas una advertencia similar a la siguiente:

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

Estas advertencias de logcat te indican la biblioteca que intenta acceder a una API de plataforma privada, pero no harán que falle tu app. Si la app se orienta al nivel de API 24 o a niveles superiores, sin embargo, logcat genera el siguiente error en tiempo de ejecución y tu app puede fallar:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

También es posible que visualices estos resultados de logcat si tu app usa bibliotecas de terceros que dinámicamente se vinculan a API de plataformas privadas. Ejecutando el comando que se muestra a continuación, la herramienta readelf de Android 7.0DK te permite generar una lista de todas las bibliotecas compartidas de un archivo .so determinado que se vinculan dinámicamente:

aarch64-linux-android-readelf -dW libMyLibrary.so

Actualiza tu app

Aquí te presentamos algunos pasos que puedes seguir para solucionar estos tipos de errores y asegurarte de que tu app no falle en futuras actualizaciones de la plataforma:

Android for Work

Android 7.0 contiene cambios para apps orientadas a Android for Work, entre los que se incluyen modificaciones en la instalación de certificados, el restablecimiento de contraseñas, la gestión de usuarios secundarios y el acceso a identificadores de dispositivos. Si compilas apps para entornos de Android for Work, debes estudiar estos cambios y modificar tu app según corresponda.

Para obtener más información sobre los cambios de Android for Work en Android 7.0, consulta Actualizaciones de Android for Work.

Retención de anotaciones

Android 7.0 soluciona un error por el cual se ignoraba la visibilidad de las anotaciones. Este problema permitía que el tiempo de ejecución accediera a notificaciones a las que no debía tener acceso. Entre estas anotaciones, se incluyen las siguientes:

Si tu app se basa en este comportamiento, agrega una política de retención para las anotaciones que deben estar disponibles en el tiempo de ejecución. Para ello, usa @Retention(RetentionPolicy.RUNTIME).

Otros aspectos importantes

This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.