page.title=Cambios en los comportamientos page.keywords=versión preliminar,sdk,compatibilidad meta.tags="preview", "compatibility" page.tags="preview", "developer preview" page.image=images/cards/card-n-changes_2x.png @jd:body
Además de nuevas características y capacidades, Android N incluye diversos cambios en el sistema y en los comportamientos de la API. En este documento, se destacan algunos de los cambios principales que debes comprender y justificar en tus aplicaciones.
Si publicaste anteriormente una aplicación para Android, ten en cuenta que tu aplicación podría verse afectada por estos cambios en la plataforma.
Android N incluye 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 aplicación a recursos del sistema, además de la manera en que tu aplicación interactúa con otras aplicaciones mediante determinadas intents implícitas.
Descanso, presentado 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 N se ofrecen más mejoras para Descanso a través de 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.
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 aplicaciones 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 {@link android.os.PowerManager.WakeLock}, alarmas de {@link android.app.AlarmManager}, GPS y análisis de Wi-Fi. Independientemente de que se apliquen algunas o todas las restricciones del modo Descanso, el sistema activa el dispositivo durante plazos de mantenimiento breves en los cuales las aplicaciones tienen acceso a la red y pueden ejecutar sincronizaciones o procesos aplazados.
Ten en cuenta que, cuando se activa la pantalla o se enchufa el dispositivo, se desactiva el modo Descanso y se retiran estas restricciones de procesamiento. El comportamiento adicional no tiene efecto sobre las recomendaciones ni las prácticas recomendadas para adaptar tu aplicación 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.
En Android N, se eliminan 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 aplicaciones que se registran para realizar un seguimiento de ellas 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 entre los modos de datos Wi-Fi y móviles. Actualmente, las aplicaciones pueden realizar controles en busca de cambios en la conectividad registrando un receptor para la transmisión implícita {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} en su manifiesto. Debido a que muchas aplicaciones se registran para recibir esta transmisión, un cambio de red puede hacer que todas se activen y procesen la transmisión a la vez.
Asimismo, en versiones anteriores de Android, las aplicaciones podían registrarse para recibir las transmisiones implícitas {@link android.hardware.Camera#ACTION_NEW_PICTURE} y {@link android.hardware.Camera#ACTION_NEW_VIDEO} de otras aplicaciones, como la cámara. Cuando un usuario toma una foto con la aplicación de la cámara, estas aplicaciones se activan para procesar la transmisión.
Para corregir estos problemas, en Android N se aplican las siguientes optimizaciones:
Si la aplicación utiliza cualquiera de estas intents, debes quitar las dependencias en ellas lo antes posible a fin de poder orientar los dispositivos con Android N correctamente. El framework de Android ofrece varias soluciones para mitigar la necesidad de estas transmisiones implícitas. Por ejemplo, la API {@link android.app.job.JobScheduler} 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 usar {@link android.app.job.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 aplicación, consulta Optimizaciones en segundo plano.
En Android N, se incorporan cambios en permisos que pueden afectar tu aplicación.
Para mejorar la seguridad de los archivos privados, el directorio privado de
las aplicaciones orientadas a Android N 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:
Nota: Desde ahora, esta restricción no se aplica planamente. Las aplicaciones pueden seguir modificando los permisos para sus directorios privados con las API nativas o la API {@link java.io.File File}. Sin embargo, desaconsejamos reducir los permisos para el directorio privado.
file://
fuera del dominio del paquete puede dar al
receptor una ruta de acceso inaccesible. Por lo tanto, los intentos de pasar un
URI file://
activan una
FileUriExposedException
. La manera recomendada para compartir el
contenido de un archivo privado consiste en utilizar el {@link
android.support.v4.content.FileProvider}.
En las aplicaciones orientadas a Android N, el framework de Android aplica la política de la API {@link android.os.StrictMode} que prohíbe exponer URI {@code file://} fuera de la aplicación. Si una intent con un URI de archivo sale de tu aplicación, la aplicación falla con una excepción {@code FileUriExposedException}.
Para compartir archivos entre aplicaciones, debes enviar un URI {@code content://} y otorgar un permiso de acceso temporal en el URI. La forma más sencilla de otorgar este permiso es utilizando la clase {@link android.support.v4.content.FileProvider}. Para obtener más información sobre permisos e intercambio de archivos, consulta Intercambio de archivos.
En Android N, 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 aplicación. Sin embargo, debes revisar estas funciones y probarlas con tu aplicación para avaluar el posible impacto en la experiencia del usuario.
Android N 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.
Al cambiar la densidad del dispositivo, el sistema notifica a las aplicaciones de las siguientes maneras:
En la mayoría de las aplicaciones, 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:
sw320dp
y asegúrate de que funcione bien.
Nota: Si almacenaste en caché datos que dependen de la configuración, te convendrá incluir metadatos relacionados, como el tamaño de pantalla correspondiente o la densidad de píxeles para dichos datos. Guardar estos metadatos te permite decidir si necesitas actualizar los datos almacenados en caché después de un cambio en la configuración.
dp
) independientes de la densidad.
Vision Settings se incluye en la pantalla de Bienvenida de Android N, 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 aplicaciones con estos ajustes habilitados. Puedes encontrarlos en Settings > Accessibility.
En Android N, se incluyen cambios en el espacio de nombres a fin de evitar la carga de API no públicas. Si usas el NDK, solo debes emplear API públicas de la plataforma de Android. El uso de API no públicas en la próxima versión oficial de Android puede hacer que tu aplicación se bloquee.
Con el propósito de alertarte sobre el uso de API no públicas, las aplicaciones que funcionen en un dispositivo con Android N producirán un error de salida de logcat cuando una de ellas llame a una API no pública. Este error también aparecerá en la pantalla del dispositivo como un mensaje para ayudar a generar conciencia respecto de la situación. Debes revisar el código de tu aplicación para quitar el uso de API de plataformas no públicas y probar por completo tus aplicaciones con un dispositivo de prueba o emulador.
Si tu aplicación depende de bibliotecas de plataformas, consulta la documentación sobre el NDK a fin de hallar
soluciones típicas para el reemplazo de API privadas comunes por API públicas equivalentes.
También es posible que establezcas vínculos con bibliotecas de plataformas sin notarlo,
en especial si tu aplicación usa una biblioteca que forma parte de la plataforma (como
libpng
), pero no del NDK. En ese caso, asegúrate de que
tu APK contenga todos los archivos .so con los cuales intentaste establecer vínculos.
Advertencia: Algunas bibliotecas de terceros pueden establecer vínculos con API no públicas. Si tu aplicación usa estas bibliotecas, es probable que se bloquee al ejecutarse en la próxima versión oficial de Android.
Las aplicaciones no deben depender de bibliotecas nativas no incluidas en el NDK ni usarlas, ya que pueden modificarse o eliminarse en la transición de una versión de Android a otra. 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. Si debes acceder a bibliotecas no relacionadas con el NDK en dispositivos anteriores, haz que la carga dependa del nivel de la API de Android.
Para ayudarte a diagnosticar estos tipos de problemas, a continuación, se ofrecen ejemplos de errores de Java y del NDK que podrías hallar al intentar compilar tu aplicación con Android N:
Ejemplo de error de Java:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace"
Ejemplo de error de NDK:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
Aquí se ofrecen soluciones típicas para aplicaciones en las que se produzcan estos tipos de errores:
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or JavaVM::AttachCurrentThread from <jni.h>.
#include <sys/system_properties.h>
Android N contiene cambios para aplicaciones 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 creas aplicaciones para entornos de Android for Work, debes estudiar estos cambios y modificar tu aplicación según corresponda.
DevicePolicyManager.setCertInstallerPackage()
. Si el instalador
no está instalado de antemano, el sistema emite una
IllegalArgumentException
.
DISALLOW_MODIFY_ACCOUNTS
para el usuario.
DISALLOW_ADD_USER
. Esto evita que los usuarios creen usuarios secundarios no
administrados. A su vez, los métodos CreateUser()
y
createAndInitializeUser()
han sido dados de baja; los reemplaza el nuevo método
DevicePolicyManager.createAndManageUser()
.
DevicePolicyManagewr.getWifiMacAddress()
. Si nunca se habilitó la función Wi-Fi
en el dispositivo, este método devuelve un valor {@code null}.
Para obtener más información sobre los cambios de Android for Work en Android N, consulta Actualizaciones de Android for Work.
Android N soluciona un error por el cual la visibilidad de las anotaciones se había ignorado. Este problema permitió que el tiempo de ejecución accediera a anotaciones a las que no debía tener acceso. Entre estas anotaciones se incluyen las siguientes:
Si tu aplicación 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 {@code @Retention(RetentionPolicy.RUNTIME)}.
Debes probar tu aplicación para controlar que no tenga lugar este comportamiento. Puedes hacerlo produciendo un error idéntico al finalizarla manualmente a través del panel DDMS.
Las aplicaciones orientadas a Android N y versiones posteriores no finalizarán automáticamente por cambios en la densidad; sin embargo, es posible que respondan en forma deficiente a los cambios en la configuración.