Funciones de lenguaje. Herramientas de productividad. Integración más completa y amplia con plataformas.

Hoy, en Google I/O, anunciamos la nueva versión 2.17 del SDK de Dart. Esta versión se basa en nuestros temas principales: liderazgo en productividad y portabilidad de plataformas. Ofrece nuevas funciones de lenguaje: enumeraciones con compatibilidad de miembros, un traspaso mejorado de parámetros a superclases y mayor flexibilidad para los parámetros con nombre. Mejoramos las herramientas con una nueva versión principal de package:lints (la compatibilidad de nuestra herramienta para comparar el código de Dart con nuestras prácticas recomendadas) y una actualización completa de la documentación de las API de biblioteca principales con abundantes muestras de código. A fin de mejorar la integración con plataformas, contamos con nuevas plantillas para usar dart:ffi (interoperabilidad con el código C nativo) en los complementos de Flutter y compatibilidad experimental con procesadores RISC-V y con la firma de ejecutables de macOS y Windows.

Banner de la versión 2.17 de Dart

Nuevas funciones de lenguaje para aumentar la productividad

Con el fin de ayudarte a aumentar la productividad, desarrollamos el lenguaje Dart constantemente. Para ello, agregamos nuevas funciones y mejoramos las existentes. Dart 2.17 incorpora mayor compatibilidad con los miembros de enumeraciones, define mejor el uso de los argumentos con nombre en los constructores y hace que el código para traspasar parámetros a superclases no sea tan detallado y repetitivo.

Mejores enumeraciones con miembros

Las enumeraciones sirven para representar un conjunto discreto de estados. Por ejemplo, podemos crear el siguiente modelo para el agua: enum Water { frozen, lukewarm, boiling }. Ahora bien, supongamos que quisiéramos agregar métodos a enum, por ejemplo, para convertir cada uno de los estados en una temperatura y admitir que enum se transforme en una String. ¿Qué ocurriría en ese caso? Tal vez podríamos usar métodos de extensión para agregar un método waterToTemp(), pero tendríamos que asegurarnos de que se mantenga en sincronía con enum. En el caso de la conversión a String, preferiríamos anular toString(), pero aún no se admite esta operación.

Dart 2.17 ofrece una compatibilidad general con los miembros de enumeraciones. Esto significa que podemos agregar campos que contengan un estado, constructores que establezcan ese estado y métodos con funcionalidad, además de anular a miembros existentes. Muchos de ustedes venían solicitando esta función; era el tercer problema más votado en el registro de lenguaje.

En nuestro ejemplo del agua, podemos agregar un campo de int que incluya la temperatura y un constructor predeterminado que tome un valor de int:

enum Water {

final int tempInFahrenheit;
const Water(this.tempInFahrenheit);
}

Para garantizar que se llame al constructor al crear la enum, debemos invocarlo en cada valor de enum:

enum Water {
frozen(32),
lukewarm(100),
boiling(212);

}

Para admitir la conversión a String, simplemente debemos anular toString, que las enums heredan de Object:

@override
String toString() => "The $name water is $tempInFahrenheit F.";

De este modo, se puede crear fácilmente una instancia completa de enum y se pueden invocar métodos en:

void main() {
print(Water.frozen); // Prints “The frozen water is 32 F.”
}

Debajo, encontrarás un ejemplo completo de estos dos enfoques; consideramos que la nueva versión Dart 2.17 es mucho más fácil de leer y mantener.

Superinicializadores

En la jerarquía de herencia de clases, pasar algunos parámetros del constructor al constructor de la superclase es un patrón común. Para hacerlo, la subclase necesita: 1) enumerar cada parámetro en su propio constructor y, luego, 2) invocar al superconstructor con dichos parámetros. Eso conduce al código estándar, que tiene muchas repeticiones, y hace que resulte más difícil leerlo y más molesto mantenerlo.

Varios miembros de la comunidad de Dart contribuyeron a que esto suceda. El usuario de GitHub @roy-sianez presentó este problema de lenguaje hace aproximadamente seis meses y su sugerencia fue similar a la que ya había hecho @apps-transround, otro usuario de GitHub: que la posible solución sería incorporar un constructor nuevo para expresar que se especificó un parámetro en la superclase. Nos pareció una idea excelente, así que la implementamos en Dart 2.17. Como puedes ver en el siguiente ejemplo, esta solución resulta especialmente importante para el código del widget de Flutter. De hecho, cuando aplicamos la nueva función al framework de Flutter, observamos una reducción total de casi 2,000 líneas de código.

Argumentos con nombre en todas partes

Por último, definimos mejor el funcionamiento de los argumentos con nombre cuando se invoca un método. Anteriormente, este tipo de argumentos debía aparecer en último lugar en la lista del método. Esto resultaba molesto en aquellos casos en que era preferible ubicar un argumento posicional al final para facilitar la lectura del código. Por ejemplo, veamos la siguiente invocación del constructor List<T>.generate: antes, el argumento "growable" debía ubicarse al final, lo cual ocasionaba que el gran argumento posicional que contenía el mismo generador quedara perdido debajo. Ahora, puedes ordenarlos como prefieras: puedes ubicar los pequeños argumentos con nombre al principio y el generador al final.

Para ver más ejemplos de estas tres funciones en acción, consulta nuestras muestras actualizadas de enumeraciones, superinicializadores y parámetros con nombre.

Herramientas de productividad

Continuando con el tema de la productividad, hay varias mejoras en nuestras herramientas principales.

En Dart 2.14, presentamos package:lints, que funciona con el analizador de Dart para ayudarte a escribir código de Dart que evita errores y usa un estilo canónico, lo cual permite revisiones de código más eficaces. Desde entonces, hay una serie de herramientas lint nuevas en el analizador, que clasificamos cuidadosamente. Entre ellas, seleccionamos diez herramientas lint nuevas para todo el código de Dart y dos herramientas lint nuevas específicas para el código de Flutter. Estas herramientas lint incluyen aquellas que garantizan que las importaciones se incluyan en el archivo pubspec, impiden el uso inadecuado de las comprobaciones de valores nulos en los parámetros de tipo y garantizan un estilo coherente de las propiedades secundarias. Puedes actualizar a las nuevas herramientas lint con un simple comando:

  • Para paquetes de Dart:
    dart pub upgrade —-major-versions lints
  • Para paquetes de Flutter:
    flutter pub upgrade —-major-versions flutter_lints

La conexión segura suele utilizarse para habilitar los sockets del TCP protegidos con TLS y SSL. Antes de Dart 2.17, la depuración de estos sockets durante el desarrollo era complicada, ya que no había forma de inspeccionar el tráfico seguro de datos. Ahora se admite la especificación de un archivo keyLog. Al especificarla, se agrega al archivo una línea de texto en el formato de registro de claves NSS en el momento en que se intercambian nuevas claves de TLS con el servidor. De esta forma, las herramientas de análisis del tráfico de red (como Wireshark) pueden desencriptar el contenido enviado a través del socket. Para obtener información detallada, consulta los documentos de la API de SecureSocket.connect().

La documentación de la API que genera la herramienta dart doc es un recurso fundamental para la mayoría de los desarrolladores de Dart que están aprendiendo a usar nuevas API. A pesar de que nuestras principales API de biblioteca siempre tuvieron descripciones textuales enriquecidas, muchos desarrolladores nos comentaron que prefieren leer el código de muestra que usa las API para aprender a usarlas. En Dart 2.17, optimizamos todas las bibliotecas principales, que ahora incluyen código de muestra completo. Para ello, agregamos código de muestra completo a las 200 páginas más vistas. Por ejemplo, compara la documentación de dart:convert en Dart 2.16 con la página actualizada de Dart 2.17. Esperamos que, de esta forma, resulte mucho más sencillo consultar la documentación.

Logramos incrementar la productividad no solo cuando agregamos nuevas funciones a nuestra plataforma, sino también cuando hacemos una limpieza y quitamos aquellas que ya no se usan. Esto contribuye a que el área de superficie siga siendo pequeña, lo que resulta especialmente importante para los desarrolladores nuevos. Con ese fin, quitamos 231 líneas de código obsoleto de la biblioteca dart:io. Si todavía usas estas API que dejarán de estar disponibles, puedes actualizar a las nuevas con dart fix. También continuamos con nuestra iniciativa de quitar las herramientas obsoletas de la CLI de Dart. Esta vez, quitamos la herramienta dartdoc (puedes usar dart doc en su lugar) y la herramienta pub (puedes usar dart pub o flutter pub).

Ampliación de la integración y compatibilidad con plataformas

Un segundo tema fundamental es la integración y compatibilidad con plataformas. Dart es un verdadero lenguaje multiplataforma. A pesar de que ya es compatible con una amplia gama de plataformas, buscamos evolucionar constantemente para garantizar la integración con cada plataforma compatible y admitir plataformas nuevas.

La FFI de Dart (nuestro principal mecanismo de interoperabilidad con el código C nativo) es una forma popular de integrar el código de Dart con el código nativo existente de la plataforma. En Flutter, esta es una excelente manera de compilar complementos que usen API nativas desde la plataforma de alojamiento (como las API win32 de Windows). En Dart 2.17 y Flutter 3, agregamos plantillas a la herramienta flutter para que ahora puedas crear complementos de FFI que tengan una API de Dart con el respaldo de llamadas dart:ffi al código nativo. Para obtener más detalles, consulta la página actualizada sobre el desarrollo de paquetes y complementos en flutter.dev.

Con el fin de habilitar el uso de FFI en plataformas que tienen tipos específicos para su ABI (interfaz binaria de la aplicación), FFI ahora admite tipos específicos para ABI. Por ejemplo, ahora puedes usar Long (long en C) a fin de representar correctamente un número entero con un tamaño específico para ABI (que podría ser 32 bits o 64 bits, según la arquitectura de la CPU). Si deseas ver todos los tipos compatibles, consulta la lista de "Implementadores" en la página de API de AbiSpecificInteger.

Cuando uses la FFI de Dart para integraciones completas con plataformas nativas, deberás alinear la limpieza de la memoria y otros recursos (puertos, archivos, etc.) asignados por Dart y el código nativo. Históricamente, esto resultó siempre muy complicado debido a que Dart es un lenguaje de recolección de elementos no utilizados que realiza la limpieza de forma automática. La solución que aporta Dart 2.17 es la introducción del concepto de un método de finalización, que incluye una interfaz de marcadores Finalizable para "etiquetar" objetos que no deberían finalizarse o descartarse con demasiada anticipación y otros de clase NativeFinalizer que se pueden adjuntar a un objeto de Dart para ejecutar una devolución de llamada cuando el objeto esté a punto de recolectarse como elemento no utilizado. Juntos, permiten la ejecución del código de limpieza tanto para el código de Dart como para el nativo. Si deseas obtener información detallada, consulta la descripción y los ejemplos en la documentación de API sobre NativeFinalizer o la documentación sobre WeakReferences y Finalizer para obtener asistencia similar respecto del código común de Dart.

Las apps de Flutter tienen un excelente rendimiento al iniciarse y una renderización rápida gracias a nuestra compatibilidad con la compilación de Dart en código nativo. Un segundo caso de uso es la posibilidad de compilar Dart en ejecutables con dart compile. Estos archivos pueden ejecutarse de manera independiente en cualquier máquina sin la necesidad de instalar el SDK de Dart. Otra novedad de Dart 2.17 es la compatibilidad con la firma de ejecutables, que permite su implementación en Windows y macOS, donde suele ser necesaria.

Además, para mantenemos a la vanguardia en relación con las nuevas plataformas, continuamos ampliando la cantidad de plataformas compatibles. RISC-V es un nuevo conjunto de instrucciones innovador para procesadores. Debido a que RISC-V International, una organización global sin fines de lucro, es propietaria de la especificación RISC-V, el conjunto de instrucciones es gratuito y abierto. Aún se trata de una plataforma emergente, pero confiamos en su potencial; por lo tanto, nuestra versión 2.17.0–266.1.beta para Linux (o versiones posteriores de nuestro canal beta) será compatible de modo experimental. Nos encantaría recibir tus comentarios. Puedes contarnos tu experiencia mediante la presentación de un problema o en una publicación.

¡Empieza a utilizar Dart 2.17!

Esperamos que la nueva versión 2.17 de Dart te entusiasme, mejore tu productividad y favorezca aún más la integración de tus apps con plataformas. Como primer paso, puedes descargar la versión 2.17 de Dart u obtenerla como parte de la versión actual del SDK Flutter 3.

También te invitamos a consultar el contenido nuevo que preparamos para Google I/O.


Funciones de lenguaje. Herramientas de productividad. Integración más completa y amplia con plataformas.

Hoy, en Google I/O, anunciamos la nueva versión 2.17 del SDK de Dart. Esta versión se basa en nuestros temas principales: liderazgo en productividad y portabilidad de plataformas. Ofrece nuevas funciones de lenguaje: enumeraciones con compatibilidad de miembros, un traspaso mejorado de parámetros a superclases y mayor flexibilidad para los parámetros con nombre. Mejoramos las herramientas con una nueva versión principal de package:lints (la compatibilidad de nuestra herramienta para comparar el código de Dart con nuestras prácticas recomendadas) y una actualización completa de la documentación de las API de biblioteca principales con abundantes muestras de código. A fin de mejorar la integración con plataformas, contamos con nuevas plantillas para usar dart:ffi (interoperabilidad con el código C nativo) en los complementos de Flutter y compatibilidad experimental con procesadores RISC-V y con la firma de ejecutables de macOS y Windows.

Banner de la versión 2.17 de Dart

Nuevas funciones de lenguaje para aumentar la productividad

Con el fin de ayudarte a aumentar la productividad, desarrollamos el lenguaje Dart constantemente. Para ello, agregamos nuevas funciones y mejoramos las existentes. Dart 2.17 incorpora mayor compatibilidad con los miembros de enumeraciones, define mejor el uso de los argumentos con nombre en los constructores y hace que el código para traspasar parámetros a superclases no sea tan detallado y repetitivo.

Mejores enumeraciones con miembros

Las enumeraciones sirven para representar un conjunto discreto de estados. Por ejemplo, podemos crear el siguiente modelo para el agua: enum Water { frozen, lukewarm, boiling }. Ahora bien, supongamos que quisiéramos agregar métodos a enum, por ejemplo, para convertir cada uno de los estados en una temperatura y admitir que enum se transforme en una String. ¿Qué ocurriría en ese caso? Tal vez podríamos usar métodos de extensión para agregar un método waterToTemp(), pero tendríamos que asegurarnos de que se mantenga en sincronía con enum. En el caso de la conversión a String, preferiríamos anular toString(), pero aún no se admite esta operación.

Dart 2.17 ofrece una compatibilidad general con los miembros de enumeraciones. Esto significa que podemos agregar campos que contengan un estado, constructores que establezcan ese estado y métodos con funcionalidad, además de anular a miembros existentes. Muchos de ustedes venían solicitando esta función; era el tercer problema más votado en el registro de lenguaje.

En nuestro ejemplo del agua, podemos agregar un campo de int que incluya la temperatura y un constructor predeterminado que tome un valor de int:

enum Water {

final int tempInFahrenheit;
const Water(this.tempInFahrenheit);
}

Para garantizar que se llame al constructor al crear la enum, debemos invocarlo en cada valor de enum:

enum Water {
frozen(32),
lukewarm(100),
boiling(212);

}

Para admitir la conversión a String, simplemente debemos anular toString, que las enums heredan de Object:

@override
String toString() => "The $name water is $tempInFahrenheit F.";

De este modo, se puede crear fácilmente una instancia completa de enum y se pueden invocar métodos en:

void main() {
print(Water.frozen); // Prints “The frozen water is 32 F.”
}

Debajo, encontrarás un ejemplo completo de estos dos enfoques; consideramos que la nueva versión Dart 2.17 es mucho más fácil de leer y mantener.

Superinicializadores

En la jerarquía de herencia de clases, pasar algunos parámetros del constructor al constructor de la superclase es un patrón común. Para hacerlo, la subclase necesita: 1) enumerar cada parámetro en su propio constructor y, luego, 2) invocar al superconstructor con dichos parámetros. Eso conduce al código estándar, que tiene muchas repeticiones, y hace que resulte más difícil leerlo y más molesto mantenerlo.

Varios miembros de la comunidad de Dart contribuyeron a que esto suceda. El usuario de GitHub @roy-sianez presentó este problema de lenguaje hace aproximadamente seis meses y su sugerencia fue similar a la que ya había hecho @apps-transround, otro usuario de GitHub: que la posible solución sería incorporar un constructor nuevo para expresar que se especificó un parámetro en la superclase. Nos pareció una idea excelente, así que la implementamos en Dart 2.17. Como puedes ver en el siguiente ejemplo, esta solución resulta especialmente importante para el código del widget de Flutter. De hecho, cuando aplicamos la nueva función al framework de Flutter, observamos una reducción total de casi 2,000 líneas de código.

Argumentos con nombre en todas partes

Por último, definimos mejor el funcionamiento de los argumentos con nombre cuando se invoca un método. Anteriormente, este tipo de argumentos debía aparecer en último lugar en la lista del método. Esto resultaba molesto en aquellos casos en que era preferible ubicar un argumento posicional al final para facilitar la lectura del código. Por ejemplo, veamos la siguiente invocación del constructor List<T>.generate: antes, el argumento "growable" debía ubicarse al final, lo cual ocasionaba que el gran argumento posicional que contenía el mismo generador quedara perdido debajo. Ahora, puedes ordenarlos como prefieras: puedes ubicar los pequeños argumentos con nombre al principio y el generador al final.

Para ver más ejemplos de estas tres funciones en acción, consulta nuestras muestras actualizadas de enumeraciones, superinicializadores y parámetros con nombre.

Herramientas de productividad

Continuando con el tema de la productividad, hay varias mejoras en nuestras herramientas principales.

En Dart 2.14, presentamos package:lints, que funciona con el analizador de Dart para ayudarte a escribir código de Dart que evita errores y usa un estilo canónico, lo cual permite revisiones de código más eficaces. Desde entonces, hay una serie de herramientas lint nuevas en el analizador, que clasificamos cuidadosamente. Entre ellas, seleccionamos diez herramientas lint nuevas para todo el código de Dart y dos herramientas lint nuevas específicas para el código de Flutter. Estas herramientas lint incluyen aquellas que garantizan que las importaciones se incluyan en el archivo pubspec, impiden el uso inadecuado de las comprobaciones de valores nulos en los parámetros de tipo y garantizan un estilo coherente de las propiedades secundarias. Puedes actualizar a las nuevas herramientas lint con un simple comando:

  • Para paquetes de Dart:
    dart pub upgrade —-major-versions lints
  • Para paquetes de Flutter:
    flutter pub upgrade —-major-versions flutter_lints

La conexión segura suele utilizarse para habilitar los sockets del TCP protegidos con TLS y SSL. Antes de Dart 2.17, la depuración de estos sockets durante el desarrollo era complicada, ya que no había forma de inspeccionar el tráfico seguro de datos. Ahora se admite la especificación de un archivo keyLog. Al especificarla, se agrega al archivo una línea de texto en el formato de registro de claves NSS en el momento en que se intercambian nuevas claves de TLS con el servidor. De esta forma, las herramientas de análisis del tráfico de red (como Wireshark) pueden desencriptar el contenido enviado a través del socket. Para obtener información detallada, consulta los documentos de la API de SecureSocket.connect().

La documentación de la API que genera la herramienta dart doc es un recurso fundamental para la mayoría de los desarrolladores de Dart que están aprendiendo a usar nuevas API. A pesar de que nuestras principales API de biblioteca siempre tuvieron descripciones textuales enriquecidas, muchos desarrolladores nos comentaron que prefieren leer el código de muestra que usa las API para aprender a usarlas. En Dart 2.17, optimizamos todas las bibliotecas principales, que ahora incluyen código de muestra completo. Para ello, agregamos código de muestra completo a las 200 páginas más vistas. Por ejemplo, compara la documentación de dart:convert en Dart 2.16 con la página actualizada de Dart 2.17. Esperamos que, de esta forma, resulte mucho más sencillo consultar la documentación.

Logramos incrementar la productividad no solo cuando agregamos nuevas funciones a nuestra plataforma, sino también cuando hacemos una limpieza y quitamos aquellas que ya no se usan. Esto contribuye a que el área de superficie siga siendo pequeña, lo que resulta especialmente importante para los desarrolladores nuevos. Con ese fin, quitamos 231 líneas de código obsoleto de la biblioteca dart:io. Si todavía usas estas API que dejarán de estar disponibles, puedes actualizar a las nuevas con dart fix. También continuamos con nuestra iniciativa de quitar las herramientas obsoletas de la CLI de Dart. Esta vez, quitamos la herramienta dartdoc (puedes usar dart doc en su lugar) y la herramienta pub (puedes usar dart pub o flutter pub).

Ampliación de la integración y compatibilidad con plataformas

Un segundo tema fundamental es la integración y compatibilidad con plataformas. Dart es un verdadero lenguaje multiplataforma. A pesar de que ya es compatible con una amplia gama de plataformas, buscamos evolucionar constantemente para garantizar la integración con cada plataforma compatible y admitir plataformas nuevas.

La FFI de Dart (nuestro principal mecanismo de interoperabilidad con el código C nativo) es una forma popular de integrar el código de Dart con el código nativo existente de la plataforma. En Flutter, esta es una excelente manera de compilar complementos que usen API nativas desde la plataforma de alojamiento (como las API win32 de Windows). En Dart 2.17 y Flutter 3, agregamos plantillas a la herramienta flutter para que ahora puedas crear complementos de FFI que tengan una API de Dart con el respaldo de llamadas dart:ffi al código nativo. Para obtener más detalles, consulta la página actualizada sobre el desarrollo de paquetes y complementos en flutter.dev.

Con el fin de habilitar el uso de FFI en plataformas que tienen tipos específicos para su ABI (interfaz binaria de la aplicación), FFI ahora admite tipos específicos para ABI. Por ejemplo, ahora puedes usar Long (long en C) a fin de representar correctamente un número entero con un tamaño específico para ABI (que podría ser 32 bits o 64 bits, según la arquitectura de la CPU). Si deseas ver todos los tipos compatibles, consulta la lista de "Implementadores" en la página de API de AbiSpecificInteger.

Cuando uses la FFI de Dart para integraciones completas con plataformas nativas, deberás alinear la limpieza de la memoria y otros recursos (puertos, archivos, etc.) asignados por Dart y el código nativo. Históricamente, esto resultó siempre muy complicado debido a que Dart es un lenguaje de recolección de elementos no utilizados que realiza la limpieza de forma automática. La solución que aporta Dart 2.17 es la introducción del concepto de un método de finalización, que incluye una interfaz de marcadores Finalizable para "etiquetar" objetos que no deberían finalizarse o descartarse con demasiada anticipación y otros de clase NativeFinalizer que se pueden adjuntar a un objeto de Dart para ejecutar una devolución de llamada cuando el objeto esté a punto de recolectarse como elemento no utilizado. Juntos, permiten la ejecución del código de limpieza tanto para el código de Dart como para el nativo. Si deseas obtener información detallada, consulta la descripción y los ejemplos en la documentación de API sobre NativeFinalizer o la documentación sobre WeakReferences y Finalizer para obtener asistencia similar respecto del código común de Dart.

Las apps de Flutter tienen un excelente rendimiento al iniciarse y una renderización rápida gracias a nuestra compatibilidad con la compilación de Dart en código nativo. Un segundo caso de uso es la posibilidad de compilar Dart en ejecutables con dart compile. Estos archivos pueden ejecutarse de manera independiente en cualquier máquina sin la necesidad de instalar el SDK de Dart. Otra novedad de Dart 2.17 es la compatibilidad con la firma de ejecutables, que permite su implementación en Windows y macOS, donde suele ser necesaria.

Además, para mantenemos a la vanguardia en relación con las nuevas plataformas, continuamos ampliando la cantidad de plataformas compatibles. RISC-V es un nuevo conjunto de instrucciones innovador para procesadores. Debido a que RISC-V International, una organización global sin fines de lucro, es propietaria de la especificación RISC-V, el conjunto de instrucciones es gratuito y abierto. Aún se trata de una plataforma emergente, pero confiamos en su potencial; por lo tanto, nuestra versión 2.17.0–266.1.beta para Linux (o versiones posteriores de nuestro canal beta) será compatible de modo experimental. Nos encantaría recibir tus comentarios. Puedes contarnos tu experiencia mediante la presentación de un problema o en una publicación.

¡Empieza a utilizar Dart 2.17!

Esperamos que la nueva versión 2.17 de Dart te entusiasme, mejore tu productividad y favorezca aún más la integración de tus apps con plataformas. Como primer paso, puedes descargar la versión 2.17 de Dart u obtenerla como parte de la versión actual del SDK Flutter 3.

También te invitamos a consultar el contenido nuevo que preparamos para Google I/O.


Entrada publicada por Jeanine Banks, vicepresidenta y gerenta general de Developer X, y directora de relaciones con desarrolladores

Nos emociona volver al Shoreline Amphitheatre para celebrar Google I/O esta semana. Es genial poder conectarnos con los desarrolladores de todo el mundo, de manera virtual y en persona.


Entrada publicada por Jeanine Banks, vicepresidenta y gerenta general de Developer X, y directora de relaciones con desarrolladores

Nos emociona volver al Shoreline Amphitheatre para celebrar Google I/O esta semana. Es genial poder conectarnos con los desarrolladores de todo el mundo, de manera virtual y en persona.

I/O es nuestra carta de amor a los desarrolladores. Los desarrolladores son el motor que impulsa la revolución de la información. Mucho más que eso, son los desarrolladores quienes convierten la información y las ideas en el código que nos permite aprender, trabajar, comunicarnos y jugar.

Hace unas décadas, para compilar una experiencia digital era necesario publicar un sitio web estático para llegar a las computadoras de escritorio de miles de personas. Hoy, se trata de una experiencia interactiva ultrarrápida que involucra navegadores, computadoras de escritorio, teléfonos, tablets, asistentes virtuales, televisores, consolas de videojuegos, autos, relojes y otros dispositivos. Las personas esperan que salgan nuevas funciones más rápido que nunca, mientras que respetemos y mantengamos los más altos estándares de privacidad y seguridad.

Para ayudarte a lidiar con la complejidad y las expectativas cada vez mayores, queremos dar simplicidad a los desafíos que enfrentas. Esta semana, en I/O, compartimos el comienzo de un esfuerzo de largo plazo para conectar a nuestros productos para desarrolladores con el objetivo de que funcionen mejor en conjunto, y proporcionamos más orientación y prácticas recomendadas para optimizar todo el flujo de trabajo. Estos son algunos de los aspectos destacados de lo que se incluyó en la presentación para desarrolladores:

  • La nueva API geoespacial de ARCore, que te permite colocar contenido de realidad aumentada en ubicaciones del mundo real de 87 países sin que debas estar físicamente en esos lugares.
  • Desarrollo moderno de Android para lograr las mejores experiencias en cualquier pantalla. Incluye compatibilidad con el nuevo Jetpack Compose para WearOS y tablets, una actualización de Android Studio con edición en tiempo real y mucho más.
  • Nuevo panel de estadísticas de rendimiento de Chrome DevTools y compatibilidad de WebAssembly con lenguajes de programación administrados, como Dart, Java y Kotlin.
  • Flutter 3, nuestro marco de trabajo de IU multiplataforma de código abierto, ahora es compatible con seis plataformas para que puedas compilar apps geniales con una sola base de código.
  • Firebase Crashlytics con integración sin inconvenientes en Android Studio, Flutter y Google Play para generar informes de fallas coherentes y prácticos.
  • Trabajos de Cloud Run para ejecutar la transformación de datos en lote, tareas administrativas o trabajos programados, y AlloyDB para PostgreSQL, nuestra nueva base de datos relacional completamente administrada, que es 4 veces más rápida que la PostgreSQL estándar para cargas de trabajo transaccionales.
  • Investigación estimulante en el campo de la codificación asistida por IA y el desafío AI for Code (AI4Code) en Kaggle, en asociación con X, the moonshot factory.

Mira la presentación para desarrolladores o este resumen en video para conocer en detalle las novedades de este año de nuestras diferentes plataformas, como Android, ARCore, Chrome OS, Cloud, Flutter, Firebase, Google Play, Kaggle, Machine Learning, y Web Platform:

Si tu objetivo es compilar tu primera app, ampliar las capacidades de tus productos o aprovechar el aprendizaje automático con facilidad y de manera responsable, esperamos que te inspires con las numerosas herramientas que tienes a disposición, les des vida a tus ideas y simplifiques la vida de las personas.


Publicado por Juan Sebastián Oviedo, administrador sénior de productos

Blue Android Studio

Hoy, en Google I/O 2022, anunciamos un conjunto interesante de funciones nuevas disponibles en Android Studio Dolphin (beta) y Electric Eel Canary, que ya se pueden descargar. Nos comentaste que quisieras ser más productivo al momento de compilar apps para Android, por lo que nos enfocamos en incluir mejoras que hacen que la experiencia de desarrollo sea más rápida e informativa.


Publicado por Juan Sebastián Oviedo, administrador sénior de productos

Blue Android Studio

Hoy, en Google I/O 2022, anunciamos un conjunto interesante de funciones nuevas disponibles en Android Studio Dolphin (beta) y Electric Eel Canary, que ya se pueden descargar. Nos comentaste que quisieras ser más productivo al momento de compilar apps para Android, por lo que nos enfocamos en incluir mejoras que hacen que la experiencia de desarrollo sea más rápida e informativa.

En la versión de Android Studio Dolphin, encontrarás las siguientes funciones y mejoras que puedes comenzar a usar en el canal beta, que se aproxima a la calidad estable:

  • Ver animaciones de Compose y coordinarlas con la vista previa de animaciones
  • Definir clases de anotación para incluir y aplicar fácilmente diferentes definiciones de vista previa de Compose a la vez
  • Hacer un seguimiento de los recuentos de recomposición de tus elementos componibles en el Inspector de diseño
  • Emparejar y controlar con facilidad emuladores de Wear OS y lanzar tarjetas, caras de reloj y complicaciones directamente desde Android Studio
  • Diagnosticar problemas de las apps más rápido con Logcat V2

Para obtener aún más funciones de vanguardia, puedes ver un adelanto del lanzamiento de Android Studio Electric Eel en el canal Canary:

  • Podrás ver estadísticas sobre dependencias del nuevo Índice de SDK de Google Play, un portal público con información sobre dependencias o SDK populares. Si un autor marcó como "obsoleta" una versión específica de una biblioteca, al ver esa definición de dependencia aparecerá la advertencia de Lint correspondiente. Esto te habilita a descubrir y actualizar los problemas de dependencia durante el desarrollo, en lugar de hacerlo más tarde cuando publicas tu app en Play Console. Más información sobre esta herramienta nueva aquí.
  • Consulta informes de Firebase Crashlytics directamente desde Android Studio en la nueva ventana App Quality Insights. En esta ventana, podrás navegar desde el seguimiento de pila hasta tu código con unos pocos clics. El IDE también destaca líneas de código en el editor mientras modificas archivos que contienen fallas recientes. Esto te permite ahorrar tiempo, ya que presenta información procesable de fallas que tienen los usuarios directamente en el IDE, para que puedas concentrarte en brindar a los usuarios la mejor experiencia de la app.
  • Prueba la IU de tu app en dispositivos de referencia representativos con un único Android Emulator de tamaño ajustable. En lugar de tener que configurar emuladores específicamente para tablets, teléfonos o computadoras de escritorio, puedes usar un emulador único de tamaño ajustable y cambiarle la configuración sin necesidad de volver a desplegar a fin de probar la app.
  • Con la función experimental de Live Edit, puedes realizar cambios en el código y reflejarlos inmediatamente en la vista previa de Compose y la app en ejecución en un emulador o dispositivo físico.

Estas funciones se impulsarán a canales más estables una vez que recibamos tus comentarios y realicemos mejoras, así que pruébalas.

Para ver todas las funciones nuevas en acción, consulta la sesión de novedades en las herramientas para desarrolladores de Android.


A continuación, se muestra una lista de nuevas funciones y mejoras clave en Android Studio Dolphin:


Jetpack Compose

  • Coordinación de animaciones de Compose: Consulta todas tus animaciones a la vez y coordínalas en una Vista previa de animación. También puedes congelar una animación específica.
Coordinación de animaciones de Compose

Coordinación de animaciones de Compose

  • Anotaciones de diferentes vistas previas de Compose: Define una clase de anotación que incluya diferentes definiciones de vista previa y usa esa nueva anotación para generarlas al mismo tiempo. Usa esta nueva anotación para obtener una vista previa de varios dispositivos, fuentes y temas al mismo tiempo, sin repetir esas definiciones para cada elemento que admite composición.
Anotaciones de diferentes vistas previas

Anotaciones de diferentes vistas previas

  • Recuentos de recomposición de Compose en el Inspector de diseño: Consulta los recuentos de recomposición para una app de Compose en el Inspector de diseño. Los recuentos de recomposición y de omisiones se pueden mostrar de manera opcional en los paneles Component Tree y Attributes. Más información.
Recuentos de recomposición de Compose

Recuentos de recomposición de Compose


Wear OS

  • Asistente de sincronización del emulador de Wear OS: Cuando usas el asistente de sincronización del emulador de Wear OS, puedes ver los dispositivos para Wear en el administrador de dispositivos y sincronizar varios emuladores de reloj con un solo teléfono. Tampoco tendrás que volver a sincronizar los dispositivos con tanta frecuencia, porque Android Studio recuerda las sincronizaciones luego de cerrarse.
Asistente de sincronización del emulador de Wear OS

Asistente de sincronización del emulador de Wear OS

  • Barra de herramientas lateral del emulador de Wear OS: Usa botones específicos del emulador de Wear que se parecen a botones físicos y los simulan, incluidos los botones principales, palmares y de inclinación.
Barra de herramientas lateral del emulador de Wear OS

Barra de herramientas lateral del emulador de Wear OS

  • Lanzamiento de Direct Surface de Wear OS: Crea configuraciones de ejecución y depuración para mosaicos, caras de reloj y complicaciones de tarjetas de Wear OS, y ejecútalos directamente desde Android Studio.
Nuevas clases de configuración de ejecución y depuración de Wear OS

Nuevas clases de configuración de ejecución y depuración de Wear OS


Herramientas de desarrollo

  • Logcat V2: Se reconstituyó desde cero y, ahora, simplifica el análisis, las consultas y el seguimiento de registros. Logcat V2 incluye un nuevo formato que facilita el escaneo de información útil, nuevas vistas divididas que te permiten hacer un seguimiento al instante y una nueva sintaxis eficiente para filtrar registros. Más información.
Logcat V2

Logcat V2

  • Dispositivos administrados por Gradle: Describe los dispositivos virtuales que necesitas para tus pruebas automatizadas como parte de tu compilación y deja que Gradle se encargue del resto. Desde la descarga del SDK hasta la configuración y provisión de dispositivos, pasando por la ejecución y desmontaje de pruebas, Gradle administra el ciclo de vida de tus dispositivos virtuales durante las pruebas de instrumentación. Con Gradle, también puedes aplicar funciones inteligentes, como la administración de instantáneas, el almacenamiento en caché de pruebas y la fragmentación de pruebas, para garantizar que tus pruebas se ejecuten de manera eficiente, rápida y coherente. Los dispositivos administrados por Gradle también introducen un tipo de dispositivo completamente nuevo denominado Dispositivo de prueba automatizado, que optimiza dispositivos para pruebas automatizadas, lo que resulta en una reducción significativa del uso del CPU y la memoria durante la ejecución de prueba. Más información.
Dispositivos administrados de Gradle

Dispositivos administrados de Gradle

A continuación, se incluye una lista de nuevas funciones y mejoras clave en Android Studio Electric Eel:

Jetpack Compose

  • Live Edit: Haz cambios de código en elementos que admiten elementos componibles en Android Studio y observa esos cambios reflejados inmediatamente en la vista previa de Compose y tu emulador o dispositivo físico. Live Edit es una función opcional que puedes habilitar en la configuración de Android Studio. Más información.
Emulador de Live Edit

Emulador de Live Edit

Vista previa de Live Edit

Vista previa de Live Edit


Google Play y Firebase

  • SDK Insights : Recibe advertencias de Lint para SDK o bibliotecas que los autores marcaron como obsoletas en el Índice de SDK de Google Play. Actualiza las versiones de dependencia obsoletas durante el desarrollo para evitar problemas cuando tu app se publique en Play Console.
Estadísticas del Índice de SDK de Google Play

Estadísticas del Índice de SDK de Google Play

  • App Quality Insights de Firebase Crashlytics: Descubre, investiga y resuelve problemas que Crashlytics informa en Android Studio y dentro del contexto de tu código fuente local. Esta integración ayuda a reducir la fricción cuando se navega de fallas a código (y de código a fallas), y muestra datos contextuales importantes sobre cada falla para ayudarte a reproducir problemas de forma local.
App Quality Insights de Firebase Crashlytics

App Quality Insights de Firebase Crashlytics


Pantallas grandes

  • Emulador de tamaño ajustable: Alterna rápidamente entre dispositivos de referencia representativos para probar con rapidez varios estados de diseño de apps con una sola instancia de emulador en ejecución. Puedes crear estos emuladores si seleccionas el tipo "De tamaño ajustable" en el flujo "Compilar dispositivo" del Administrador de dispositivos.
Emulador de tamaño ajustable

Emulador de tamaño ajustable

  • Visual Linting: Puedes descubrir y corregir tus problemas de diseño en diferentes dispositivos (por ejemplo, cuando un botón está oculto y fuera de los límites en una tablet más grande) si abres el panel Layout Validation. Ejecutamos automáticamente tu diseño para detectar problemas de Visual Lint en los diferentes tamaños de pantallas.
Visual Linting

Visual Linting


Herramientas de desarrollo

  • Bluetooth emulado: Ahora, puedes descubrir y conectar dos emuladores de teléfono nuevos con el Bluetooth virtual. Esta función está disponible en Android Emulator 31.3.8 y versiones posteriores con la imagen del sistema T (nivel de API 33). Planeamos agregar más compatibilidad a fin de que se puedan compilar periféricos virtuales de muestra, como balizas y monitores de ritmo cardíaco, y pruebas de integración para tus funciones de Bluetooth.
Sincronización de dos Android Emulators con Bluetooth emulado

Sincronización de dos Android Emulators con Bluetooth emulado

  • Duplicación de dispositivo: Puedes minimizar la cantidad de interrupciones durante el desarrollo si transmites la pantalla de tu dispositivo directamente a Android Studio. La duplicación de dispositivo te brinda la capacidad de interactuar con un dispositivo físico mediante la ventana Running Devices en Studio. Para habilitar esta función, ve a Preferences > Experimental y selecciona Device Mirroring. Una vez que la habilites, conecta tu dispositivo y abre la ventana Running Devices para comenzar a transmitir tu pantalla.
Duplicación de dispositivo

Duplicación de dispositivo


En resumen, estas son las nuevas funciones y mejoras que están disponibles en Android Studio Dolphin (beta), con una calidad casi estable:

Jetpack Compose

  • Coordinación de animaciones de Compose
  • Anotaciones de diferentes vistas previas de Compose
  • Recuentos de recomposición de Compose en el Inspector de diseño

Wear OS

  • Asistente de sincronización del emulador de Wear OS
  • Barra de herramientas lateral del emulador de Wear OS
  • Lanzamiento de Direct Surface de Wear OS

Herramientas de desarrollo

  • Logcat V2
  • Dispositivos administrados de Gradle

Estas son las nuevas funciones y mejoras que están disponibles en Android Studio Electric Eel Canary:

Jetpack Compose

  • Live Edit

Google Play y Firebase

  • SDK Insights
  • App Quality Insights de Firebase Crashlytics

Pantallas grandes

  • Emulador de tamaño ajustable
  • Visual Linting

Herramientas de desarrollo

  • Bluetooth emulado
  • Duplicación de dispositivo

Cómo comenzar

Android Studio Dolphin (beta) y Electric Eel Canary están disponibles para descargar. Sigue estas instrucciones para instalarlos con la versión estable actual de Android Studio. Si bien la versión beta ofrece una estabilidad casi completa, aún puede presentar errores. Si encuentras alguno, infórmalo para que podamos corregirlo. Del mismo modo, si encuentras un problema o tienes comentarios sobre las funciones de la versión de Canary, comunícate con nosotros.

Realmente apreciamos tus comentarios sobre los problemas y las solicitudes de funciones. Puedes seguir al equipo de desarrollo de Android Studio en Twitter y en Medium.

Para obtener más información, consulta las notas de la versión preliminar.

Publicado por Yafit Becher, administrador de productos, y Ray Brusca, administrador de asociaciones estratégicas

Teléfono sobre un fondo celeste

Los desarrolladores de apps confían en los SDK para integrar funciones y servicios clave en sus apps y juegos. Los SDK son componentes fundamentales, pero los desarrolladores indicaron que puede ser difícil determinar qué SDK son confiables y seguros de usar. Por lo tanto, ayudar a los desarrolladores como tu a tomar decisiones informadas sobre los SDK es parte de que Google Play siga siendo un espacio seguro y confiable para miles de millones de personas.

Publicado por Yafit Becher, administrador de productos, y Ray Brusca, administrador de asociaciones estratégicas

Teléfono sobre un fondo celeste

Los desarrolladores de apps confían en los SDK para integrar funciones y servicios clave en sus apps y juegos. Los SDK son componentes fundamentales, pero los desarrolladores indicaron que puede ser difícil determinar qué SDK son confiables y seguros de usar. Por lo tanto, ayudar a los desarrolladores como tu a tomar decisiones informadas sobre los SDK es parte de que Google Play siga siendo un espacio seguro y confiable para miles de millones de personas.

En 2020, lanzamos SDK Console de Google Play para brindar a los proveedores de SDK informes de fallas, estadísticas de uso y una forma de comunicar problemas críticos a los desarrolladores de apps mediante Google Play Console y Android Studio. Hoy, daremos otro paso para aumentar la comunicación y la transparencia con el lanzamiento del Índice de SDK de Google Play, un nuevo portal público que enumera más de 100 de los SDK comerciales que más se usan y proporciona información sobre cada uno de ellos.

El Índice de SDK de Google Play muestra señales de confiabilidad y seguridad para que puedas decidir si un SDK es adecuado para tu empresa y tus usuarios.

El Índice de SDK de Google Play muestra señales de confiabilidad y seguridad para que puedas decidir si un SDK es adecuado para tu empresa y tus usuarios.

Puedes buscar un SDK o una categoría, como Publicidad y monetización o Análisis. Por cada lista de SDK, el Índice de SDK de Google Play combina los datos de uso de las apps de Google Play con la detección de código SDK para brindar estadísticas diseñadas a fin de ayudarte a decidir si un SDK es adecuado para tu empresa y tus usuarios. Puedes ver lo siguiente:

  • Qué permisos de apps para Android puede solicitar el SDK.
  • Si el proveedor de SDK se compromete a garantizar que el código de tu SDK cumpla con las políticas de Google Play.
  • Las tasas de adopción de versiones.
  • Métricas de retención y mucho más.

Los proveedores de SDK también pueden brindarte información clave sobre los SDK que registraron en SDK Console de Google Play, como la siguiente:

  • Qué versión de SDK está desactualizada o tiene problemas críticos.
  • Vínculos a la guía de seguridad de datos sobre qué datos recopila el SDK y por qué, para ayudarte a completar el formulario de seguridad de datos de tu app.

No importa en qué momento del ciclo de vida del desarrollo te encuentres, esperamos que el Índice de SDK de Google Play te resulte útil para tomar decisiones informadas sobre los SDK. No te pierdas las novedades sobre los puntos de datos, categorías y volumen de SDK adicionales que agregaremos.

Para obtener más información, haz lo siguiente:

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.

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.


Entrada publicada por Dave Burke, vicepresidente de Ingeniería

Logotipo de Android 13

El mes pasado, lanzamos la primera versión preliminar para desarrolladores de Android 13, diseñada en torno a nuestros temas centrales de privacidad y seguridad, productividad de los desarrolladores y compatibilidad con tablets y pantallas grandes. Hoy compartimos la versión preliminar para desarrolladores 2 de Android 13, que incluye más funciones y modificaciones para probar en tus apps. Tus comentarios nos ayudan a hacer de Android una mejor plataforma para los desarrolladores y los usuarios, así que cuéntanos qué piensas.


Entrada publicada por Dave Burke, vicepresidente de Ingeniería

Logotipo de Android 13

El mes pasado, lanzamos la primera versión preliminar para desarrolladores de Android 13, diseñada en torno a nuestros temas centrales de privacidad y seguridad, productividad de los desarrolladores y compatibilidad con tablets y pantallas grandes. Hoy compartimos la versión preliminar para desarrolladores 2 de Android 13, que incluye más funciones y modificaciones para probar en tus apps. Tus comentarios nos ayudan a hacer de Android una mejor plataforma para los desarrolladores y los usuarios, así que cuéntanos qué piensas.

El lanzamiento de hoy se da poco después de la actualización de funciones de la versión 12L, que se incorporó al Proyecto de código abierto de Android (AOSP) la semana pasada. Esto te permitirá sacarles provecho a los más de 250 millones de dispositivos Android de pantalla grande. Y para conocer más sobre Android 13, las tables y nuestra inversión para potenciar la productividad de los desarrolladores en Jetpack Compose, echa un vistazo al último episodio de #TheAndroidShow.


Actualización de funciones de 12L, ahora en AOSP

Antes de adentrarnos en la versión preliminar para desarrolladores 2, veamos las otras novedades de la semana pasada: lanzamos de manera oficial la actualización de funciones de 12L a AOSP, que se implementará en todos los dispositivos compatibles con Pixel en las próximas semanas. La versión 12L hace que Android 12 sea aún mejor en las tablets e incluye actualizaciones, como una nueva barra de tareas que permite a los usuarios arrastrar y soltar al instante las apps en el modo de pantalla dividida, así como nuevos diseños de pantalla grande en el panel de notificaciones y la pantalla de bloqueo, y modos de compatibilidad mejorados para las apps. Puedes obtener más información aquí.

Más adelante este año, la versión 12L estará disponible a través de actualizaciones planificadas en tablets y dispositivos plegables de Samsung, Lenovo y Microsoft, por lo que es momento de asegurarte de que tus apps estén listas. Recomendamos que pruebes tus apps en modo de pantalla dividida con ventanas de varios tamaños y en diferentes orientaciones, y que revises los nuevos cambios en el modo de compatibilidad, si es necesario. Puedes leer más sobre la versión 12L para desarrolladores aquí.

Y lo mejor es que las funciones de pantalla grande de la versión 12L son fundamentales en Android 13, por lo que puedes hacer desarrollos y pruebas en Android 13 sabiendo que también tienes cobertura para las tablets que ejecutan Android 12L. Las pantallas grandes son claves para el futuro de Android, por lo que seguimos invirtiendo a fin de darte las herramientas que necesitas para compilar grandes experiencias para tablets, Chromebooks y dispositivos plegables. Obtén más información sobre cómo dar tus primeros pasos en la optimización para pantallas grandes y asegúrate de echarle un vistazo a nuestros recursos para desarrolladores para pantallas grandes.

Veamos las novedades de la versión preliminar para desarrolladores 2 de Android 13.


Privacidad y confianza de los usuarios

Las personas buscan SO y apps a los que puedan confiar sus datos más personales y sensibles, así como los recursos de sus dispositivos. La privacidad y la confianza del usuario son principios fundamentales para los productos de Android, y en Android 13 seguimos centrándonos en compilar una plataforma responsable y de alta calidad para todos a través de un entorno más seguro en el dispositivo y mayor capacidad de control para el usuario. Estas son las novedades de la versión preliminar para desarrolladores 2.

Permiso de notificación: para ayudar a los usuarios a concentrarse en las notificaciones que consideran más importantes, Android 13 presenta un nuevo permiso de tiempo de ejecución para enviar notificaciones desde una app: POST_NOTIFICATIONS. Las apps para Android 13 deberán solicitar el permiso de notificaciones de los usuarios antes de enviarles notificaciones. En el caso de las apps compatibles con Android 12 o versiones anteriores, el sistema se encargará del flujo de actualización. El flujo seguirá perfeccionándose con el tiempo. Para proporcionar más contexto y control a tus usuarios, te invitamos a que te dirijas a Android 13 lo antes posible y solicites el permiso de notificación en tu app. Más información aquí.

Diálogo del permiso de notificación en Android 13.

Diálogo del permiso de notificación en Android 13.

Permisos revocables para los desarrolladores: es posible que algunas apps ya no requieran ciertos permisos que el usuario concedió con anterioridad para habilitar una función específica, o que conserven un permiso sensible de una versión anterior de Android. En Android 13, ponemos a disposición una nueva API para que puedas proteger la privacidad de los usuarios revocando permisos de tiempo de ejecución concedidos con anterioridad.

Exportación segura de receptores registrados en el contexto: en Android 12 les solicitamos a los desarrolladores que declararan la capacidad de exportación de los receptores de Intents declarados en el archivo de manifiesto. En Android 13, pedimos que hagan lo mismo en relación con los receptores registrados en el contexto, agregando la marca RECEIVER_EXPORTED o RECEIVER_NOT_EXPORTED cuando se registran receptores para fuentes que no son del sistema. Esto ayudará a garantizar que los receptores no estén disponibles para que otras apps realicen transmisiones, a menos que así se prefiera. Si bien no es un requisito en Android 13, te recomendamos declarar la capacidad de exportación como medida para fortalecer la seguridad de tu app.


Productividad de los desarrolladores

En Android 13, estamos trabajando para brindarte más herramientas que te ayuden a ofrecer una experiencia mejorada a los usuarios. Estas son algunas de las actualizaciones del lanzamiento de hoy.

Ajuste de texto en japonés mejorado: TextViews ahora puede ajustar el texto según Bunsetsu (la menor unidad de palabras que suena natural) o frases (en lugar de caracteres) para ofrecer apps en japonés mejores y de más fácil lectura. Puedes aprovechar este ajuste usando android:lineBreakWordStyle="phrase" con TextViews.

Ajuste de texto en japonés con estilo de frases activado (abajo) o desactivado (arriba).

Ajuste de texto en japonés con estilo de frases activado (abajo) o desactivado (arriba).

Mejora de la altura de las líneas para los alfabetos no latinos: Android 13 mejora la visualización de los alfabetos no latinos (como el tamil, birmano, telugu y tibetano) utilizando una altura de línea adaptada a cada idioma. Las nuevas alturas de las líneas evitan los recortes y mejoran el posicionamiento de los caracteres. Tu app puede beneficiarse con estas mejoras si está orientada a Android 13. Asegúrate de probar tus apps cuando uses una nueva línea de espaciado, ya que los cambios pueden afectar a la IU en el caso de los alfabetos no latinos.

Orientación del SDK para Android 12 y 13

Mejora de la altura de las líneas para los alfabetos no latinos en las apps orientadas a Android 13 (abajo).

API de conversión de textos: las personas que hablan idiomas como el japonés o el chino usan métodos para introducir letras fonéticas que suelen ralentizar la búsqueda y las funciones como el autocompletado. En Android 13, las apps pueden llamar a la nueva API de conversión de textos para que los usuarios puedan encontrar lo que buscan de manera más rápida y sencilla. Antes, por ejemplo, la búsqueda requería que el usuario japonés (1) usara hiragana para introducir la pronunciación fonética del término de su búsqueda (es decir, el nombre de un lugar o de una app), (2) utilizara el teclado para convertir los caracteres hiragana en kanji y (3) volviera a buscar utilizando los caracteres kanji para (4) obtener sus resultados de búsqueda. Con la nueva API de conversión de textos, los usuarios japoneses pueden escribir en hiragana y ver los resultados de la búsqueda en kanji en tiempo real, y evitar así los pasos 2 y 3.

Fuentes vectoriales en color: Android 13 aporta compatibilidad con la renderización para fuentes de la versión 1 de COLR (spec, intro video) y actualiza el emoji del sistema al formato COLRv1. COLRv1 es un nuevo formato de fuentes altamente compacto que renderiza de forma rápida y nítida en cualquier tamaño. Esto funcionará para la mayoría de las apps y el sistema se encargará de todo. Puedes optar por no utilizar COLRv1 para tu app a partir de la versión preliminar para desarrolladores 2. Si tu app implementa su propia renderización de texto y utiliza las fuentes del sistema, recomendamos utilizar esta alternativa y probar la renderización de emojis. Puedes obtener más información sobre COLRv1 en el anuncio de Chrome.

Emoji vectorizado (izquierda) y emoji de mapa de bits de COLRv1

Emoji vectorizado (izquierda) y emoji de mapa de bits de COLRv1.

Bluetooth LE Audio: Low Energy (LE) Audio es la próxima generación de audio inalámbrico, creada para sustituir a Bluetooth clásico y permitir nuevos casos de uso y topologías de conexión. Permite a los usuarios compartir y transmitir el audio a sus amigos y familias, o suscribirse a transmisiones públicas para obtener información, entretenimiento o accesibilidad. Está diseñado para garantizar que los usuarios reciban audio de alta fidelidad sin sacrificar duración de batería y sean capaces de alternar de manera fácil entre casos de uso que no eran compatibles con Bluetooth Classic. Android 13 agrega compatibilidad integrada con LE Audio, por lo que los desarrolladores deberían obtener las nuevas capacidades de forma gratuita en los dispositivos compatibles.

MIDI 2.0: Android 13 es compatible con el nuevo estándar MIDI 2.0 y es posible conectar con hardware de MIDI 2.0 mediante USB. Este estándar actualizado ofrece características como una mayor resolución para los controladores, una mejor compatibilidad con la entonación no occidental y una interpretación más expresiva mediante el uso de controladores por nota.


Compatibilidad con apps

Con cada lanzamiento en la plataforma, intentamos acelerar y simplificar las actualizaciones. Para ello, priorizamos la compatibilidad con apps a medida que implementamos nuevas versiones de la plataforma. En Android 13, los cambios en la app son opcionales para darte más tiempo. A su vez, hemos actualizado nuestras herramientas y procesos para ayudarte a que tengas todo listo antes.

Con la versión preliminar para desarrolladores 2, estamos en plena fase de lanzamiento y seguimos mejorando la estabilidad general, así que este es el momento de probar las nuevas funciones y los cambios y darnos tu opinión. En particular, queremos oír tus comentarios sobre nuestra API y que nos cuentes de qué manera los cambios en la plataforma afectan tus apps. Visita la página de comentarios para compartir tu opinión con nosotros e informar sobre cualquier problema.

timeline

También es un buen momento para empezar a hacer pruebas de compatibilidad y determinar en qué hay que trabajar. Recomendamos que comiences a trabajar lo antes posible, para contar con una actualización compatible con el lanzamiento de la versión beta 1 de Android 13. No es necesario cambiar la targetSdkVersion de tu app ya mismo, pero te recomendamos usar los botones de activación de cambio de comportamiento en las Opciones para desarrolladores para tener una idea preliminar de cómo tu app podría verse afectada por los cambios de participación de Android 13.

Cuando lleguemos a la estabilidad de la plataforma, en junio de 2022, todos los comportamientos del sistema de cara a la app, las API del SDK/NDK y las listas no relacionadas con el SDK estarán finalizados. En ese momento, puedes completar las pruebas finales de compatibilidad y lanzar una versión totalmente compatible de la app, el SKD o la biblioteca. Obtén más información sobre el cronograma para desarrolladores aquí.

Funciones de compatibilidad de la app que se pueden activar o desactivar en las Opciones para desarrolladores.

Funciones de compatibilidad de la app que se pueden activar o desactivar en las Opciones para desarrolladores.


Comienza a familiarizarte con Android 13

La versión preliminar para desarrolladores tiene todo lo que necesitas para probar las funciones de Android 13, evaluar el funcionamiento de tus apps y enviarnos tus comentarios. Puedes empezar hoy mismo mostrando una imagen del sistema del dispositivo en un dispositivo Pixel 6 Pro, Pixel 6, Pixel 5a 5G, Pixel 5, Pixel 4a (5G), Pixel 4a, Pixel 4 XL o Pixel 4. Si no tienes un dispositivo Pixel, puedes usar las imágenes del sistema de 64 bits con Android Emulator en Android Studio Dolphin. Para pruebas más amplias, hay imágenes GSI disponibles. Si ya instalaste una compilación de versión preliminar en tu dispositivo Pixel, obtendrás esta actualización y todas las versiones preliminares y versiones beta posteriores de manera automática e inalámbrica. Si necesitas más detalles sobre cómo obtener Android 13, visita este sitio.

Si quieres obtener más información, visita el sitio para desarrolladores de Android 13.