Publicado por Jolanda Verhoef, ingeniera de Relaciones con Desarrolladores de Android, y Anna-Chiara Bellini, gerente de Producto de la IU del kit de Herramientas de Android
Ya hace casi un año que se lanzó Jetpack Compose 1.0 y durante este tiempo, notamos el entusiasmo con el que la comunidad lo adoptó. Muchos desarrolladores nos comentaron que aprecian la concisión de la sintaxis de Kotlin y el enfoque declarativo, que hace que pensar en la IU sea una tarea más rápida y sencilla.
Muchas empresas adoptaron Compose a gran escala para las funciones más nuevas y audaces de sus apps. Por ejemplo, trabajamos en conjunto con el equipo de Play Store, que empezó a experimentar con Compose desde sus inicios. Sus miembros aprendieron que no solo es más agradable, sino también representa un beneficio para los desarrolladores en cuanto a la productividad. Nos comentaron que “todas las funciones nuevas de Play Store se compilaron conforme a este marco de trabajo. Compose fue fundamental para conseguir una mayor velocidad y un mejor destino para la app”. El equipo de Twitter usó Jetpack Compose en diferentes partes de la app y está disfrutando de los beneficios. Sus miembros nos comentan que “Compose hace que definir nuestros propios componentes sea mucho más fácil y también permite que los contratos de API sean más explícitos, intuitivos y flexibles”. El equipo de Airbnb también adoptó Compose: “Jetpack Compose es una parte fundamental de nuestra estrategia técnica. El aumento de la productividad es increíble”.
Nos complace saber que estos equipos, que evaluaron cuidadosamente Compose en entornos de producción grandes y complejos, no solo obtienen más diversión y claridad en el desarrollo de la IU, sino también beneficios de ingeniería más amplios. Y estos son solo unos pocos ejemplos, porque más de 100 de las 1000 apps más importantes de Play Store ahora usan Compose.
Estas colaboraciones estrechas, así como la atención a los comentarios de la comunidad de Android en general, están siempre en el centro de nuestro proceso de desarrollo y son fundamentales para avanzar en nuestra hoja de ruta. Ahora nos enfocamos en brindar compatibilidad con los casos de uso más avanzados, con nuevas API y mejoras en las funciones, todo ello junto con nuevas herramientas para facilitar la compilación con Compose. Sabemos que Compose cambia radicalmente la forma de compilar la IU. Para ayudarte a cambiar de mentalidad, publicaremos más guías, charlas y codelabs sobre temas avanzados, y más videos más detallados a fin de que puedas crear apps con un aspecto genial y un rendimiento excelente. Estas son las novedades:
Hoy lanzamos la primera versión beta de Compose 1.2, que incluye muchas funciones y mejoras.
Abordamos uno de los errores más votados en nuestra herramienta de seguimiento de problemas y personalizamos el parámetro de includeFontPadding. Recomendamos que este valor se configure como false, ya que permitirá una alineación más precisa del texto dentro del diseño. Nuestro objetivo es que este sea el valor predeterminado en una versión futura. Cuéntanos si configurar el valor como false genera problemas en tu app. Además, cuando se configura includeFontPadding como false, puedes adaptar la altura de la línea del texto que admite composición si configuras el parámetro lineHeightStyle. Si se combina, puede verse de la siguiente manera:
includeFontPadding
false
lineHeightStyle
Texto de varias líneas con includeFontPadding configurado como verdadero (izquierda, diseño predeterminado actual) en comparación con el parámetro configurado como falso (derecha) y lineHeightStyle.
Text( text = myText, style = TextStyle( lineHeight = 2.5.em, platformStyle = PlatformTextStyle( includeFontPadding = false ), lineHeightStyle = LineHeightStyle( alignment = Alignment.Center, trim = Trim.None ) ) )
En la versión 1.2 de Compose, se incluyen fuentes para descargar en Compose. Puedes usar las nuevas API de Compose para acceder a Google Fonts de manera asíncrona. Incluso puedes definir fuentes de resguardo sin realizar ninguna configuración compleja. Con las fuentes para descargar, puedes mantener un tamaño reducido para tu APK y mejorar el estado del sistema de los usuarios, ya que varias apps pueden compartir la misma fuente a través de un proveedor.
El texto de Android incluye un widget de ampliación que facilita la selección de texto. Compose ahora es compatible con la lupa para texto.
La lupa se muestra cuando se arrastra un controlador de selección para ayudarte a ver el texto debajo del dedo. Compose 1.1.0 incorporó la lupa a la selección dentro de los campos de texto y ahora Compose 1.2.0 la admite tanto en los campos de texto como en SelectionContainer. También se mejoró la lupa para que coincida con el comportamiento preciso de la de Android en Vistas.
SelectionContainer
Los diseños diferidos siguen mejorando con las API de LazyVerticalGrid y LazyHorizontalGrid, que ya no son experimentales. Además, se agregó una nueva API experimental, llamada LazyLayout, que te permite implementar tus propios diseños diferidos y personalizados. Obtén más información sobre estas API en la charla Diseños diferidos en Compose de I/O.
LazyVerticalGrid
LazyHorizontalGrid
LazyLayout
Cuando incorporas un elemento de desplazamiento que admite composición en un CoordinatorLayout desde la vista del sistema, puedes asegurarte de que su comportamiento de desplazamiento sea interoperable. Esto hace que la configuración de una barra de herramientas contraíble sea mucho más fácil. Puedes aceptar este comportamiento si pasas el resultado de la llamada al nuevo método experimental rememberNestedScrollInteropConnection al modificador nestedScroll. A continuación, se muestra un ejemplo de esta nueva función.
CoordinatorLayout
rememberNestedScrollInteropConnection
nestedScroll
La biblioteca de inserciones de Accompanist pasó a la biblioteca de Compose Fundation, con la clase WindowInsets. Obtén más información al respecto en nuestra documentación sobre Cómo integrar Compose con la IU existente.
WindowInsets
Para facilitar el diseño, el desarrollo y la comprobación de los diseños de tamaño ajustable, lanzamos las clases de tamaño de ventana, un conjunto de puntos de interrupción de viewports que se pueden determinar. Están disponibles en versión alfa en una nueva biblioteca material3-window-size-class, como parte del conjunto de bibliotecas de Material 3. Puedes leer más acerca de las clases de tamaño en la documentación sobre compatibilidad con diferentes tamaños de pantalla y ver un ejemplo de la implementación en Crane.
material3-window-size-class
Para ayudarte a comprender y mejorar el rendimiento de tu app, nos centramos en desarrollar nuevas guías y herramientas de rendimiento. Así, es mucho más fácil comprender por qué y en qué parte podría fallar tu app.
A partir de Android Studio Dolphin, con el Inspector de diseño puedes inspeccionar la frecuencia con la que se recomponen los elementos componibles. Una cantidad inesperada de recomposiciones puede indicarte un elemento componible que se podría optimizar. Además, Android Studio Electric Eel ahora incluye un resaltador de recomposición, una ayuda visual para ver qué elementos componibles se recomponen. Obtén más información sobre esta nueva herramienta en el blog Novedades de Android Studio.
El inspector de diseño, donde se muestra el recuento de recomposición y el resaltador de recomposición
Compose cambia la forma de escribir la IU a un nivel fundamental, por lo que te recomendamos seguir algunas prácticas recomendadas para asegurarte de que tu app tenga un buen rendimiento. En la nueva página de documentación, encontrarás sugerencias sobre cómo escribir y configurar tu app de Compose para obtener el mejor rendimiento. En la charla de I/O Los inconvenientes de rendimiento más comunes en Jetpack Compose, el equipo de Compose describe errores de rendimiento comunes y explica cómo solucionarlos.
El rendimiento es un área de interés permanente y nos estamos esforzando para mejorar y ampliar las herramientas y la orientación. Mientras tanto, nos encantaría conocer tus comentarios sobre el trabajo que hicimos hasta el momento. Puedes compartir en el seguimiento de problemas los errores que encuentras o hacerle tus preguntas al equipo de KotlinLang Slack.
Además de las mejoras, también presentamos nuevas actualizaciones de las herramientas para que utilices Compose de forma más eficaz. Android Studio Dolphin, actualmente en versión beta, incorpora funciones interesantes para el desarrollo en Compose. Además de los recuentos de recomposición, las nuevas herramientas incluyen Coordinación de animaciones para que puedas ver y revisar todas tus animaciones a la vez, y la anotación MultiPreview, que te ayuda a compilar para distintos tamaños de pantalla. Para permitirte iterar más rápido, Android Studio Electric Eel (en Canary) incorpora LiveEdit.
Consulta Novedades sobre las herramientas de desarrollo de Android para obtener más detalles. No te olvides de compartir tus comentarios para ayudarnos a dar forma a las herramientas que necesitas de Compose.
Si hay algo mejor que Compose, es más Compose. ¡Nos da mucha alegría ver la transición de Compose para Wear OS a la versión beta! Al igual que en cualquier otra biblioteca de Jetpack, beta significa que la versión está completa en cuanto a funciones y estable en cuanto a la API, y que puedes empezar a compilar tus apps para la producción. Continúa y lee la entrada de blog.
Agregamos y renovamos muchas de las guías en Compose:
Esperamos que también disfrutes de estas nuevas funciones. Si aún no comenzaste, es hora de aprender sobre Jetpack Compose y ver cómo se ajusta a las necesidades de tu equipo y al proceso de desarrollo, para que puedas experimentar todos los beneficios de la mejora de la velocidad y la productividad de los desarrolladores. ¡Feliz trabajo con Compose!
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.
package:lints
dart:ffi
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.
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.
enum Water { frozen, lukewarm, boiling }
enum
String
waterToTemp()
toString()
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:
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:
toString
enums
Object
@overrideString 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.
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.
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.
List<T>.generate
Para ver más ejemplos de estas tres funciones en acción, consulta nuestras muestras actualizadas de enumeraciones, superinicializadores y parámetros con nombre.
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:
dart pub upgrade —-major-versions lints
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().
keyLog
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.
dart doc
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).
dart:io
dart fix
dartdoc
pub
dart pub
flutter pub
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.
flutter
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.
Long
long
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.
Finalizable
NativeFinalizer
WeakReferences
Finalizer
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.
dart compile
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.
2.17.0–266.1.beta
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.
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
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:
Para obtener aún más funciones de vanguardia, puedes ver un adelanto del lanzamiento de Android Studio Electric Eel en el canal Canary:
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:
Coordinación de animaciones de Compose
Anotaciones de diferentes vistas previas
Recuentos de recomposición de Compose
Asistente de sincronización del emulador de Wear OS
Barra de herramientas lateral del emulador de Wear OS
Nuevas clases de configuración de ejecución y depuración de Wear OS
Logcat V2
Dispositivos administrados de Gradle
A continuación, se incluye una lista de nuevas funciones y mejoras clave en Android Studio Electric Eel:
Emulador de Live Edit
Vista previa de Live Edit
Estadísticas del Índice de SDK de Google Play
App Quality Insights de Firebase Crashlytics
Emulador de tamaño ajustable
Visual Linting
Sincronización de dos Android Emulators con Bluetooth emulado
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
Wear OS
Herramientas de desarrollo
Estas son las nuevas funciones y mejoras que están disponibles en Android Studio Electric Eel Canary:
Google Play y Firebase
Pantallas grandes
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
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.
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:
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:
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:
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:
Luego, concluiremos con algunas actualizaciones adicionales clave.
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.
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 { ...
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.
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.
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.
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.
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.
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.
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.
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:
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.
Se introdujeron varios cambios en nuestras bibliotecas de IU para ofrecer mayor compatibilidad con pantallas grandes, dispositivos plegables y emojis.
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.
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.
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.
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.
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.
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:
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.