Con la llegada de Android 11, también tenemos una gran cantidad de novedades que ayudarán a los desarrolladores a integrarse con las nuevas funcionalidades.

También se mejoran algunos puntos que llevaban años pidiéndose, y se añaden nuevas librerías, así como funcionalidades a las ya existentes.

¿Quieres conocer las novedades? Aquí te hago un resumen

Novedades en la interfaz de Android 11

Window Insets

Ahora se aporta más informaciones acerca de los tipos de contenido que se están mostrando para ajustar mejor la UI.

La mayoría de los elementos anteriores están deprecados, y ahora es mucho más sencillo de usar:

view.setOnApplyWindowInsetsListener { view, insets ->

    // Comprobar si el teclado virtual está visible
    val imeVisible = insets.isVisible(WindowInsets.Type.ime())

    if (imeVisible) {
        val imeInsets = insets.getInsets(WindowInsets.Type.ime())
    }
}

Gracias a esto, podemos animar nuestra UI a la vez que aparece el teclado, escuchando cambios en los insets del teclado mediante un listener, o puedes realizar al animación de forma directa indicando las propiedades de la animación.

Conversaciones

Ahora hay un nuevo apartado en las notificaciones que corresponde a las conversaciones. Si tu App crea notificaciones sobre conversaciones con otras personas, ahora puedes usar esta sección.

Las notificaciones de conversaciones permiten marcarlas como prioritarias, de tal forma que aparezcan las primeras si queremos estar pendientes de algo.

Para usarlo:

val person = Person.Builder().build()
val shorcutInfo = ShortcutInfoCompat.Builder(this, "sampleShortcut")
    .setPerson(person)
    .setLongLived(true)
    .build()
ShortcutManagerCompat.pushDynamicShortcut(shortcutInfo)
NotificationCompat.Builder(this, "channel")
    .setShortcutId(shortcutInfo.id)
    .build()

Bubbles

Son burbujas flotantes, que al hacer click sobre ellas abren una mini-actividad donde puedes continuar con la conversación, pero realmente ocurre por encima de todo lo demás.

Se puede continuar con la conversación sin necesidad de navegar hasta la App en particular.

Anteriormente se hacía con una UI transparente pintada en la System Alert Window, ahora la forma preferida es el uso de Bubbles.

Se crea mediante el API de notificaciones, ya que está muy integrado con la feature de Conversaciones.

Esta Bubble tiene un conjunto de configuraciones. La más importante es la activity que se creará, que se configura así:

<activity
    android:name=".bubbles.BubbleActivity"
    android:theme="@style/AppThem.NoActionBar"
    android:label="@string/title_activity_bubble"
    android:resizeableActivty="true"
/>

Después se crea el intent para lanzarla:

val intent = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntennt.getActivity(context, 0, intent,...)

val shortcutInfo = ...
val bubbleMetadata = Notification.BubbleMetadata.Builder(shortcutInfo.id)

.
.
.

NotificationCompat.Builder(this, "channel")
     .setBubbleMetadata(bubbleMetadata)
     .setShortcutId(shortcutInfo.id)
     .build()

Privacidad

Data Access Auditing

Tenemos nuevas APIs para detectar qué puntos de nuestro código están accediendo a información sensible.

Esto es muy útil para Apps grandes, con mucho código, e incluso que usan muchas librerías de terceros.

Al final es difícil saber detectar qué partes de nuestro código están accediendo a información sensible del usario, o utilizando ciertos permisos.

Gracias a estas nuevas APIs, será todo mucho más sencillo.

One-Time Permissions

El usuario puede dar un permiso solo para el caso actual. Si se vuelve a necesitar ese permiso, volverá a pedirlo otra vez.

Muy probablemente no haga falta cambiar nada. Si ya estabas gestionando los permisos correctamente, donde ya tienes en cuenta que el usuario puede denegar ese permiso en cualquier momento desde Ajustes, entonces estás cubierto.

El permiso de localización se vuelve más restrictivo. Antes se podía aceptar el permiso de localización en primer plano y en background a la vez.

Ahora solo se permite aceptar el permiso de localización en primer plano en un diálogo desde la propia App. Y el permiso de localización en segundo plano ha de hacerse en la pantalla de Ajustes.

Además, a partir de ahora, si se otorga un permiso a una App, y el usuario no utiliza la App durante un tiempo determinado, ese permiso se resetea y se tendrá que otorgar nuevamente cuando se reabra la App.

Permisos para los servicios en foreground

Desde Android 10, si una App requiere que un servicio en foreground use el permiso de localización, esto había que definirlo en el AndroidManifest.

En Android 11 esto se extiende a la cámara y el micrófono.

<manifest>
    <service...
        android:foregroundServiceType="camera|microphone" />
</manfest>

Y muchas cosas más

Hay muchas otras actualizaciones sobre privacidad, pequeños detalles que tendrás que tener en cuenta si tu App usa esas características:

  • Restricciones en la visibilidad de las Apps instaladas: si necesitamos saber qué Apps están instaladas, necesitamos especificarlo en el Manifest, y hay distintas formas de filtrar cuáles en función de las necesidades.
  • Nuevas actualizaciones en el Scope Storage

Mejoras para desarrolladores

Wi-Fi Debugging

Podrás depurar con tu dispositivo conectándolo mediante la misma conexión inalámbrica en la que esté tu PC.

Actualmente hay que hacer de forma bastante manual activándolo en los ajuste del desarrollador y emparejar y conectar con el dispositivo. Pero en Android Studio 4.2 Canary ya se encuentra disponible para hacerlo de forma automática.

Anotaciones de nulidad

Esto es realmente importante para poder utilizar la nulidad de Kotlin de forma 100% efectiva.

En las últimas actualizaciones de Android ya se han añadido un montón de anotaciones.

Para todas estas nuevas modificaciones, y para que hay tiempo para adaptarse a ellas, han creado un par de nuevas anotaciones: @RecentlyNullable y @RecentlyNonNull.

Estas anotaciones mostrarán un warning, de tal forma que el código seguirá compilando, pero es muy recomendable solucionarlos para siguientes actualizaciones.

Por otro lado, las modificaciones antiguas usan @Nullable y @NonNull, que mostrarán errores de compilación.

Si utilizas Kotlin (que espero que sí, y si no puedes pasarte por mi training gratuito), aprovecha esto, porque van a reducir drásticamente tu número de NullPointerException.

Informe de motivos de crash

A partir de esta versión, puedes recuperar las razones por las que la App falló para después enviarlo a algún servicio, logearlo, lo que puedas necesitar hacer con ello.

Para ello:

val reasonsList = activityManager.getHistoricalProcessExitreasons(
    packageName, pid, max)

for (info in reasonsList){
     // info.reason
    // REASON_LOW_MEMORY, REASON_CRASH, REASON_ANR...
}

Los bug trackers podrían aprovecharse de esto para recuperar esta información, así que es posible que tarde o temprano puedas hacer uso de esto en tu propio bug tracker.

Lenguajes y librerías

Jetpack incluye ya más de 70 librerías, que se actualizan cada dos semanas.

Además, Kotlin es ya la preferencia oficial de Google para desarrollar Apps en Android, y están poniendo sus mayores esfuerzos para que podamos aprovechar toda su potencia en Android.

Enter las novedades más importantes tenemos:

Android es Kotlin Coroutines First

En caso de que aún siguieras usando AsyncTasks, déjame decirte que en Android 11 están deprecadas

Las corrutinas son la recomendación oficial del equipo de Android para hacer tareas que requieren un tiempo largo y deberían ejecutarse fuera del hilo principal.

Por ello, han incluido soporte para corrutinas en varias de sus librerías, entre ellas:

  • WorkManager
  • Lifecycle
  • Room

Todas las ventajas de Kotlin 1.4

Aunque aún no tenemos la versión final, Kotlin 1.4 está muy cerca, y esto mejorará en muchos aspectos la experiencia de los desarrolladores Android:

  • Auto completado mucho más rápido
  • Mejor inferencia de tipos
  • Function interfaces
  • Mejoras de calidad, como la posibilidad de mezclar argumentos por nombre y por posición

Dagger Hilt ya está aquí (o casi)

Ya tenemos disponible la versión Alpha de la nueva librería de inyección de dependencias que se integra totalmente con el framework de Android.

Está basada en Dagger, así que obtenemos toda la potencia de Dagger pero de forma mucho más sencilla. Prometen que no tenemos que saber nada de Dagger para usarla.

Google sabe que la inyección de dependencias es importante para mejorar la reusabilidad y simplificar el testing, así que han apostado por crear su solución integrada.

Para usarlo, necesitamos anotar el Application con la anotación @HiltAndroidApp

@HiltAndroidApp
class Myapplication : Application() {
    fun onCreate{
    }
}

Después, cualquiera de los componentes típicos del framework (Activity, Fragment, Service), puede ser marcado con @AndroidEntryPoint.

Mediante @Inject, inyectamos las dependencias que necesitamos.

@AndroidEntryPoint
class MyActivity : AppCompatActivity(){
    @Inject lateinit var bar: Bar
    ...
}

El ViewModel no está soportado por defecto en Hilt, pero se puede añadir una librería de JetPack qu lo hace muy sencillo.

Finalmente, para definir las dependencias, nos creamos módulos, e indicamos en qué componente queremos que se integre ese módulo.

Hay algunos creados por defecto, como el ApplicationComponent, que se usa para dependencias en las que toda la App necesita acceso:

@Module
@InstallIn(ApplicationComponent::class) 
object FooModule {
  @Provides
  fun provideBar(): Bar {...}
}

¿Te gustaría un artículo a fondo sobre esto? Cuéntame en los comentarios y crearé nuevo contenido para explicarlo. No olvides que es una Alpha, y que no es buena idea usarlo en producción aún.

App Startup, para acelerar el inicio de tu App

Una nueva libería para optimizar cómo se inicializan las librerías y de esa forma conseguir que las Apps arranquen más rápido.

Uno de los mayores problemas al cargar las librerías en la inicialización de una App es que tiene que crear Content Providers, que requieren una penalización en rendimiento importante.

En vez de crear Content Providers individuales, App Startup comparte ese Content Provider con todas las librerías, pudiendo reducir en gran medida ese impacto.

También es una Alpha actualmente.

Librería de Paging reescrita para Kotlin

Se ha reescrito la librería y han lanzando Paging 3, para hacerla funcional con las corrutinas de Kotlin y con Flow.

La integración es mucho más sencilla con todo el ecosistema de Jetpack y las funcionalidades incluidas para hacer todo más sencillo con Kotlin.

Es compatible con Paging 2 para hacer la migración muy sencilla, y también está en Alpha.

CameraX lanzada en Beta

CameraX permite crear Apps que hagan uso intensivo de la camara de forma sencilla y fiable, abstrayéndonos lo máximo posible de todas las diferencias que existen dependiendo del dispositivo.

La versión Beta ya está aquí, por tanto los cambios deberían ser mínimos ya ante su inminente lanzamiento.

Jetpack Compose es aún pre-alpha…

Pero acercándose.

Jetpack Compose es una nueva librería para escribir interfaces en Java, basada en Kotlin y reactiva.

Se acaba de lanzar la Developer Preview 2, y es necesario utilizar Android Studio 4.2 Canary para probarlo.

La previsión es que se lance la alpha este verano, y la versión final en algún momento de 2021.

Muchas otras novedades

También ha habido mejoras en la librería de WorkManager, con soporte para Corrutinas y mejoras en su usabilidad y rendimiento.

Navigation 2.3 incluye soporte para módulos de feaures dinámicas, que permite descargar partes de la App de forma individual en función de lo que utilice el usuario. También hay mejoras en el deep linking.

Navigation también se ha simplificado para obtener resultados de una pantalla posterior, que en realidad es una mejora en el API de startActivityForResult.

Esto también ha supuesto una mejora en los permisos, o en cómo tomar una foto y recuperarla.

Novedades en Android Studio

La versión estable de Android Studio 4.0 ya está disponible, y ya hablé de sus novedades en un artículo anterior.

Esto ha hecho que se avancen el resto de versiones:

  • Tenemos Android Studio 4.1 en Beta, con un inspector de bases de datos (que funciona con Room y SQLite)
  • Se ha lanzado Android Studio 4.2 Canary, con wireless debugging en Android 11, y la posibilidad de probar Jetpack Compose.

Google Play Console totalmente reescrita

Mejor diseño para que sea más fácil de usar, con una interfaz más intuitiva.

Pero también hay novedades sobre la sección del estado de las políticas, informes de adquisición de usuarios, herramientas para la gestión del equipo…

Se han añadido algunas herramientas para mejor el rendimiento, como el Android Performance Tuner, entre otras.

Esta nueva consola está en Beta.

Otras mejoras

  • Mejoras en el NDK
    • Mejoras en gestión de memoria
    • Decodificadores de imágenes sin tener que hacer pasarela por el framework de Android
    • OpenSL ES está deprecado. Se recomienda usar la librería Oboe en su lugar.
  • ADB incremental, para Apps muy grandes (por ejemplo juegos), no tener que enviar el APK completo cada vez
  • Cargar imágenes animadas de archivos HEIF (como GIFs, pero ocupan menos espacio)
  • APIs para optimizar la experiencia con las redes 5G
  • Los teclados ahora pueden utilizar la feature de autofill, que permiten por ejemplo recuperar información de los gestores de contraseñas y permiten autorellenar con ellos (de forma segura)

Y muchos otros pequeños detalles. Puedes encontrar toda la información en la playlist de YouTube donde se incluyen todos los vídeos de esta actualización.

Author: Antonio Leiva

Soy un apasionado de Kotlin. Hace ya más de dos años que estudio el lenguaje y su aplicación a Android para ayudarte a ti a aprenderlo de la forma más sencilla posible.