Android 7.0 para desarrolladores

Android 7.0 Nougat presenta una variedad de funciones y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.

Asegúrate de revisar los cambios de comportamiento de Android 7.0 para obtener información sobre las áreas en las que los cambios en la plataforma podrían afectar tus apps.

Para obtener más información acerca de las funciones para consumidores de Android 7.0, visita www.android.com.

Compatibilidad con ventanas múltiples

En Android 7.0, incorporamos en la plataforma una nueva y muy solicitada función multitarea: la compatibilidad con el modo multiventana.

Los usuarios ahora pueden abrir dos apps al mismo tiempo en la pantalla.

  • En teléfonos y tablets con Android 7.0, los usuarios pueden ejecutar dos apps en paralelo o una encima de la otra en el modo de pantalla dividida. Los usuarios pueden cambiar el tamaño de las aplicaciones arrastrando la línea divisoria que se encuentra entre ellas.
  • En los dispositivos Android TV, las apps pueden habilitar de forma automática el modo de pantalla en pantalla, lo que les permite seguir mostrando contenido mientras el usuario explora otras apps o interactúa con ellas.
Dispositivos móviles que ejecutan apps en el modo de pantalla dividida

Figura 1: Apps que se ejecutan en el modo de pantalla dividida

En particular en las tablets y otros dispositivos con pantallas más grandes, la compatibilidad con el modo multiventana te brinda nuevas formas de atraer a los usuarios. Incluso puedes habilitar la función de arrastrar y soltar en tu app para permitir que los usuarios arrastren contenido desde o hacia ella de manera conveniente, lo que es una excelente manera de mejorar su experiencia.

Es sencillo agregar compatibilidad con el modo multiventana a tu app y configurar la manera en que controla la visualización multiventana. Por ejemplo, puedes especificar las dimensiones mínimas permitidas de tu actividad y evitar así que los usuarios cambien el tamaño de la actividad por debajo de ese tamaño. También puedes inhabilitar la visualización multiventana para tu app, lo que garantiza que el sistema solo muestre tu app en el modo de pantalla completa.

Para obtener más información, consulta la documentación para desarrolladores Compatibilidad con el modo multiventana.

Mejoras en las notificaciones

En Android 7.0, rediseñamos las notificaciones para facilitar y agilizar su uso. Entre los cambios, se incluyen los siguientes:

  • Actualizaciones de plantillas: Actualizamos las plantillas de notificaciones para poner nuevo énfasis en la hero image y el avatar. Los desarrolladores podrán aprovechar las nuevas plantillas con una cantidad mínima de ajustes en el código.
  • Personalización del estilo del mensaje: Puedes personalizar más etiquetas de la interfaz de usuario asociadas con tus notificaciones usando la clase MessagingStyle. Puedes configurar el mensaje, el título de la conversación y la vista de contenido.
  • Notificaciones agrupadas: El sistema puede agrupar mensajes, por ejemplo, por tema, y mostrar el grupo. Un usuario puede realizar acciones, como Descartar o Archivar, en ellos. Si implementaste notificaciones para Android Wear, ya estarás familiarizado con este modelo.
  • Respuesta directa: En el caso de las apps de comunicación en tiempo real, el sistema Android admite respuestas en línea para que los usuarios puedan responder rápidamente a un mensaje SMS o de texto directamente dentro de la interfaz de notificaciones.
  • Vistas personalizadas: Hay dos API nuevas que te permiten aprovechar las decoraciones del sistema, como los encabezados y las acciones de notificaciones, cuando usas vistas personalizadas en las notificaciones.
Dispositivo móvil que muestra notificaciones de mensajes agrupados
Dispositivo móvil que muestra una notificación de mensaje único
Dispositivo móvil que muestra una respuesta de mensaje intercalada en la interfaz de notificaciones

Figura 2: Notificaciones agrupadas y respuesta directa.

Para obtener información sobre cómo implementar las nuevas funciones, consulta la guía Notificaciones.

Compilación de JIT y AOT guiada por perfiles

En Android 7.0, agregamos un compilador Just in Time (JIT) con generación de perfiles de código para ART, lo que le permite mejorar constantemente el rendimiento de las apps para Android mientras se ejecutan. El compilador JIT complementa el compilador Ahead of Time (AOT) actual de ART y ayuda a mejorar el rendimiento del tiempo de ejecución, ahorrar espacio de almacenamiento y acelerar las actualizaciones de apps y del sistema.

La compilación guiada por perfil permite que ART administre la compilación de AOT/JIT de cada app según su uso real y las condiciones en el dispositivo. Por ejemplo, ART mantiene un perfil de los métodos directos de cada app y puede compilar previamente y almacenar en caché esos métodos para obtener el mejor rendimiento. A su vez, deja otras partes de la app sin compilar hasta que se usan.

Además de mejorar el rendimiento de partes clave de la app, la compilación guiada por perfil ayuda a reducir el espacio total en RAM de una app, incluidos los objetos binarios asociados. Esta función tiene particular importancia en los dispositivos de memoria reducida.

ART administra la compilación guiada por perfiles de una manera que minimiza el impacto en la batería del dispositivo. Realiza compilaciones previas únicamente cuando el dispositivo está inactivo y en proceso de carga, lo que permite ahorrar tiempo y batería, ya que realiza el trabajo con anticipación.

Ruta de acceso rápida a la instalación de aplicaciones

Uno de los beneficios más tangibles del compilador JIT de ART es la velocidad de instalación de apps y actualizaciones del sistema. Incluso las apps grandes que requerían varios minutos para la optimización y la instalación en Android 6.0 ahora pueden instalarse en cuestión de segundos. Las actualizaciones del sistema también son más rápidas, ya que no hay más paso de optimización.

Descanso sobre la marcha...

Android 6.0 introdujo Descanso, un modo del sistema que ahorra batería aplazando las actividades de CPU y red de las apps cuando el dispositivo está inactivo, como cuando se encuentra sobre una mesa o en un cajón.

Ahora, en Android 7.0, el modo Descanso va un paso más allá y ahorra batería sobre la marcha. Cada vez que la pantalla permanece apagada durante un tiempo y el dispositivo se desconecta, el modo Descanso aplica a las apps un subconjunto de las restricciones de CPU y red conocidas. Esto significa que los usuarios pueden ahorrar batería incluso cuando llevan sus dispositivos en los bolsillos.

Ilustración de cómo Descanso aplica un primer nivel de restricciones de actividad del sistema para prolongar la duración de batería

Figura 3: Descanso ahora aplica restricciones para prolongar la duración de batería, incluso cuando el dispositivo no está quieto.

Poco tiempo después de que la pantalla se apaga, cuando el dispositivo no está enchufado, Descanso restringe el acceso a la red y aplaza tareas y sincronizaciones. Durante períodos de mantenimiento breves, las aplicaciones tienen acceso a la red y se ejecuta cualquiera de sus tareas o sincronizaciones diferidas. Cuando se enciende la pantalla o se enchufa el dispositivo, se desactiva el modo Descanso.

Cuando el dispositivo vuelve a estar quieto, con la pantalla apagada y con la batería durante un tiempo determinado, Descanso aplica todas las restricciones de CPU y red en las alarmas PowerManager.WakeLock, AlarmManager y búsqueda de GPS o Wi-Fi.

Las prácticas recomendadas para adaptar tu app al modo Descanso son las mismas sin importar si el dispositivo está en movimiento o no. Por lo tanto, si ya la actualizaste para que controle correctamente la función Descanso, no tendrás que hacer nada más. De lo contrario, comienza a adaptarla al modo Descanso ahora.

Project Svelte: Optimizaciones en segundo plano

Project Svelte representa un esfuerzo continuo por minimizar el uso de memoria RAM por parte del sistema y las apps en los diferentes dispositivos Android del ecosistema. En Android 7.0, Project Svelte se enfoca en optimizar la forma en que las apps se ejecutan en segundo plano.

El procesamiento en segundo plano es esencial en la mayoría de las apps. Cuando se maneja de forma adecuada, puede hacer que la experiencia del usuario sea increíble: inmediata, rápida y pertinente al contexto. Cuando no se maneja de forma correcta, el procesamiento en segundo plano puede consumir innecesariamente RAM (y batería) y afectar el rendimiento del sistema de otras apps.

A partir de Android 5.0, JobScheduler es la manera preferida de realizar trabajos en segundo plano de manera conveniente para los usuarios. Las apps pueden programar tareas y, al mismo tiempo, permitir que el sistema se optimice según las condiciones de memoria, energía y conectividad. JobScheduler ofrece control y simplicidad, y nuestro deseo es que todas las apps lo usen.

Otra buena opción es GCMNetworkManager, que forma parte de los Servicios de Google Play, que ofrece una programación de tareas similar con compatibilidad con versiones heredadas de Android.

Seguimos ampliando JobScheduler y GCMNetworkManager para cumplir con más casos de uso. Por ejemplo, en Android 7.0, ahora puedes programar tareas en segundo plano según los cambios en los proveedores de contenido. Al mismo tiempo, comenzaremos a dar de baja algunos de los patrones anteriores que pueden reducir el rendimiento del sistema, en especial en dispositivos con poca memoria.

En Android 7.0, quitaremos tres transmisiones implícitas de uso general (CONNECTIVITY_ACTION, ACTION_NEW_PICTURE y ACTION_NEW_VIDEO), ya que pueden activar los procesos en segundo plano de varias apps a la vez y sobrecargar la memoria y la batería. Si tu app recibe estas actualizaciones, aprovecha Android 7.0 para migrar a JobScheduler y las API relacionadas.

Consulta la documentación Optimizaciones en segundo plano para obtener más detalles.

SurfaceView

Android 7.0 ofrece movimiento síncrono a la clase SurfaceView, que proporciona un mejor rendimiento de la batería que TextureView en ciertos casos: cuando se renderiza contenido de video o 3D, las apps con desplazamiento y posición de video animado usan menos energía con SurfaceView que con TextureView.

La clase SurfaceView permite lograr una composición más eficiente en cuanto a la batería en la pantalla, ya que se compone en hardware dedicado, independientemente del contenido de la ventana de la app. Como resultado, se hacen menos copias intermedias que con TextureView.

La posición del contenido de un objeto SurfaceView ahora se actualiza de forma síncrona con el contenido de la app que lo contiene. Un resultado de este cambio es que las traducciones o las escalas simples de un video que se reproduce en una SurfaceView ya no producen barras negras junto a la vista a medida que se mueve.

A partir de Android 7.0, te recomendamos que ahorres energía usando SurfaceView en lugar de TextureView.

Ahorro de datos

Ahorro de datos en Configuración

Figura 4: Ahorro de datos en Configuración.

Durante la vida útil de un dispositivo móvil, el costo de un plan de datos móviles suele superar el costo del propio dispositivo. Para muchos usuarios, los datos móviles son un recurso costoso que desean conservar.

Android 7.0 presenta el modo Ahorro de datos, un nuevo servicio del sistema que ayuda a reducir el uso de datos móviles por parte de las apps, ya sea en roaming, cerca del final del ciclo de facturación o en un pequeño paquete de datos prepago. El Ahorro de datos permite que los usuarios controlen la manera en que las apps usan los datos móviles y que los desarrolladores proporcionen un servicio más eficiente cuando el Ahorro de datos está activado.

Cuando un usuario habilita Ahorro de datos en la Configuración y el dispositivo está conectado a una red de uso medido, el sistema bloquea el uso de datos en segundo plano y le indica a las apps que usen menos datos en primer plano siempre que sea posible, por ejemplo, limitando la tasa de bits para la transmisión, reduciendo la calidad de la imagen, aplazando el almacenamiento previo en caché optimista, etcétera. Los usuarios pueden permitir que apps específicas permitan el uso de datos medidos en segundo plano, incluso cuando está activado Ahorro de datos.

Android 7.0 extiende ConnectivityManager para proporcionar a las apps una forma de recuperar las preferencias de Ahorro de datos del usuario y supervisar los cambios en las preferencias. Todas las apps deben verificar si el usuario habilitó el Ahorro de datos y esforzarse por limitar el uso de datos en primer y segundo plano.

API de Vulkan

Android 7.0 integra VulkanTM, una nueva API de renderización en 3D, en la plataforma. Al igual que OpenGLTM ES, Vulkan es un estándar abierto para gráficos y procesamientos 3D mantenido por Khronos Group.

Vulkan se diseñó desde el principio para minimizar la sobrecarga de CPU en el controlador y permite que tu aplicación controle el funcionamiento de la GPU de manera más directa. Vulkan también permite una mejor paralelización, ya que permite que varios subprocesos realicen tareas a la vez, como la construcción del búfer de comandos.

Las herramientas y las bibliotecas de desarrollo de Vulkan son parte del SDK de Android 7.0. Por ejemplo:

  • Encabezados
  • capas de validación (bibliotecas de depuración);
  • compilador SPIR-V;
  • biblioteca de compilación de tiempo de ejecución de SPIR-V.

Vulkan solo está disponible para apps en dispositivos con hardware compatible con Vulkan, como Nexus 5X, Nexus 6P y Nexus Player. Estamos trabajando estrechamente con nuestros socios para que Vulkan esté disponible en más dispositivos lo antes posible.

Para obtener más información, consulta la documentación de la API.

Quick Settings Tile API

Mosaicos de Quick Settings en el panel de notificaciones

Figura 5: Tarjetas de Configuración rápida en el panel de notificaciones

Configuración rápida es una manera popular y simple de exponer configuraciones y acciones clave directamente desde el panel de notificaciones. En Android 7.0, expandimos el alcance de la Configuración rápida para que sea aún más útil y conveniente.

Agregamos más espacio para tarjetas adicionales de Configuración rápida, a las que los usuarios pueden acceder desde un área de visualización paginada deslizando el dedo hacia la izquierda o la derecha. También permitimos que los usuarios controlen qué mosaicos de Configuración rápida aparecerán y dónde se mostrarán. Los usuarios pueden agregar o mover tarjetas con solo arrastrarlas y soltarlas.

Para los desarrolladores, en Android 7.0 también se agrega una nueva API que te permite definir tus propios mosaicos de Configuración rápida para brindar a los usuarios acceso fácil a controles y acciones clave en tu app.

Las tarjetas de Configuración rápida se reservan para controles o acciones que se necesiten con urgencia o se usen con frecuencia, y no deben usarse como accesos directos para iniciar una app.

Una vez que hayas definido tus tarjetas, puedes dejarlas a los usuarios, quienes podrán agregarlas a la Configuración rápida con solo arrastrarlas y soltarlas.

Si quieres obtener información para crear una tarjeta de app, consulta la documentación de referencia de Tile.

Bloqueo de números

Android 7.0 ahora admite el bloqueo de números en la plataforma y proporciona una API de framework para que los proveedores de servicios mantengan una lista de números bloqueados. La app de SMS predeterminada, la app telefónica predeterminada y las apps de operadores tienen capacidad de lectura y escritura en la lista de números bloqueados. Otras apps no pueden acceder a la lista.

Al hacer que el bloqueo de números sea una función estándar de la plataforma, Android permite que las apps admitan de manera coherente el bloqueo de números en una amplia variedad de dispositivos. Entre los demás beneficios que pueden aprovechar las apps, se encuentran los siguientes:

  • Los números bloqueados en las llamadas también se bloquean en los mensajes de texto.
  • Los números bloqueados pueden persistir después de los restablecimientos y de los dispositivos mediante la función Copia de seguridad y restablecimiento.
  • Varias apps pueden usar la misma lista de números bloqueados.

Además, la integración de apps de proveedores a través de Android permite que estos lean la lista de números bloqueados del dispositivo y realicen bloqueos en el servicio para el usuario a fin de evitar que el usuario reciba llamadas y mensajes de texto no deseados por cualquier medio, como un extremo VoIP o teléfonos con desvío de llamadas.

Para obtener más información, consulta la documentación de referencia de BlockedNumberContract.

Filtración de llamadas

Android 7.0 permite que la app predeterminada de un teléfono filtre las llamadas entrantes. Para ello, la app para teléfonos implementa el nuevo CallScreeningService, que le permite realizar varias acciones según el Call.Details de una llamada entrante, como las siguientes:

  • rechazar la llamada entrante;
  • no permitir el ingreso de la llamada en el registro de llamadas;
  • no mostrar al usuario una notificación de la llamada.

Para obtener más información, consulta la documentación de referencia de CallScreeningService.

Compatibilidad con varias configuraciones regionales y más idiomas

Android 7.0 ahora permite a los usuarios seleccionar varias configuraciones regionales en Configuración para mejorar la compatibilidad con casos de uso bilingües. Las apps pueden usar una API nueva para obtener las configuraciones regionales seleccionadas del usuario y, luego, ofrecer experiencias más sofisticadas para los usuarios que usan varias configuraciones regionales, como mostrar resultados de la búsqueda en varios idiomas y no ofrecer traducir páginas web en un idioma que el usuario ya conozca.

Además de la compatibilidad con varias configuraciones regionales, Android 7.0 también amplía la variedad de idiomas disponibles para los usuarios. Ofrece más de 25 variantes, cada una de ellas para idiomas de uso común, como el inglés, el español, el francés y el árabe. También agrega compatibilidad parcial con más de 100 idiomas nuevos.

Las apps pueden obtener la lista de configuraciones regionales que estableció el usuario llamando a LocaleList.GetDefault(). Para admitir la cantidad expandida de configuraciones regionales, en Android 7.0, se está cambiando la forma en que resuelve recursos. Asegúrate de probar y verificar que tus apps funcionen como se espera con la nueva lógica de resolución de recursos.

Para obtener más información sobre el nuevo comportamiento de resolución de recursos y las prácticas recomendadas que debes seguir, consulta Asistencia multilingüe.

Nuevos emojis

Android 7.0 presenta emojis adicionales y funciones relacionadas con estos, como emojis de tono de piel y compatibilidad con selectores de variación. Si tu app admite emojis, sigue las pautas que se indican a continuación para aprovechar estas funciones relacionadas con emojis.

  • Comprueba que el dispositivo tenga el emoji antes de insertarlo. Para comprobar qué emojis están presentes en la fuente del sistema, usa el método hasGlyph(String).
  • Comprueba que un emoji admita selectores de variación. Los selectores de variación te permiten presentar determinados emojis en color o en blanco y negro. En los dispositivos móviles, las apps deben representar los emojis en color en lugar de hacerlo en blanco y negro. Sin embargo, si tu app muestra los emojis intercalados con el texto, debe usar la variación de blanco y negro. A fin de determinar si un emoji tiene una variación, usa el selector de variación. Para obtener una lista completa de los caracteres con variaciones, consulta la sección de secuencias de variaciones de emojis de la documentación de Unicode sobre las variaciones.
  • Comprueba que el emoji admita el tono de piel. Android 7.0 permite a los usuarios modificar el tono de piel renderizado de los emojis según su preferencia. Las apps de teclado deben proporcionar indicaciones visuales para los emojis que tienen varios tonos de piel y permitir que los usuarios seleccionen el que prefieran. Para determinar qué emojis del sistema tienen modificadores de tono de piel, usa el método hasGlyph(String). Puedes determinar qué emojis usan tonos de piel en la documentación de Unicode.

Las ICU4J API en Android

Android 7.0 ahora ofrece un subconjunto de las API de ICU4J en el framework de Android, en el paquete android.icu. La migración es fácil y implica simplemente cambiar del espacio de nombres com.java.icu a android.icu. Si ya usas un paquete ICU4J en tus apps, cambiar a las APIs de android.icu proporcionadas en el framework de Android puede reducir notablemente el tamaño del APK.

Para obtener más información sobre las APIs de ICU4J para Android, consulta Compatibilidad con ICU4J.

WebView

Chrome + WebView, juntos

A partir de la versión 51 de Chrome en Android 7.0 y versiones posteriores, el APK de Chrome de tu dispositivo se usa para proporcionar y renderizar WebViews del sistema Android. Este enfoque mejora el uso de memoria en el propio dispositivo y también reduce el ancho de banda necesario para mantener WebView actualizado (ya que el APK de WebView independiente dejará de actualizarse mientras Chrome permanezca habilitado).

Para elegir tu proveedor de WebView, habilita las opciones para desarrolladores y selecciona Implementación de WebView. Puedes usar cualquier versión compatible de Chrome (Dev, Beta o estable) que esté instalada en tu dispositivo o el APK de WebView independiente para que actúe como la implementación de WebView.

Multiproceso

A partir de la versión 51 de Chrome en Android 7.0, WebView ejecutará contenido web en un proceso de zona de pruebas separado cuando se habilite la opción para desarrolladores "Multiprocess WebView".

Esperamos recibir comentarios sobre la compatibilidad y el rendimiento del tiempo de ejecución en N antes de habilitar Multiprocess WebView en una versión futura de Android. En esta versión, pueden darse regresiones en el tiempo de inicio, uso total de memoria y rendimiento de la renderización de software.

Si encuentras problemas inesperados en el modo de multiprocesos, nos gustaría conocerlos. Comunícate con el equipo de WebView en la herramienta de seguimiento de errores de Chromium.

Ejecución de Javascript antes de la carga de página

A partir de las apps orientadas a Android 7.0, el contexto de JavaScript se restablecerá cuando se cargue una página nueva. Actualmente, el contexto de la primera página cargada se mantiene en una instancia de WebView nueva.

Los desarrolladores que deseen introducir JavaScript en WebView deben ejecutar la secuencia de comandos después de que la página haya comenzado a cargarse.

Ubicación geográfica en orígenes inseguros

A partir de las apps orientadas a Android 7.0, la API de ubicación geográfica solo se permitirá en orígenes seguros (en HTTPS). Esta política se diseñó para proteger la información privada de los usuarios cuando usen una conexión no segura.

Pruebas con WebView Beta

WebView se actualiza con frecuencia, por lo que te recomendamos que pruebes la compatibilidad con tu app con frecuencia usando el canal beta de WebView. Para comenzar a probar las versiones previas al lanzamiento de WebView en Android 7.0, descarga e instala Chrome Dev o Chrome Beta, y selecciónalo como implementación de WebView en las opciones para desarrolladores, tal como se describió anteriormente. Informa los problemas mediante la herramienta de seguimiento de errores de Chromium para que podamos corregirlos antes de que se lance una nueva versión de WebView.

API de OpenGLTM ES 3.2

En Android 7.0, se agregan interfaces de framework y compatibilidad de plataforma para OpenGL ES 3.2. Se incluye lo siguiente:

  • Todas las extensiones del Paquete de extensiones de Android (AEP), excepto EXT_texture_sRGB_decode
  • búferes de fotogramas de punto flotante para HDR y sombreado aplazado;
  • llamadas a draw a través de BaseVertex para mejorar el procesamiento por lotes y la transmisión;
  • sólido control de acceso a búfer para reducir la sobrecarga de WebGL.

En Android 7.0, la API de framework para OpenGL ES 3.2 se proporciona con la clase GLES32. Cuando uses OpenGL ES 3.2, asegúrate de declarar el requisito en tu archivo de manifiesto, con la etiqueta <uses-feature> y el atributo android:glEsVersion.

Para obtener información sobre el uso de OpenGL ES, incluida la manera de comprobar la versión de OpenGL ES que admite el dispositivo durante el tiempo de ejecución, consulta la guía de la API OpenGL ES.

Grabación de Android TV

Android 7.0 agrega la capacidad de grabar y reproducir contenido de los servicios de entrada de Android TV a través de las nuevas APIs de grabación. A partir de las APIs existentes de pausa en directo, los servicios de entrada de TV pueden controlar qué datos de canales se pueden grabar y cómo se guardan las sesiones grabadas, y administrar la interacción del usuario con el contenido grabado.

Para obtener más información, consulta las APIs de grabación de Android TV.

Android for Work

Android for Work agrega muchas funciones y API nuevas para dispositivos con Android 7.0. A continuación, se incluyen algunos aspectos destacados. Para obtener una lista completa de las funciones, consulta la Lista de funciones de Android Enterprise.

Comprobación de seguridad para perfiles de trabajo

Los propietarios de perfiles orientados al SDK de N pueden especificar una comprobación de seguridad independiente para las apps que se ejecutan en el perfil de trabajo. La comprobación para perfiles de trabajo se muestra cuando un usuario intenta abrir apps de trabajo. Cuando la comprobación de seguridad es exitosa, se desbloquea el perfil de trabajo y se desencripta si es necesario. En el caso de los propietarios de perfiles, ACTION_SET_NEW_PASSWORD le solicita al usuario que configure una verificación de trabajo, y ACTION_SET_NEW_PARENT_PROFILE_PASSWORD le solicita que configure un bloqueo de dispositivo.

Los propietarios de perfiles pueden establecer políticas de contraseñas distintas para la comprobación de trabajo (por ejemplo, la longitud que debe tener el PIN o si se puede usar una huella dactilar para desbloquear el perfil) con setPasswordQuality(), setPasswordMinimumLength() y métodos relacionados. El propietario del perfil también puede establecer el bloqueo del dispositivo usando la instancia de DevicePolicyManager que muestra el nuevo método getParentProfileInstance(). Además, los propietarios de perfiles pueden personalizar la pantalla de credenciales para la comprobación de trabajo mediante los nuevos métodos setOrganizationColor() y setOrganizationName().

Desactivación del modo de trabajo

En dispositivos con perfil de trabajo, los usuarios pueden alternar el modo de trabajo. Cuando el modo de trabajo está desactivado, el usuario administrado se cierra temporalmente, lo que inhabilita las apps del perfil de trabajo, la sincronización en segundo plano y las notificaciones. Esto incluye la aplicación del propietario del perfil. Cuando el modo de trabajo está desactivado, el sistema muestra un ícono de estado persistente para recordarle al usuario que no puede iniciar apps de trabajo. El selector indica que no se puede acceder a las apps ni los widgets de trabajo.

Always on VPN

Los propietarios de dispositivos y perfiles pueden asegurarse de que las apps de trabajo siempre se conecten a través de una VPN especificada. El sistema inicia automáticamente esa VPN después de que se inicia el dispositivo.

Los nuevos métodos DevicePolicyManager son setAlwaysOnVpnPackage() y getAlwaysOnVpnPackage().

Debido a que los servicios de VPN pueden vincularse directamente a través del sistema sin interacción con apps, los clientes de VPN deben controlar puntos de entrada nuevos para VPN siempre activada. Al igual que antes, los servicios se indican al sistema con una acción de coincidencia de filtro de intents android.net.VpnService.

Los usuarios también pueden configurar de forma manual clientes de VPN siempre activada que implementen métodos VPNService mediante Configuración> Más> Vpn. La opción para habilitar la VPN siempre activada desde la configuración solo está disponible si el cliente de VPN se orienta al nivel de API 24.

Aprovisionamiento personalizado

Una aplicación puede personalizar los flujos de aprovisionamiento del propietario del perfil y del propietario del dispositivo con logotipos y colores corporativos. DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR personaliza el color del flujo. DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI personaliza el flujo con un logotipo corporativo.

Mejoras de accesibilidad

Android 7.0 ahora ofrece Vision Settings directamente en la pantalla de bienvenida para la configuración de dispositivos nuevos. Esto permite que los usuarios descubran y configuren con mayor facilidad las funciones de accesibilidad en sus dispositivos, como el gesto de ampliación, el tamaño de fuente, el tamaño de pantalla y TalkBack.

Cuando estas funciones de accesibilidad tienen una posición más destacada, es más probable que los usuarios prueben tu app con ellas habilitadas. Asegúrate de probar tus apps antes con esta configuración habilitada. Puedes habilitarlas en Configuración > Accesibilidad.

Además, en Android 7.0, los servicios de accesibilidad ahora pueden ayudar a los usuarios con discapacidades motrices a tocar la pantalla. La nueva API permite crear servicios con funciones como el seguimiento de rostros u ojos y la exploración por puntos, entre otros, para satisfacer las necesidades de esos usuarios.

Para obtener más información, consulta la documentación de referencia de GestureDescription.

Inicio directo

El inicio directo mejora los tiempos de inicio del dispositivo y permite que las apps registradas tengan una funcionalidad limitada, incluso después de un reinicio inesperado. Por ejemplo, si un dispositivo encriptado se reinicia mientras el usuario duerme, las alarmas, los mensajes y las llamadas entrantes registradas ahora pueden continuar notificando al usuario de la forma habitual. Esto también significa que los servicios de accesibilidad también pueden estar disponibles inmediatamente después de un reinicio.

El inicio directo aprovecha la encriptación basada en archivos en Android 7.0 a fin de habilitar políticas de encriptación detalladas para los datos del sistema y de la app. El sistema usa un almacenamiento encriptado por el dispositivo para datos del sistema seleccionados y datos de apps registrados de forma explícita. De forma predeterminada, se usa un almacén encriptado con credenciales para todos los demás datos del sistema, datos del usuario, apps y datos de apps.

Durante el inicio, el sistema se inicia en un modo restringido con acceso solo a datos encriptados por el dispositivo y sin acceso general a apps o datos. Si hay componentes que deseas ejecutar en este modo, puedes registrarlos configurando una marca en el manifiesto. Después del reinicio, el sistema activa componentes registrados transmitiendo el intent LOCKED_BOOT_COMPLETED. El sistema garantiza que estén disponibles los datos de apps encriptados por el dispositivo registrados antes del desbloqueo. Los demás datos no estarán disponibles hasta que el usuario confirme sus credenciales de pantalla de bloqueo para desencriptarlos.

Para obtener más información, consulta Inicio directo.

Certificación de claves

Android 7.0 presenta la certificación de claves, una nueva herramienta de seguridad que te ayuda a asegurarte de que los pares de claves almacenados en el almacén de claves con copia de seguridad en hardware del dispositivo protejan correctamente la información sensible que usa tu app. Cuando usas esta herramienta, aumentas la confianza en que tu app interactúa con claves que se encuentran en hardware seguro, incluso si el dispositivo que ejecuta tu app tiene permisos de administrador. Si usas claves del almacén de claves guardadas en hardware en tus apps, debes usar esta herramienta, especialmente si usas las claves para verificar información sensible dentro de la app.

La certificación de claves te permite verificar si se creó un par de claves RSA o EC y se almacenó en el almacén de claves con copia de seguridad en hardware del dispositivo, dentro del entorno de ejecución confiable (TEE) del dispositivo. La herramienta también te permite usar un servicio fuera del dispositivo, como el servidor de backend de tu app, para determinar y verificar de manera sólida los usos y la validez del par de claves. Estas funciones proporcionan un nivel adicional de seguridad que protege el par de claves, incluso si alguien otorga permisos de administrador al dispositivo o compromete la seguridad de la plataforma de Android que se ejecuta en el dispositivo.

Nota: Solo unos pocos dispositivos con Android 7.0 admiten la certificación de claves a nivel del hardware. En todos los demás dispositivos con Android 7.0, se usa esta certificación. Antes de verificar las propiedades de las claves guardadas en hardware de un dispositivo en un entorno de producción, debes asegurarte de que el dispositivo admita certificación de claves a nivel del hardware. Para ello, debes comprobar que la cadena de certificación contenga un certificado raíz firmado por la clave raíz de certificación de Google y que el elemento attestationSecurityLevel dentro de la estructura de datos de la descripción de la clave esté configurado en el nivel de seguridad de TrustedEnvironment.

Para obtener más información, consulta la documentación para desarrolladores sobre la certificación de claves.

Configuración de seguridad de la red

En Android 7.0, las apps pueden personalizar el comportamiento de sus conexiones seguras (HTTPS y TLS) de forma segura, sin modificar el código, mediante la Configuración de seguridad de la red declarativa, en lugar de usar las APIs programáticas convencionales propensas a errores (p.ej., X509TrustManager).

Funciones admitidas:

  • Anclas de confianza personalizadas. Permite personalizar qué autoridades de certificación (CA) son de confianza para sus conexiones de seguridad. Por ejemplo, confiar en certificados autofirmados particulares o un conjunto restringido de AC públicas.
  • Anulaciones de solo depuración. Permite que el desarrollador de una aplicación depure de forma segura conexiones de su aplicación sin riesgos adicionales para la base instalada.
  • Inhabilitación del tráfico de texto simple. Permite que una aplicación se proteja a sí misma del uso accidental de tráfico de texto simple.
  • Fijación de certificados: Esta es una función avanzada que permite a una aplicación limitar las claves de servidor en las que se puede confiar para conexiones seguras.

Para obtener más información, consulta Configuración de seguridad de red.

Entidad de certificación de confianza predeterminada

De forma predeterminada, las apps orientadas a Android 7.0 solo confían en los certificados proporcionados por el sistema y ya no confían en las autoridades certificadoras (CA) agregadas por el usuario. Las apps orientadas a Android 7.0 (nivel de API 24) que deseen confiar en las CA agregadas por usuarios deben usar la configuración de seguridad de red para especificar cómo se deben confiar en las CA del usuario.

Esquema de firma de APK v2

Android 7.0 presenta el esquema de firma de APK v2, un nuevo esquema de firma de apps que ofrece instalación de apps más rápidas y mayor protección contra alteraciones no autorizadas de archivos APK. De forma predeterminada, Android Studio 2.2 y el complemento de Android para Gradle 2.2 firman tu app con el esquema de firma de APK v2 y el esquema de firma tradicional, que usa la firma JAR.

Si bien recomendamos que apliques el esquema de firma de APK v2 a tu app, este esquema nuevo no es obligatorio. Si la app no se compila correctamente con el esquema de firma de APK v2, puedes inhabilitar el esquema nuevo. La inhabilitación del proceso hace que Android Studio 2.2 y el complemento de Android para Gradle 2.2 firmen tu app con el esquema de firma tradicional únicamente. Para firmar solo con el esquema tradicional, abre el archivo build.gradle a nivel del módulo y, luego, agrega la línea v2SigningEnabled false a tu configuración de firma de la versión:

  android {
    ...
    defaultConfig { ... }
    signingConfigs {
      release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
        v2SigningEnabled false
      }
    }
  }

Precaución: Si firmas la app con el esquema de firma de APK v2 y haces cambios adicionales en ella, se invalidará la firma. Por este motivo, usa herramientas como zipalign antes de firmar la app con el esquema de firma de APK v2, no después.

Para obtener más información, lee los documentos de Android Studio que describen cómo firmar una app en Android Studio y cómo configurar el archivo de compilación para firmar apps con el complemento de Android para Gradle.

Acceso a directorios determinados

En Android 7.0, las apps pueden usar nuevas API para solicitar acceso a directorios de almacenamiento externo específicos, incluidos los directorios de medios extraíbles, como tarjetas SD. Las nuevas APIs simplifican enormemente la forma en que tu aplicación accede a los directorios de almacenamiento externo estándar, como el directorio Pictures. Las apps de fotos, como las de fotos, pueden usar estas APIs en lugar de READ_EXTERNAL_STORAGE, que otorga acceso a todos los directorios de almacenamiento, o al framework de acceso al almacenamiento, que hace que el usuario navegue al directorio.

Además, las nuevas APIs simplifican los pasos que realiza un usuario para otorgar acceso a almacenamiento externo a tu app. Cuando usas las nuevas APIs, el sistema emplea una IU de permisos simple que detalla claramente a qué directorio la aplicación solicita acceso.

Si quieres obtener más información, consulta la documentación para desarrolladores sobre el acceso a directorios determinados.

Ayuda en las combinaciones de teclas

En Android 7.0, el usuario puede presionar Meta + / para activar una pantalla de combinaciones de teclas que muestra todas las combinaciones de teclas disponibles para el sistema y la app que esté en primer plano. El sistema recupera estas combinaciones de teclas automáticamente desde el menú de la app, si existen. También puedes proporcionar tus propias listas de combinaciones de teclas optimizadas para la pantalla. Para ello, anula el método onProvideKeyboardShortcuts().

Nota: La tecla Meta no está presente en todos los teclados. En un teclado de Macintosh, es la tecla Comando, en el teclado de Windows, es la tecla Windows y, en Pixel C y en los teclados del ChromeOS, es la tecla de Búsqueda.

Para activar la ayuda de combinaciones de teclas desde cualquier parte de tu app, llama a requestShowKeyboardShortcuts() desde la actividad relevante.

Custom Pointer API

Android 7.0 presenta la API de Custom Pointer, que te permite personalizar el aspecto, la visibilidad y el comportamiento del puntero. Esta función es especialmente útil cuando un usuario utiliza un mouse o un panel táctil para interactuar con objetos de la IU. El puntero predeterminado usa un ícono estándar. Esta API también incluye funcionalidades avanzadas, como el cambio de apariencia del ícono del puntero según los movimientos específicos del mouse o el panel táctil.

Para establecer un ícono de puntero, anula el método onResolvePointerIcon() de la clase View. Este método usa un objeto PointerIcon para dibujar el ícono que corresponde a un evento de movimiento específico.

Sustained Performance API

El rendimiento puede fluctuar drásticamente en las apps de larga duración, ya que el sistema limita los motores de sistema en chip a medida que los componentes del dispositivo alcanzan sus límites de temperatura. Esta fluctuación presenta un objetivo móvil para los desarrolladores de apps que crean apps de alto rendimiento y ejecución prolongada.

Para abordar estas limitaciones, Android 7.0 incluye compatibilidad con el modo de rendimiento sostenido, lo que permite que los OEM proporcionen sugerencias sobre las capacidades de rendimiento del dispositivo para las apps de larga duración. Los desarrolladores de apps pueden usar estas sugerencias para ajustar las apps y obtener un nivel coherente y predecible de rendimiento del dispositivo durante períodos prolongados.

Los desarrolladores de apps solo pueden probar esta nueva API en Android 7.0, en dispositivos Nexus 6P. Si deseas usar esta función, configura la marca de rendimiento sostenido de la ventana que deseas ejecutar en ese modo. Configura esta marca con el método Window.setSustainedPerformanceMode(). El sistema inhabilita automáticamente este modo cuando la ventana ya no está enfocada.

Compatibilidad RV

Android 7.0 agrega compatibilidad y optimizaciones de plataforma para un modo de RV nuevo con el objetivo de que los desarrolladores creen experiencias de RV de alta calidad para dispositivos móviles para los usuarios. Hay varias mejoras de rendimiento, como el acceso a un núcleo de CPU exclusivo para apps de RV. Dentro de tus apps, puedes aprovechar el seguimiento de cabeza inteligente y las notificaciones en sonido estéreo que funcionan para el modo RV. Lo más importante es que Android 7.0 proporciona gráficos de latencia muy baja. Para obtener información completa sobre la compilación de apps de RV para Android 7.0, consulta SDK de RV de Google para Android.

En Android 7.0, los desarrolladores de servicios de impresión ahora pueden mostrar información adicional sobre impresoras y trabajos de impresión individuales.

Al enumerar las impresoras individuales, un servicio de impresión ahora puede establecer íconos por impresora de dos maneras:

Además, puedes proporcionar una actividad por impresora para mostrar información adicional llamando a setInfoIntent().

Puedes indicar el progreso y el estado de los trabajos de impresión en la notificación correspondiente llamando a setProgress() y setStatus(), respectivamente.

API de Frame Metrics

La API de Frame Metrics permite que una app supervise el rendimiento de la renderización de la IU. La API proporciona esta capacidad mediante la exposición de una transmisión de API de Pub/Sub para transferir información sobre el tiempo de los fotogramas de la ventana actual de la app. Los datos que se muestran son equivalentes a los que muestra adb shell dumpsys gfxinfo framestats, pero no se limitan a los últimos 120 fotogramas.

Puedes usar la API de Frame Metrics para medir el rendimiento de la IU del nivel de interacción en producción sin una conexión USB. Esta API permite la recopilación de datos con un nivel de detalle mucho mayor que adb shell dumpsys gfxinfo. Este nivel de detalle mayor es posible porque el sistema puede recopilar datos para interacciones particulares en la app. No es necesario que el sistema capture un resumen global del rendimiento de toda la app ni borre ningún estado global. Puedes usar esta capacidad para recopilar datos de rendimiento y detectar regresiones en el rendimiento de la IU para casos de uso reales dentro de una app.

Para supervisar una ventana, implementa el método de devolución de llamada OnFrameMetricsAvailableListener.onFrameMetricsAvailable() y regístralo en esa ventana.

La API proporciona un objeto FrameMetrics, que contiene datos de tiempo que el subsistema de renderización informa sobre varios eventos importantes en el ciclo de vida de un fotograma. Las métricas admitidas son las siguientes: UNKNOWN_DELAY_DURATION, INPUT_HANDLING_DURATION, ANIMATION_DURATION, LAYOUT_MEASURE_DURATION, DRAW_DURATION, SYNC_DURATION, COMMAND_ISSUE_DURATION, SWAP_BUFFERS_DURATION, TOTAL_DURATION y FIRST_DRAW_FRAME.

Archivos virtuales

En versiones anteriores de Android, tu app podía usar el framework de acceso al almacenamiento para permitir que los usuarios seleccionaran archivos de sus cuentas de almacenamiento en la nube, como Google Drive. Sin embargo, no se podían representar los archivos que no tenían una representación directa en código de bytes; cada archivo debía proporcionar un flujo de entrada.

Android 7.0 agrega el concepto de archivos virtuales al framework de acceso al almacenamiento. La función de archivos virtuales permite que tu DocumentsProvider muestre los URI de documentos que se pueden usar con un intent ACTION_VIEW, incluso si no tienen una representación directa en código de bytes. Android 7.0 también te permite ofrecer formatos alternativos para los archivos del usuario, ya sean virtuales o de otro tipo.

Para obtener más información sobre cómo abrir archivos virtuales, consulta Cómo abrir archivos virtuales en la guía de marcos de trabajo de acceso al almacenamiento.