Google I/O 2022 para Androides

Google IO 22 ALTEN
,

Hace unas semanas se celebró de nuevo de manera presencial la Google I/O 2022, evento anual donde el gigante tecnológico del buscador presenta las principales novedades de sus productos, plataformas y herramientas para el desarrollo de soluciones.

Los ingenieros de Google han puesto el enfoque en la mejora de la privacidad del usuario, rendimiento y optimización de las soluciones desarrolladas, así como puesta en valor de los nuevos (y no tan nuevos) dispositivos que hacen uso de Android.

Este evento nos ha dejado grandes anuncios y metas a medio plazo que deberán tenerse en cuenta por los profesionales del sector, ya sean desarrolladores o diseñadores de experiencias de usuario.

Android 13

Aunque Google ya no lo pregone mucho, las versiones de Android siguen teniendo nombre de dulces, y Android 13 también es conocido por Android Tiramisú.

Esta versión viene enfocada en la privacidad del usuario a través de nuevos permisos de uso a tener en cuenta así como niveles de restricción de servicios, lo que supondrá nuevos retos para los desarrollos en nuestros proyectos.

Nuevo permiso de notificaciones

Android 13 introduce un nuevo permiso en tiempo de ejecución para enviar notificaciones (salvo las notificaciones multimedia) para ayudar a los usuarios a centrarse en las notificaciones que realmente les resulten importantes.


    
    
        ...
    

Por lo tanto, esto nos obligara a gestionar si este permiso está habilitado por el usuario llamando a areNotificationsEnabled() y gestionar los flujos de envío de notificaciones, ya que en cualquier momento el usuario puede revocar el permiso.

Adiós a la era de las pushes masivas y sin control.

Nuevo permiso de Wi-Fi cercanos

Android 13 también introduce este permiso NEARBY_WIFI_DEVICES para que las aplicaciones que administran conexiones con un punto de acceso cercano no hagan uso del permisos de ubicación ACCESS_FINE_LOCATION, facilitando la justificación del acceso de una aplicación a estos dispositivos.

Sin embargo al integrarlo hay que indicar si se usa la API de Wi-Fi para obtener información de la ubicación del dispositivo.


    
    
    

    
        ...
    

Para proporcionar retrocompatibilidad con versiones anteriores, hay que establecer la API 32 máxima para el permiso ACCESS_FINE_LOCATION.

A pesar de este nuevo permiso, varias APIs de Wi-Fi todavía dependen de ACCESS_FINE_LOCATION, por lo que habrá que indicar ambos permisos en el manifiesto durante un tiempo hasta la migración total de la misma.

Separación de permisos media

A partir de Android 13 estarán obsoletos los permisos READ_EXTERNAL_STORAGE y WRITE_EXTERNAL_STORAGE. La alternativa propuesta son los nuevos permisos media: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO.

Si el usuario tiene ya el permiso aceptado en el dispositivo antes de actualizar no se le mostrara el diálogo de permisos. Hay que asegurarse indicar a los permisos obsoletos el atributo maxSdkVersion=32 si la aplicación está dirigida a Android 13.

Selector de Fotos

Photo Picker es la solución propuesta para el acceso de fotos y videos desde nuestras aplicaciones, proporcionando una interfaz estándar, sin mantenimiento, fácil de integrar y que no necesita permisos de ejecución.

Tendrá compatibilidad con las versiones 11 y 12 de Android, siendo continuamente mejorado a través de las actualizaciones de sistema de Google Play.

// Seleccionar una imagen
val singlePickIntent = Intent(MediaStore.ACTION_PICK_IMAGES)

startActivityForResult(singlePickIntent, PHOTO_PICKER_REQUEST_CODE)

// Seleccionar múltiples imágenes
val maxNumPhotosAndVideos = 10
val multiplePickIntent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)

startActivityForResult(multiplePickIntent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)

// Seleccionar un video
val singleVideoIntent = Intent(MediaStore.ACTION_PICK_IMAGES)
singleVideoIntent.type = "video*"

startActivityForResult(singleVideoIntent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE)

// Recoger la información de la petición
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        REQUEST_PHOTO_PICKER_SINGLE_SELECT -> {
            val currentUri: Uri = data.data
            return
        }
        REQUEST_PHOTO_PICKER_MULTI_SELECT -> {
            var i = 0
            while (i < data.clipData?.itemCount ?: 1) {
                //TODO 
            }
    }

Uso de recursos de batería

Con la llegada de esta nueva versión del SO móvil, se presenta una serie de medidas de cara a la preservación de la batería de los dispositivos: reglas actualizadas en el momento en el que el sistema ubica a una aplicación en la zona restringida App Standby, de qué forma una interacción del usuario permite salir a la aplicación de esta zona restringida y las nuevas limitaciones para el uso restringido de batería en segundo plano, que aparecerán dentro de la aplicación del sistema:

  • Sin restricciones: Permite los trabajos en segundo plano, consumiendo más batería
  • Optimizado: Opción predeterminada que optimiza la capacidad de realizar trabajos en segundo plano, según el usuario interactúa con la aplicación:
    • Activo
    • Parte del trabajo
    • Frecuente
    • Raro
  • Restringida: Prioriza la duración de batería del dispositivo, estableciendo más limitaciones de lo que puede hacer una aplicación en segundo plano.

Nuevo gesto de retroceso predictivo

Se ha añadido una nueva API para el nuevo gesto de retroceso predictivo, que permitirá obtener al usuario una vista previa del resultado de volver a atrás antes de completarlo

Podemos dar soporte a esta funcionalidad a partir de la versión 1.6.0 de AppCompat de Androidx.

  • Primero tendremos que habilitar la funcionalidad en AndroidManifest.xml
    
    ...
    
  • Registrar un callback al onBackPressedDispacher
    class FormFragment : Fragment(){
        
        override fun onViewCreated(view: View, savedInstanceState: Bundle?){
            val binding = FormFragmentBinding.bind(view)
            
            val callback = requireActivity().onBackPressedDispatcher.addCallback(
                owner = viewLifecycleOwner,
                enabled = false,
            ){
                // TODO Confirmation action
            }
            
            binding.editText.doAfterTextChanged{ text ->
                callback.isEnable = !text.isNullOrEmpty()
            }    
        }
        
    }

Large Screens

Durante toda la Google I/O 2022 se han sucedido múltiples sesiones enfocadas tanto para desarrolladores como para diseñadores de UI/UX haciendo mucho hincapié en comenzar a enfocar las aplicaciones Android no sólo para smartphones o tablets, sino también a dispositivos plegables que ya están saliendo al mercado como para entornos de escritorio.

A nivel de tamaños, los diseñadores de Material proponen tres grandes grupos de tamaño para las UIs: Compact (dispositivos cuyo ancho sea menor a 600dp), Medium (ancho entre los 600dp y 840dp) y Expanded (mayores que 840dp de ancho).

También aconsejan a nivel de diseño en principio hacer uso para cada tamaño de diferentes controladores de navegación: BottomNavigationView para el tamaño Compat, NavigationRailView para el tamaño Medium y el clásico NavigationView.

Pero no sólo hablamos de aspectos visuales, también entran en juego nuevas características que traen estos dispositivos o las últimas versiones de Android, como es la Incrustación de Actividades (lo que permitirá tener varias activities de nuestra aplicación ejecutándose a la vez), o tener en cuenta para los dispositivos plegables controlar el estado apertura, por lo que su tamaño varía.

Para todos estos retos, los ingenieros de Android nos traen diferentes herramientas y soluciones como WindowManager, SlidingPaneLayout, NavigationRail en Material, DragAndDrop, CameraX preparada para estos escenarios y el nuevo emulador redimensionable, que permitirá de forma rápida y sencilla ver como se adapta nuestra aplicación a los diferentes escenarios de pantalla.

Privacy Sandbox

Google presentó hace tres años la iniciativa Privacy Sandbox, cuyo objetivo es desarrollar nuevas soluciones de publicidad mejorando la privacidad del usuario sin poner en riesgo el acceso al contenido y la gratuidad de los servicios.

En este Google I/O 2022, han presentado la hoja de ruta para su adecuación en el sistema operativo Android, proponiendo dos soluciones clave: un entorno de ejecución de SDK y un conjuntos de APIs para preservar la privacidad.

Entorno de ejecución de SDK

A partir de Android 13, se añade la capacidad de que los SDKs de terceros puedan ejecutarse en un entorno dedicado y no en el propio de la aplicación que la integre, haciendo posible gestionar los permisos de uso de datos proporcionando garantías de uso y protección de los datos de usuario.

Esto conllevará nuevas soluciones por parte de los desarrolladores de estas SDKs, que deberán publicar sus soluciones en la tienda de aplicaciones.

Conjunto de APIs

Para dar cobertura a los casos de publicidad principales sin depender de identificadores entre apps, Privacy Sandbox propone el siguiente conjunto de APIs que permiten personalizar y medir anuncios

  • API de Temas. Infieren indicadores de interés general basados en las aplicaciones del dispositivo del usuario, pudiendo los SDKs de publicidad hacer uso de estos temas para proporcionar anuncios relevantes a los usuarios.
  • API FLEDGE. Es el acrónimo de First Locally-Executed Decision over Groups Experiment, y proporciona una nueva forma de mostrar anuncios personalizados, almacenando la información en local para el uso de la publicidad y los anuncios asociados, proporcionando un framework para organizar los flujos de trabajo.
  • API de Informes de atribución. Admitirán la medición de conversiones, casos de optimización y aprendizaje automático además de la detección de actividad no válida.

Health Connect

Es una nueva plataforma y API creada en estrecha colaboración entre Google y Samsung para entre otros cometidos simplificar la conectividad y compartición de datos de salud y actividad física entre aplicaciones, manteniendo la seguridad y compatibilidad a través de todo el ecosistema Android. Estará disponible a finales de este 2022.

Esta API define los datos en diferentes categorías:

  • Actividad. Captura cualquier actividad que realice el usuario, como correr, nadar y meditar, y datos de sueño.
  • Sueño. Captura los datos en intervalos relacionados con la duración y el tipo de sueño de un usuario.
  • Nutrición. Captura los tipos de datos de hidratación y nutrición.
  • Ciclo menstrual. Registra los ciclos menstruales y los datos relacionados, como el resultado binario de una prueba de ovulación.
  • Corporales. Captura datos comunes relacionados con el organismo. Incluye el registro del peso o la tasa metabólica basal de un usuario.
  • Constantes vitales. Registra información esencial sobre la salud general del usuario. Incluye desde la glucemia hasta la temperatura corporal y la saturación de oxígeno en sangre.

Mediante permisos de lectura y escritura podremos hacer uso de los datos recogidos por nuestra aplicación u otras aplicaciones instaladas en el dispositivo móvil.

Android Jetpack

En búsqueda de la excelencia, optimización y rendimiento. Este es el enfoque de las nuevas bibliotecas del conjunto y actualizaciones de las ya existentes de Jetpack, el marco para desarrollar siguiendo las prácticas recomendadas, reduciendo código y aumentando la calidad de las aplicaciones, haciendo posible aplicaciones coherentes sea cual sea el dispositivo y versión de Android.

Rendimiento

En cuanto al rendimiento tenemos las siguientes novedades:

  • JankStats (Alpha). Permitirá realizar seguimiento y análisis de problemas de bloqueo de UI en nuestras apps, así como identificación de problemas de rendimiento, siendo retrocompatible con la API 16 de Android.
  • Baseline Profiles (Beta). Permitirá la posibilidad de incluir una lista de clases y métodos para compilar previamente rutas críticas del código máquina para su ejecución en Android Runtime. Es una forma de optimización guiada por perfil (PGO) permitiendo mejorar el rendimiento para los usuarios finales. Estos perfiles básicos son generados mediante la biblioteca Macrobenchmark.
  • Macrobenchmark. Esta biblioteca de testing permite probar casos de uso grandes como son el inicio de la aplicación, manipulación de UIs complejas, desplazamientos de un RecyclerView o animaciones. Generan perfiles básicos para optimizar el rendimiento de dichos casos.
  • Microbenchmark. Permite obtener rápidamente comparativas del código dentro de Android Studio. Se encarga de la preparación, medición del rendimiento y los recuentos de asignaciones, así como generar los resultados de comparativas.
  • Tracing. Escribe eventos de seguimiento en el registro de trazas del sistema, siendo compatible con la API 14 de Android. Permite visualizar los datos recogidos en herramientas como Perfetto.

Componentes

Muchas actualizaciones en las bibliotecas de componentes:

  • Room. La nueva versión de la biblioteca de base de datos da soporte a Kotlin 1.6, y estará escrita íntegramente en este lenguaje a partir de la versión 2.5.0. Incluye soporte en las consultas relacionales a Multi-Map, NestedMap o Array, además de simplificar las migraciones.
  • Paging3. Nuevos callbacks más comprensivos así como mejoras manejando datos inválidos.
  • Navigation. Incluye soporte estable con múltiples pilas hacia atrás, soporte para SlidingPaneLayout así como mejor integración con Compose.
  • DataStore. Por fin es estable la nueva solución de almacenamiento de datos de tipo clave-valor y objetos sencillo, además de búferes de protocolo. Usando de manera nativa Corrutinas y Flow de Kotlin, DataStore puede manejar los flujos de almacenamiento de manera asíncrona, coherente y transaccional. Viene a quitarle el trono a las clásicas SharedPreferences.

UI y Media

Estandarización de uso de Camara y Video, así como integración con diferentes escenarios de pantallas:

  • WindowManager. Viene a dar soporte a los diversos tamaños y tipos de dispositivos, plegables, así como escenarios multi-pantalla.
  • Drag&Drop. Permitirá a los usuarios mover datos (cualquier contenido representable por una URI) con gestos interactivos de arrastrar y soltar, ya sea entre diferentes vistas de la pantalla, dentro de la propia aplicación o en el modo multiventana entre aplicaciones diferentes.
  • AppCompat. Esta biblioteca sigue incluyendo compatibilidad y mejoras para las versiones antiguas de Android con respecto a las últimas funcionalidades incluidas en el SO.
  • CameraX. La nueva versión incluye soporte para grabación de video en HDR, además de mejoras de rendimiento y adaptación a los diferentes escenarios de pantalla.
  • Media3 (Alpha). Si conoces la biblioteca Exoplayer, te presento a su gemelo, capa de abstracción proporcionada por Google para simplificar la integración de la reproducción de audio, video y streaming.

Compose

Presentada la versión 1.2 Beta del framework declarativo para la implementación de IUs, Jetpack Compose. En esta versión se incluye la interoperabilidad de desplazamientos anidados, uso de fuentes descargables, inserciones de ventanas, LazyGrids y otras novedades.

Con LazyGrids podremos de forma sencilla trabajar con grupos de elementos en cuadrículas, tanto verticales como horizontales, lapsos, etc. Veamos un ejemplo de implementación con LazyVerticalGrid:

LazyVerticalGrid(
    colums = GridCells.Fixed(2),
    horizontalArrangement = Arrangement.spacedBy(24.dp),
    verticalArrangement = Arrangement.spacedBy(24.dp),
){
    items(plants) { plant ->
        PlantCard(plant)
    }
}

Si no lo conocéis, existe un proyecto de software libre de Google paralelo a Compose llamado Accompanist, que no es otra cosa que una librería de utilidades y extensiones sobre Compose fundacional, ya que muchos de los componentes visuales que trae esta biblioteca pasarán a futuro a Compose directamente, como son Pager, Placeholder o SwipeToRefresh entre otras funcionalidades.

En Android Studio Chipmunk se ha introducido la herramienta Animation Preview, lo que nos permitirá depurar los frames de las animaciones que implementemos en nuestra funciones componibles.

Además futuras versiones del IDE de desarrollo se podrá trabajar con las Ediciones en Vivo, lo que nos permitirá acelerar aún más el desarrollo de las UIs de nuestras aplicaciones.

La última gran novedad sobre Compose ha sido la versión Wear, aún en versión Beta, pero que promete la misma revolución y simplicidad en la implementación de las interfaces de usuario de forma declarativa.

Incluye los principales componentes de Material Design para los componentes visuales clásicos de WearOS, como son ScalingColumn, Picker, Stepper, Dialog, CircularProgressIndicator, etc.

Tal como ocurre con Compose y Accompanist, Compose Wear tiene su proyecto de software libre homónimo llamado Horologist, que provee de extensiones útiles para el desarrollo de las aplicaciones de WearOS, como son MediaUI, DatePicker, TimePicker, TimeText, PositionIndicator entre otros componentes.

Otros anuncios

Además de todo lo comentado, son muchas más las tecnologías, APIs y funcionalidades nuevas que se han presentado durante la Google I/O 2022. A modo de resumen:

  • Blockstore. Interfaz simple y segura para preservar y transferir tokens de acceso entre dispositivos.
  • Autenticación FIDO. Passkeys como solución al estándar FIDO (Fast Identify Online) para definir un nuevo mecanismo rápido y seguro de acceso tanto para sitios web como en aplicaciones, cuyo objetivo es eliminar la introducción de datos sensibles como nombres o contraseña. Mediante una clave de acceso vinculada a un origen (web o aplicación) y al dispositivo físico podremos acceder a su uso.
  • App Actions. Estas acciones definidas para nuestras aplicaciones pueden ser asociadas a funcionalidades concretas, para que mediante Google Assistant ofrezcamos al usuario soluciones con nuestras aplicaciones. Esta tecnología es compatible con Android Auto/Automotive así como los asistentes de voz y búsqueda de la gran G.
  • Machine Learning. Se han anunciado mejoras en todas las APIs (MLKit, CustomML, Text Recognition, etc) así como la posibilidad de entrenar y usar modelos de TensorFlow Lite a nivel local de nuestras aplicaciones.
  • ARCore GeoSpatial API. Nos va a permitir utilizar modelos 3D de Google Earth y Street View para habilitar experiencias de realidad aumentada inmersivas basadas en la ubicación del usuario.
  • Play Billing 5.0. Presentado el nuevo flujo de pagos que tendrá soporte con la nueva versión de la biblioteca PlayBilling, haciendo que la api 3.0 sea obsoleta a finales de año.

Conclusión

Como hemos visto, son muchísimas las novedades que ya han llegado (y otras muchas que vienen) para garantizar la mejor de las experiencias para los usuarios respetando la privacidad de su información.

El ecosistema de desarrollo Android ha alcanzado un gran nivel de madurez gracias al impulso de la comunidad con Kotlin y de los ingenieros de Google que están dando soporte con las bibliotecas de Jetpack y nuevas APIs, aportando además mucha documentación, así como codelabs y videos dentro del programa Modern Android Development con la que facilitar a los profesionales la adaptación a los nuevos paradigmas de programación y tecnologías incipientes.

Referencias

Javier Rodríguez,
Android Tech Leader