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.
Entrada publicada por Dave Burke, vicepresidente de Ingeniería
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.
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.
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.
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.
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.
android:lineBreakWordStyle="phrase"
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.
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.
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.
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.
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.
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.