Publicado por Amanda Alexander, Product Manager, Android

Logotipo de Android Jetpack sobre un fondo azul

Android Jetpack es un pilar clave del desarrollo moderno de Android. Se trata de un paquete de más de 100 bibliotecas, herramientas y guías para ayudar a los desarrolladores a seguir prácticas recomendadas, reducir el código estándar y escribir código que funcione de forma coherente en todos los dispositivos y las versiones de Android, de modo que puedas concentrarte en crear funciones únicas para tu app.

En la arquitectura de la mayoría de las apps disponibles en Google Play se usa Jetpack. En la actualidad, más del 90% de las 1.000 apps más destacadas usan Jetpack.

Presentamos los aspectos más destacados de las últimas actualizaciones en Jetpack. Se trata de una versión ampliada de nuestra charla sobre las novedades de Jetpack en I/O.

A continuación, analizaremos las actualizaciones en tres áreas principales de Jetpack:

  1. Bibliotecas y guía de arquitectura
  2. Optimización del rendimiento de las apps
  3. Bibliotecas y guía de interfaz de usuario

Luego, concluiremos con algunas actualizaciones adicionales clave.


1. Bibliotecas y guía de arquitectura

Las bibliotecas de arquitectura de apps y sus componentes garantizan que las apps sean más confiables, tengan mayor capacidad de prueba y sean más fáciles de mantener.


Persistencia de datos

Se recomienda la capa de persistencia de datos Room, que proporciona una capa de abstracción sobre SQLite y permite mayor usabilidad y seguridad en la plataforma.


En Room 2.4, la compatibilidad con Kotlin Symbol Processing (KSP) ahora es estable. Se demostró que KSP es 2 veces más rápido que KAPT en nuestras comparaciones de código Kotlin. Además, Room 2.4 agrega compatibilidad integrada para las enumeraciones y RxJava3, y es totalmente compatible con Kotlin 1.6.

Room 2.5 incluye el comienzo de una reescritura completa de Kotlin. Este cambio establece las bases para las mejoras relacionadas con Kotlin, a la vez que sigue siendo compatible a nivel binario con la versión anterior escrita en el lenguaje de programación Java. También se ofrece compatibilidad integrada con Paging 3.0 mediante el artefacto room-paging, que permite que las consultas de Room muestren objetos PagingSource. Por otra parte, ahora los desarrolladores pueden realizar consultas JOIN sin la necesidad de definir estructuras de datos adicionales, ya que Room admite métodos de consultas relacionadas con tipos de datos que se muestran en multimapa (mapas y arreglos anidados).

@Query("SELECT * FROM Artist 
    JOIN Song ON Artist.artistName = 
    Song.songArtistName")
fun getArtistToSongs(): Map<Artist, List<Song>>

Métodos de consultas relacionadas con tipo de datos que se muestran en multicapa


Con las actualizaciones de AutoMigrations, las migraciones de bases de datos son más simples y se agregó compatibilidad con propiedades y anotaciones adicionales. Se puede usar una nueva propiedad de AutoMigration en la anotación @Database para declarar qué versiones se migran automáticamente. Cuando Room necesita más información sobre las modificaciones de la tabla y la columna, se puede usar la anotación @AutoMigration para especificar las entradas.

Database(
  version = MyDb.LATEST_VERSION,
  autoMigrations = {
    @AutoMigration(from = 1, to = 2,
      spec = MyDb.MyMigration.class),
    @AutoMigration(from = 2, to = 3)
  }
)
public abstract class MyDb
    extends RoomDatabase {
  ...

DataStore

La biblioteca Datastore es una solución de almacenamiento de datos sólida que aborda problemas con SharedPreferences. A fin de comprender mejor cómo usar este potente reemplazo en muchos de los casos de uso de SharedPreferences, puedes consultar una serie de videos y artículos en Habilidades para el desarrollo moderno de Android: Datastore, que incluye una guía para probar el uso que hace tu app de la biblioteca, con inserción de dependencias y migración de SharedPreference a Proto DataStore.


Recopilación de datos incremental

La biblioteca Paging te permite cargar y mostrar pequeños grupos de datos para mejorar el consumo de red y recursos del sistema. Los datos de apps se pueden cargar de forma gradual y correcta dentro de las listas diferidas de RecyclerViews o Compose.

Paging 3.1 ofrece compatibilidad estable con las integraciones Rx y Guava, que proporcionan alternativas de Java al uso nativo que hace Paging de las corrutinas de Kotlin. Esta versión también cuenta con un manejo mejorado de las condiciones de carrera de invalidación con un tipo de datos que se muestra nuevo, LoadResult.Invalid, para representar datos no válidos o estables. También se mejoró el control de cargas y operaciones no-op en páginas vacías con las API nuevas de onPagesPresented y addOnPagesUpdatedListener.

Para obtener más información sobre Paging 3, consulta el nuevo y simplificado Codelab sobre los aspectos básicos de Paging en el sitio para desarrolladores de Android, en el que se demuestra cómo integrar la biblioteca Paging a una app que muestra una lista.

GIF en el que se muestra una lista de los aspectos básicos de Paging

Definición del modelo de Navigation en apps

La biblioteca Navigation es un marco de trabajo para trasladarse entre destinos dentro de una app.

Ahora, el componente de Navigation está integrado en Jetpack Compose mediante el nuevo artefacto navigation-compose, que permite que se usen funciones que admiten composición como destinos en tu app.

Se mejoró la función de varias pilas de actividades para que sea más fácil recordar el estado. La IU de Navigation ahora guarda y restablece automáticamente el estado de los destinos agregados, lo que permite ofrecer compatibilidad con varias pilas de actividades sin ningún cambio en el código.

Se mejoró la compatibilidad con pantallas grandes gracias al artefacto navigation-fragment, que brinda una implementación que ya se compiló de un diseño de dos paneles en AbstractListDetailFragment. Este fragmento usa un diseño SlidingPaneLayout para administrar un panel de lista (administrado por tu subclase) y un panel detallado que usa NavHostFragment.

Se rescribieron en Kotlin todos los artefactos de Navigation y se agregó una función que mejora la nulabilidad de las clases con elementos genéricos, como las subclases NavType.


Guía definida sobre la arquitectura

Para obtener más información sobre cómo nuestras bibliotecas de arquitectura clave funcionan en conjunto, puedes consultar varios videos y artículos en los que se abordan las prácticas recomendadas del desarrollo moderno de Android en una serie llamada Habilidades para el desarrollo moderno de Android: Arquitectura.


2. Optimización del rendimiento de las apps

El uso de bibliotecas de rendimiento te permite crear apps de gran rendimiento e identificar las optimizaciones para mantener un alto rendimiento, lo que resulta en mejores experiencias del usuario.


Mejoras en los tiempos de inicio

La velocidad de la app puede tener un gran impacto en la experiencia del usuario, sobre todo cuando las apps se usan inmediatamente después de instaladas. Para mejorar esa primera experiencia, creamos los perfiles de referencia. Los perfiles de referencia permiten que las apps y bibliotecas proporcionen un tiempo de ejecución de Android con metadatos sobre el uso de la ruta del código, que se utiliza para priorizar la compilación anticipada. Estos datos del perfil se agregan en varias bibliotecas y dirigen al APK de la app como un archivo baseline.prof, que luego se usa en el momento de la instalación para precompilar parcialmente la app y el código de la biblioteca vinculado de forma estática. Esto permite que tus apps se carguen más rápido y reduce los fotogramas la primera vez que el usuario interactúa con una app.

En Google, ya comenzamos a aprovechar los perfiles de referencia. Después de implementar los perfiles de referencia, la app de Play Store disminuyó en un 40% el tiempo de renderización de la página de resultados de búsqueda inicial. Los perfiles de referencia también se agregaron a bibliotecas populares, como Fragments y Compose, para ayudar a ofrecer una mejor experiencia del usuario final. Para crear tu propio perfil de referencia, debes usar la biblioteca Macrobenchmark.


Instrumentación de tu app

La biblioteca Macrobenchmark extiende la cobertura de comparación de Jetpack a casos de uso más complejos y, así, ayuda a los desarrolladores a comprender mejor el rendimiento de la app. Esto incluye el inicio de la app y las operaciones integradas de la IU, como el desplazamiento a RecyclerView o la ejecución de animaciones. También se puede usar Macrobenchmark para generar perfiles de referencia.

Se actualizó Macrobenchmark para aumentar las pruebas de velocidad. Ahora cuenta con varias funciones experimentales nuevas. Además, se admiten las mediciones de tiempo personalizadas basadas en seguimientos con TraceSectionMetric, lo que permite a los desarrolladores comparar secciones específicas de código. Por otra parte, AudioUnderrunMetric ahora habilita la detección de subdesbordamientos de búfer de audio para ayudar a comprender los bloqueos audibles.

BaselineProfileRule genera perfiles que ayudan a optimizar el tiempo de ejecución. BaselineProfileRule funciona de manera similar a las macrocomparativas, en las que representa las acciones de los usuarios como código dentro de lambdas. En el ejemplo que se muestra a continuación, el recorrido crítico del usuario que el compilador debe optimizar de forma anticipada es un inicio en frío: se abre la actividad de destino de la app desde el selector.

@ExperimentalBaselineProfilesApi
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
  @get:Rule
  val baselineProfileRule = BaselineProfileRule()

  @Test
  fun startup() = baselineProfileRule.collectBaselineProfile(
    packageName = "com.example.app"
  ) {
    pressHome()

    // This block defines the app's critical user journey. Here we are
    // interested in optimizing for app startup, but you can also navigate
    // and scroll through your most important UI.
    startActivityAndWait()
  }
}

Para obtener más información y una guía detallada sobre cómo generar y usar perfiles de referencia con Macrobenchmark, consulta nuestra guía en el sitio para desarrolladores de Android.

Cómo evitar los saltos o bloqueos de la IU

La nueva biblioteca JankStats te ayuda a hacer un seguimiento de los problemas de rendimiento en la IU de tu app y analizarlos, lo que incluye informes sobre la disminución de los fotogramas de renderización (que se conoce como “bloqueos”). JankStats se compila sobre la base de API existentes de plataformas de Android, como FrameMetrics, pero se puede usar con el nivel de API 16.

La plataforma también ofrece funciones adicionales que van más allá de la compilación en la plataforma: heurística que ayuda a identificar las causas de la disminución de los fotogramas, estado de la IU que proporciona más contexto en los informes y un informe de devoluciones de llamada que se usa a fin de cargar datos para analizar.

A continuación, analizamos con mayor detalle los tres aspectos principales de JankStats:

  1. Identificación de bloqueo: Esta biblioteca usa heurística interna que determina cuándo ocurre un bloqueo y usa esa información para saber en qué momento emitir informes de bloqueos para que los desarrolladores obtengan información sobre esos problemas y puedan analizarlos y resolverlos.
  2. Provisión de contexto de la IU: Para elaborar informes de bloqueos más útiles y fáciles de usar, la biblioteca ofrece un mecanismo que ayuda a hacer un seguimiento del estado actual de la IU y del usuario. Esta información se proporciona cuando se registran los informes para que los desarrolladores puedan comprender cuándo ocurrieron los problemas y qué estaba haciendo el usuario en ese momento. Esto ayuda a identificar áreas problemáticas en la app que, luego, se pueden abordar. Varias bibliotecas de Jetpack proporcionan automáticamente parte de este estado, pero se recomienda a los desarrolladores que brinden su propio estado específico de la app.
  3. Informe de resultados: Se le envía al cliente de JankStats mediante un procesador información sobre cada fotograma, lo que incluye el tiempo que tardó en completarse, si se consideró bloqueo o no y cuál era el contexto de IU durante el bloqueo. Se recomienda a los clientes que agreguen datos y los carguen si consideran que estos son aptos para el análisis, lo que puede ayudar a depurar problemas de rendimiento generales.

Cómo agregar registro a tu app

La biblioteca Tracing escribe eventos de seguimiento en el sistema búfer para habilitar la generación de perfiles de rendimiento de la app. Tracing 1.1 admite la generación de perfiles en compilaciones no depurables a nivel de API 14, al igual que la etiqueta de manifiesto <profileable> que se agregó en el nivel de API 29.


3. Bibliotecas y guía de interfaz de usuario

Se introdujeron varios cambios en nuestras bibliotecas de IU para ofrecer mayor compatibilidad con pantallas grandes, dispositivos plegables y emojis.


Jetpack Compose

Jetpack Compose, el kit de herramientas moderno de Android para compilar IU nativas, alcanzó hoy la versión beta 1.2, con lo que se agregaron varias funciones para admitir casos de uso más avanzados. Esto incluye compatibilidad con fuentes descargables, diseños diferidos e interoperabilidad de desplazamiento anidado. Para obtener más información, consulta la entrada de blog Novedades de Jetpack Compose.


Cómo comprender el estado de la ventana

La nueva biblioteca WindowManager ayuda a los desarrolladores a adaptar sus apps para admitir entornos multiventana y nuevos factores de forma de dispositivos, ya que ofrece una plataforma de API común que es compatible con el nivel de API 14.

La versión inicial estaba dirigida a casos de uso de dispositivo plegables, incluidas las propiedades físicas de las consultas que afectan la forma en la que debería mostrarse el contenido.

El componente SlidingPaneLayout de Jetpack se actualizó para usar diseños de API inteligentes de WindowManager a fin de evitar que se coloque contenido en áreas de oclusión, como en una bisagra física.


Arrastrar y soltar

La nueva biblioteca DragAndDrop también ayuda con los nuevos factores de forma y modos de renderización en ventanas, ya que permite a los desarrolladores aceptar datos de la función de arrastrar y soltar dentro de su app o desde otra. DrapAndDrop incluye una opción coherente de destino para soltar y es compatible con el nivel de API 24.

GIF de ejemplo de arrastrar y soltar

Portabilidad a versiones anteriores de API nuevas a niveles de API anteriores

La biblioteca AppCompat permite el acceso a API nuevas en versiones de API anteriores de la plataforma, lo que incluye portabilidad de las funciones de IU, como el modo oscuro.

AppCompat 1.4 integra la biblioteca Emoji2 y ofrece compatibilidad predeterminada con emojis nuevos en todas las vistas basadas en texto que se admiten en AppCompat nivel de API 14 y superior.

La selección de la configuración regional personalizada ahora se admite en el nivel de API 14. Esta función habilita la persistencia manual de los parámetros de configuración regional durante el inicio de la app y admite la persistencia automática mediante un servicio de marca de metadatos. Esto le indica a la biblioteca que cargue configuraciones regionales de forma sincrónica y que recree las actividades en ejecución según sea necesario. En el nivel de API 33 y superiores, la plataforma administra la persistencia sin sobrecarga adicional.


Otras actualizaciones clave


Annotation

La biblioteca Annotation expone metadatos que ayudan a las herramientas y a otros desarrolladores a comprender el código de tu app. Proporciona anotaciones familiares, como @NonNull, que se vinculan con verificaciones de lint para mejorar la precisión y la usabilidad del código.

Annotation se migrará a Kotlin, por lo que los desarrolladores que usan Kotlin podrán ver objetivos de anotación más apropiados, incluido @file.

Se agregaron varias anotaciones muy solicitadas con las verificaciones de lint correspondientes. Por ejemplo, anotaciones relativas a anulaciones de métodos o funciones y la anotación @DeprecatedSinceApi, que proporciona un corolario a @RequiresApi y desaconseja el uso más allá de un determinado nivel de API.


GitHub

Ahora tenemos más de 100 proyectos en GitHub. Hay varios módulos abiertos para que los desarrolladores colaboren con el uso estándar del flujo de trabajo basado en GitHub:

  • Activity
  • AppCompat
  • Biometric
  • Collection
  • Compose Compiler
  • Compose Runtime
  • Core
  • DataStore
  • Fragment
  • Lifecycle
  • Navigation
  • Paging
  • Room
  • WorkManager

Consulta la página de destino para obtener más información sobre cómo controlar las solicitudes de extracción y sobre cómo comenzar a compilar con las bibliotecas de Jetpack.

Este fue un breve recorrido por todos los cambios que se implementaron en Jetpack durante los últimos meses. Para obtener más información sobre la biblioteca de Jetpack, consulta las notas de la versión de AndroidX, busca rápidamente las bibliotecas relevantes con el selector de API y mira las charlas de Google I/O si deseas obtener detalles adicionales.

Java es una marca registrada de Oracle o sus afiliados.