Ilustración de Virginia Poltrack




Actualización del lanzamiento de Android 11 Beta, lanzamiento estable de Android Studio 4.0, artículos y videos de Kotlin, código de muestra y un episodio de podcast de ADB sobre cuadros


Ilustración de Virginia Poltrack




Actualización del lanzamiento de Android 11 Beta, lanzamiento estable de Android Studio 4.0, artículos y videos de Kotlin, código de muestra y un episodio de podcast de ADB sobre cuadros

Te damos la bienvenida a Now in Android, una guía que actualizamos constantemente con las novedades más importantes sobre el desarrollo de Android.

#Android11: Se pospuso The Beta Launch Show



Probablemente ya lo sepas, pero se pospuso el lanzamiento de The Beta Launch Show, originalmente programado para el 3 de junio. Busca las actualizaciones sobre el cronograma y los detalles en el sitio. Mientras tanto, se publicaron más detalles sobre el contenido que puedes esperar ver, cuando eso suceda. Mantente al tanto, ya que muy pronto tendremos más información.


Flutter y apps para computadoras

Progreso continuo hacia una visión de computación ambiental

Somos bastante abiertos acerca de nuestra misión para hacer que Flutter apunte a una amplia variedad de dispositivos (lo que incluye iOS, Android, Windows, Linux, macOS y la Web) desde una única base de código, con compilación nativa y visuales de calidad de juego. En Google, se usa Flutter en proyectos que van desde el ...

Flutter y apps para computadoras

Progreso continuo hacia una visión de computación ambiental

Somos bastante abiertos acerca de nuestra misión para hacer que Flutter apunte a una amplia variedad de dispositivos (lo que incluye iOS, Android, Windows, Linux, macOS y la Web) desde una única base de código, con compilación nativa y visuales de calidad de juego. En Google, se usa Flutter en proyectos que van desde el Asistente y Stadia hasta Cloud Search y Blogger. Y, fuera de Google, lo han adoptado diferentes empresas, como ByteDance, Grab, Nubank y MGM Resorts, que se benefician de la productividad y flexibilidad de Flutter.
Muchos de ustedes están interesados en el progreso de los sistemas operativos para computadoras de escritorio, como Windows, macOS y Linux: en las encuestas y en GitHub, las computadoras de escritorio son repetidamente una de las funciones nuevas más populares. Mostraremos más de nuestro trabajo aquí en las próximas semanas y pensamos que deberíamos empezar por estudiar algunos de los trabajos de varios conjuntos de funciones que contribuyen al proyecto general. Si bien la compatibilidad con computadoras de escritorio es actualmente un avance técnico, ha habido mucho trabajo en marcha.



Modo de lanzamiento

Recientemente, implementamos el modo de lanzamiento para Windows y Linux, además de la compatibilidad existente para macOS. Por ejemplo, si estás ejecutando las versiones más recientes de Flutter, ahora puedes compilar una aplicación de Flutter en un archivo ejecutable de Windows con flutter build windows. Esto utiliza nuestro compilador AOT de producción para crear código de máquina nativo x64 que se puede distribuir a una máquina que no tenga Flutter instalado.

Experiencias de clase para computadoras de escritorio

Ya sea que estés compilando archivos ejecutables independientes o aplicaciones web, hay atributos únicos a fin de compilar experiencias de clase para computadoras de escritorio. Las ventanas de las computadoras de escritorio suelen estar en modo de paisaje y son redimensionables; la entrada, en lugar de provenir de un toque o un teclado en pantalla, suele provenir de un teclado y un mouse físicos; y los controles están optimizados para una densidad de pantalla diferente.
A nivel del marco de trabajo, hemos hecho varios cambios en Flutter a fin de admitir las experiencias de clases para computadoras de escritorio.
  • Cuando crees un nuevo proyecto en compilaciones recientes, verás que la plantilla predeterminada ahora incluye una referencia a una propiedad visualDensity, que habilita controles para adaptar su densidad en función de la plataforma a la que se dirige, con un espacio más compacto en las plataformas de computadoras de escritorio. Un ejemplo de cómo se utiliza esto es TextField, que ahora ofrece espacio compacto, cómodo y estándar según la densidad especificada.
  • Hemos agregado compatibilidad mejorada para la entrada de datos con el mouse y el teclado; esto incluye códigos de tecla sin procesar en Windows, el botón derecho del mouse, cambios de cursores y compatibilidad con la rueda de desplazamiento.
  • Ahora puedes consultar la plataforma específica (mediante la clase Platform), y Windows, macOS y Linux proporcionan los resultados adecuados.
  • En el lanzamiento más reciente, hemos agregado un widget de NavigationRail que está específicamente diseñado para experiencias de clase en computadoras de escritorio y tablets.

FFI

El equipo del Dart ha estado trabajando duro para pulir Foreign Function Interface (FFI), que es un gran potenciador de velocidad para la integración de la plataforma. En el caso de las API basadas en C, la biblioteca dart:ffi proporciona un mecanismo directo para vincularse al código nativo; el tiempo de ejecución de Dart proporciona la capacidad de asignar memoria en el montón que está respaldado por un objeto Dart y hacer llamadas a bibliotecas vinculadas dinámicamente.
Para un simple ejemplo de Windows, aquí hay un fragmento de código para llamar a la tradicional API de Win32 MessageBox() enteramente con código de Dart:

En este código, proporcionamos typedefs que representan la firma del método, tanto en sus representaciones nativas como en las basadas en Dart. Con esos elementos definidos, podemos cargar la biblioteca de vínculo dinámico (DLL) de Windows, que proporciona la implementación de la función mediante el método lookupFunction(), que mapea la firma de la función de Dart en el punto de entrada nativo subyacente. Por último, agregamos un simple wrapper idiomático para que sea fácilmente accesible desde otro código de Dart, lo cual genera algo como esto:


Una simple app de ejemplo de Windows que usa la API de MessageBox de Win32

Por supuesto, no tienes que hacer este trabajo tú mismo; lo más probable es que alguien ya haya sentado las bases para la API que quieres usar. Puedes leer más en nuestros documentos sobre cómo usar FFI desde Flutter.

Actualización del modelo del complemento

Por diseño, Flutter tiene un pequeño núcleo. En lugar de agregar peso al marco de trabajo base, los complementos y paquetes (ya sea directamente del equipo de Flutter o del ecosistema de colaboradores más amplio) proporcionan integración con los sistemas operativos subyacentes.
Sin embargo, con Flutter admitiendo cada vez más experiencias para dispositivos móviles, la Web y computadoras de escritorio, el desarrollo de un complemento para cada plataforma compatible se hace cada vez más difícil. Es más probable que un complemento requiera contribuciones de diferentes autores que tengan experiencia en cada plataforma.
Una técnica útil es definir una interfaz común como parte del complemento del núcleo que cada plataforma puede implementar de manera independiente. De esa forma, como se describe en una publicación reciente sobre el desarrollo de complementos modernos, hemos adaptado un esquema de complementos para permitir que el desarrollo de la plataforma se pueda unificar más fácilmente entre varios autores. Como parte de este trabajo, ahora es posible declarar explícitamente qué plataformas son compatibles con un complemento.
Hemos empezado a compilar algunos de los complementos principales usando este modelo, y encontrarás algunos prototipos del modelo unificado en el repositorio flutter/plugins.
Ten en cuenta que las API de los complementos de Windows y Linux aún están en proceso de cambios, así que, si bien te recomendamos que los explores, no estamos preparados en este momento para brindar compatibilidad de producción de uso general. También estamos trabajando a fin de agregar etiquetas de plataforma para computadoras de escritorio en pub.dev.

Ejecución en Windows: Win32 y UWP

Un aspecto interesante del trabajo que hemos realizado en Windows es experimentar con varios enfoques de arquitectura. En cualquier plataforma, Flutter está incorporado en una pequeña aplicación de contenedor de host (un "incorporador"), que usa un enfoque similar a los motores de juego como Unity. Este incorporador específico de la plataforma proporciona un punto de entrada; coordina con el sistema operativo subyacente para el acceso a servicios como las superficies de prestación, la accesibilidad y la entrada; y administra el bucle de eventos de mensajes.



Windows ofrece dos enfoques distintos para crear este incorporador. En primer lugar, el modelo de programación maduro de Win32 puede utilizarse a fin de crear el punto de entrada para el contenido de Flutter, lo que ofrece la máxima compatibilidad con plataformas como Windows 7 y compila un archivo EXE estándar que muchos desarrolladores prefieren usar. Por el contrario, el modelo de app UWP moderno es el enfoque recomendado para Windows 10 y ofrece oportunidades interesantes para ampliar la compatibilidad de Flutter a dispositivos como Xbox o el próximo sistema operativo Windows 10X.
Hemos estado trabajando de manera informal con varios colaboradores para explorar diferentes soluciones y nos encantaría trabajar de forma estrecha con Microsoft para generar una solución de alta calidad. Con la familia de dispositivos Surface extendida para incluir Android y Windows, creemos que Flutter ofrece a Microsoft una plataforma convincente en la que puede compilar experiencias nativas increíbles que abarcan toda su gama de productos.

Diversión con experiencias de escritorio

Este trabajo sigue en vista previa técnica, y las API y herramientas aún no son estables. Todavía hay mucho trabajo que queremos completar antes de promocionar la compatibilidad con computadoras de escritorio a una versión estable, por ejemplo, la mejora de accesibilidad y la compatibilidad con localización.
Si quieres probar esto, tendrás que estar en un canal de desarrollo. Windows y Linux solo están disponibles en la rama principal, que es donde tiene lugar el desarrollo activo de Flutter; macOS está disponible en la rama de desarrollo, que es ligeramente más estable, pero no se recomienda para su uso en producción. Puedes cambiar de canal con flutter channel master o flutter channel dev, y luego usar uno de estos comandos para admitir la plataforma que estés usando:
C:\flutter> flutter config --enable-windows-desktop
$ flutter config --enable-macos-desktop
$ flutter config --enable-linux-desktop
Ya estamos viendo cómo algunos desarrolladores aventureros empiezan a aprovechar Flutter en computadoras de escritorio para crear apps. Una de las primeras aplicaciones de escritorio para macOS en Flutter que vimos es Sharezone, un organizador estudiantil dirigido al mercado educativo alemán, que comenzó como una aplicación para dispositivos móviles, pero que recientemente agregó versiones web y para computadoras de escritorio.


Sharezone Schulplan, una aplicación para que estudiantes, educadores y padres puedan hacer un seguimiento de tareas, grupos de estudio y horarios.

Compartiremos más sobre la compatibilidad con computadoras de escritorio en las próximas semanas. Mientras tanto, nos encantaría escuchar tus experiencias. Si escribes complementos, nos gustaría que empieces a evaluar el trabajo que te tomaría admitir estas próximas plataformas de escritorio. Si ya publicaste una app, ¿por qué no intentas ejecutarla como una aplicación para computadoras de escritorio y nos cuentas cómo te va?




Sugerencias y trucos para resolver errores más rápido en Android

Como desarrolladores, sabemos que hay días que pasamos más tiempo en el depurador que en el editor de código. Teniendo en cuenta esto, recientemente aproveché la oportunidad para ver qué sugerencias y trucos tenían los miembros del equipo de Android Studio a la hora de acelerar el proceso de depuración. Recopilé algunos de los mejores que creo que te ayudarán a ahorrar tiempo y serán fáciles de incorporar a tu flujo de depuración.



Sugerencias y trucos para resolver errores más rápido en Android

Como desarrolladores, sabemos que hay días que pasamos más tiempo en el depurador que en el editor de código. Teniendo en cuenta esto, recientemente aproveché la oportunidad para ver qué sugerencias y trucos tenían los miembros del equipo de Android Studio a la hora de acelerar el proceso de depuración. Recopilé algunos de los mejores que creo que te ayudarán a ahorrar tiempo y serán fáciles de incorporar a tu flujo de depuración.
Si bien es posible que tu aplicación sea muy diferente del juego ficticio que estamos usando como ejemplo, estas sugerencias de depuración sirven para cualquier app.
Si prefieres ver una demostración en vivo, encontrarás una versión en video de este artículo en YouTube.

Filtrado y plegado de registros

Comenzaré con una sugerencia para ese aspecto clásico de la depuración: declaraciones printf. Toma un juego que registre su tasa de fotogramas cada 1 segundo y la puntuación final del usuario al término de cada partida. En la ventana Logcat, eso se ve así:

Ventana Logcat

En el resultado hay mucha información que quizá no te interese, como la fecha y los ID de los subprocesos. Puedes configurar fácilmente lo que se muestra. Desde la barra de herramientas logcat, haz clic en ícono de Settings. En el diálogo Configure Logcat Header, anula la selección de la información que ya no quieras ver.

Diálogo Configure Logcat Header

Ahora obtienes un resultado de registro mucho más breve y relevante, como este:

resultado de registro

Sin embargo, los mensajes de puntuación alta siguen siendo poco claros. Para enfocarte en esos mensajes, usa la búsqueda de logcat. Ingresa parte del mensaje de depuración en Search para filtrar la ventana logcat.

ventana logcat

Si se trata de una búsqueda que utilizas con frecuencia, puedes guardarla agregando un filtro personalizado de Edit Filter Configuration.

Configuración de filtro

Luego, agrega los detalles del filtro.


Otra forma de reducir la sobrecarga de registros es utilizar la función de líneas de pliegue, que agrupa y colapsa las líneas que son similares. Selecciona texto de un elemento del registro, haz clic en él con el botón derecho y selecciona Fold Lines Like This.


Cuando se abra el diálogo Console, haz clic en OK y se contraerán los mensajes similares que contengan el texto.


Si necesitas ver esa información más tarde, puedes hacer clic en las líneas para expandirlas. También hay medianiles que permiten expandir y contraer las líneas plegadas.

Cómo adjuntar el depurador

Por lo general, se inicia una sesión de depuración con el botón o la opción de menú Debug. Sin embargo, si iniciaste una app ejecutándola, puedes adjuntar un depurador a la app en ejecución sin necesidad de reiniciarla. Para ello, haz clic en Attach Debugger to Android Process.


En el diálogo Choose Process, resalta el proceso al que quieres adjuntar el depurador y haz clic en OK. Ahora, empezarás con los puntos de interrupción como lo harías normalmente en una sesión de depuración.

Cómo mover puntos de interrupción

Si descubriste que se estableció un punto de interrupción en una ubicación inapropiada, en lugar de borrar y restablecer el punto, puedes arrastrarlo hasta la línea que te interesa. Esto es útil porque preserva la configuración del punto de interrupción, incluidos los aspectos que voy a mencionar en breve.

Puntos de interrupción condicionales

Es posible que debas resolver un error relacionado con un tipo de evento específico de tu app o juego. Por ejemplo, en un juego que estés desarrollando, puede que quieras detenerte cuando un jugador choque contra el objeto que consume la última vida que le queda. Estableciste un punto de interrupción en los choques, pero ahora el código se detiene en cada colisión. Para evitar eso, puedes establecer un punto de interrupción condicional.
¿Cómo? Haz clic con el botón derecho en un punto de interrupción y agrega una condición, que puede ser cualquier expresión de código que equivalga a una función booleana. Cuando el código llegue a la línea, si se determina que la expresión es verdadera, se activará el punto de interrupción.
Aquí, en la lógica cuando el jugador está a punto de chocar contra un objeto, establecer una condición player.health == 1 permite determinar la última vez que el jugador colisiona contra el objeto antes de que su salud baje a 0.


Puntos de interrupción dependientes

No es inusual que una app tenga código que pueda activarse en diferentes situaciones. Si detectas un error que solo se produce ante una situación en particular, establecer un punto de interrupción en el código puede generar un montón de interrupciones innecesarias. Para evitar eso, utiliza puntos de interrupción dependientes, que se activan solo después de que se haya alcanzado otro punto de interrupción especificado. Por ejemplo, puedes crear un punto de interrupción que se active únicamente en la situación que te interese y, luego, usarlo como una dependencia; de ese modo, el otro punto de interrupción se activará solamente en el escenario relevante.
Para establecer un punto de interrupción dependiente, haz clic con el botón derecho en el segundo punto de interrupción y abre el menú More. En Disable until breakpoint is hit, elige el punto de interrupción del que quieras depender.


Notarás que cambia el ícono del punto de interrupción:


Ahora, solo te detendrás aquí después de que se alcance el punto de interrupción anterior.
También puedes utilizar esta función cuando tienes un punto de interrupción condicional en otro lugar y quieres evitar la tarea de copiar y pegar esa condición en una nueva ubicación.

Suspensión de subprocesos

Si estás depurando una aplicación que tiene varios subprocesos, notarás que, de forma predeterminada, los puntos de interrupción suspenden todos los subprocesos. Sin embargo, puede que no quieras usar ese comportamiento. Por ejemplo, tal vez quieras verificar que puedes bloquear un subproceso específico y que el resto de tu app sigue funcionando correctamente, o quizá quieras que tu IU siga procesándose mientras investigas una tarea en segundo plano.
Para suspender únicamente el subproceso actual, abre las opciones del punto de interrupción y selecciona Thread en la opción Suspend.


Evaluación y registro

A veces, en lugar de detenerte en un punto de interrupción, quieres ver datos asociados con el estado de la app. Para ello, podrías agregar métodos println al código. En lugar de utilizar este enfoque, que requiere una recompilación, se puede utilizar el propio punto de interrupción para realizar una evaluación y un registro.
Para ello, en las opciones del punto de interrupción, inhabilita Suspend y habilita Evaluate and log.


Ahora puedes agregar cualquier expresión de código, y será evaluada y registrada en la consola.
Si solo quieres verificar rápidamente que se haya activado tu punto de interrupción (sin entrar en detalles), utiliza el mensaje "Breakpoint hit" para registrar que se alcanzó el punto de interrupción. Incluso hay una forma rápida de crear este tipo de punto de interrupción: solo debes presionar la tecla mayúscula y hacer clic en el medianil.

Cómo inhabilitar puntos de interrupción

Si quieres inhabilitar rápidamente un punto de interrupción, en lugar de hacer clic con el botón derecho y anular la selección de Enabled, puedes presionar la tecla Alt (Option en Mac) y hacer clic para activar o desactivar un punto de interrupción.

Grupos de puntos de interrupción

Has estado trabajando en un error, creando puntos de interrupción, pero avanzas muy poco. Así que comienzas a trabajar en otro error. Sin embargo, empiezas a alcanzar los puntos de interrupción del primer error. Alcanzar puntos de interrupción no relacionados puede ser frustrante e interfiere en tu flujo de depuración.
Para solucionar problemas de ese tipo, usa grupos de puntos de interrupción.
Cuando llegues al primer punto de interrupción no deseado, haz clic con el botón derecho y abre More. Ahora, verás una lista de todos los puntos de interrupción. Selecciona a la vez todos los puntos de interrupción asociados con el primer error.


Haz clic con el botón derecho en los puntos de interrupción seleccionados y elige Move to group y, luego, Create new. Asígnale un nombre al grupo, tal vez relacionado con el error en el que estabas trabajando. Ahora puedes activar y desactivar fácilmente todos los puntos de interrupción con un solo clic.


Además, cuando termines con el error, podrás usar el grupo para borrar todos los puntos de interrupción.

Omisión de fotogramas

En ocasiones, cuando analizas código suspendido, es posible que accidentalmente omitas un método en lugar de utilizarlo. Si ejecutas Android 10 o una versión posterior, ahora puedes retroceder haciendo clic en Drop Frame, en la barra de herramientas del depurador.


Esta función te saca del método actual y te regresa al punto anterior, lo que te da una segunda oportunidad de entrar en el método.
Esta opción no es una "máquina del tiempo". Si estuvieras en medio de una función extensa y se hubiera hecho mucho trabajo intermedio (por ejemplo, modificar el estado de la clase actual), no se desharía ese trabajo cuando omitieras el fotograma.

Marcación de objetos

Hay veces en las que quieres seguir el ciclo de vida de una clase específica, como en este ejemplo, con un artículo que tiene un hashcode @10140.


Podría tentarte sacar una hoja de papel y escribir 10140 para poder identificar el objeto cuando vuelva a aparecer. Sin embargo, de forma alternativa, puedes hacer clic con el botón derecho en el elemento, elegir Mark Object y etiquetarlo.
Ahora, en cualquier lugar de las ventanas de depuración en que aparezca este objeto marcado, estará etiquetado y será fácil de encontrar. Aquí, etiquetamos el objeto como "myItem":


Lo que hace que esto sea aún mejor para rastrear un objeto es la capacidad de verlo en la ventana Watches, incluso si estás en un contexto totalmente diferente en el que no se puede acceder a ese objeto de otra manera. Dondequiera que estés, siempre y cuando hayas llegado a un punto de interrupción, en la ventana Watches, agrega tu etiqueta seguida de "_DebugLabel" (no te preocupes por recordar esto, ya que se completará automáticamente).


Ahora, puedes seguir el elemento de la clase en cualquier lugar de la ventana Watches para ver su estado.
También puedes combinar esta función con puntos de interrupción condicionales. Por ejemplo, puedes establecer un punto de interrupción, hacer clic con el botón derecho y establecer la condición para analizarlo con un objeto etiquetado.


Ahora, en lugar de pasar por varios puntos de interrupción hasta que se alcance la instancia del elemento específico, el código se rompe en el lugar adecuado.


Evaluación de expresiones

Si bien las ventanas Variables y Watches son útiles para mantener las pestañas con valores explícitos, a veces se quiere explorar el código más libremente, que es donde entra la función para evaluar expresiones. Cuando estés en un punto de interrupción, accede a esta función desde Evaluate expression, en la barra de herramientas del depurador.


En la entrada de texto Expression, ingresa cualquier expresión y presiona Evaluate para evaluarla. Además, si se evalúa un objeto, después de la evaluación, se puede explorar el objeto en la sección Result.


El diálogo de expresión de evaluación puede abrirse en el modo de línea única. Puedes expandirlo fácilmente en varias líneas haciendo clic en Expand.


Ahora puedes ingresar expresiones complejas y de varias líneas. Entre otros aspectos, pueden incluir variables y declaraciones condicionales.


Aplicación de cambios

Cuando tienes un punto de interrupción condicional en el que se evalúa una expresión, incluso si no te detienes en ese punto de interrupción, el depurador igual debe hacer la evaluación. Si ejecutas código en un bucle muy estrecho, como el procesamiento de animación de un juego, esto puede hacer que falle la aplicación. Si bien los puntos de interrupción condicionales son útiles, este puede ser un caso límite en el que no se puede depender de ellos.
Una forma de evitar este problema es agregar la expresión condicional al código y usar una expresión "no op" para poder adjuntar el punto de interrupción.


Luego, puedes decidir reiniciar la app y hacer clic en Debug. Sin embargo, en lugar de eso, cuando se ejecuta Android 8 y versiones posteriores, se puede utilizar Apply Code Changes.


Ahora tu código tiene un parche con la expresión incorporada. Sin embargo, verás en la ventana Frames que el método que actualizaste aparece marcado como Obsolete.


Esto se debe a que se agregó un parche al nuevo código, pero tu depurador sigue apuntando al código antiguo. Puedes usar la función Drop frame para dejar el método antiguo y pasar al nuevo.
Aunque no la necesitamos en este caso, hay una segunda opción: Apply Changes and Restart Activity. A diferencia de Apply Code Changes, esta opción también reinicia la actividad, lo que es útil si modificaste los recursos de diseño o si el código que estás tratando de depurar está, por ejemplo, en un método onCreate.


Cómo analizar el seguimiento de pila

A pesar de todos estas sugerencias y trucos, lamentablemente, es probable que igual detectes errores en tu código y que recibas informes al respecto. Es posible que, cuando recibas esos errores, el usuario que los haya informado haya incluido una copia de texto de la pila de la excepción. En Android Studio, puedes convertir eso en información significativa usando, desde el menú Analyze, la opción Analyze Stack Trace or Thread Dump.
Esta herramienta proporciona un lugar para pegar un seguimiento de pila, pero se propagará automáticamente con cualquier texto que haya en tu portapapeles.


Si haces clic en OK, se agregará a la consola una versión con anotaciones del seguimiento de pila.


Puedes ver de un vistazo lo que pertenece a tu código base (resaltado en azul arriba) y el código al que probablemente no necesitas prestar atención (resaltado en gris). Además, puedes hacer clic en los vínculos para desplazarte rápidamente a través de tu código base.

Últimas palabras

Estos son solo algunos de los trucos y sugerencias que puedes usar para acelerar tu proceso de depuración. Entre los que no tuvimos tiempo de detallar aquí, se incluyen los siguientes:
  • En el modo de depuración, haz clic en un número de línea del medianil para ir a esa línea.
  • Si presionas Ctrl y arrastras, se hace una copia de un punto de interrupción.
  • Puedes establecer puntos de interrupción en el corchete de cierre de una función.
  • Se pueden establecer puntos de interrupción en campos y propiedades (llamados "puntos de análisis de campo").
  • Se puede establecer un punto de interrupción en un método de interfaz para usar en todas sus implementaciones.
También hay varios videos relacionados con este tema que tal vez quieras ver:



Publicado por Adarsh Fernando, gerente de producto
Logotipo de Android Studio
En estos tiempos de incertidumbre, nos sentimos honrados por los muchos desarrolladores de todo el mundo que están encontrando formas de seguir haciendo lo que mejor saben hacer: crear apps increíbles para Android. Ya sea que trabajes desde la mesa de la cocina en una laptop o desde una oficina en casa, necesitas herramientas que te acompañen. Android Studio 4.0 es el resultado de nuestro esfuerzo por ofrecerte herramientas innovadoras y mejoradas para codificar de forma más inteligente, compilar más rápido y diseñar las apps de las que dependen tus usuarios, y ...


Publicado por Adarsh Fernando, gerente de producto
Logotipo de Android Studio
En estos tiempos de incertidumbre, nos sentimos honrados por los muchos desarrolladores de todo el mundo que están encontrando formas de seguir haciendo lo que mejor saben hacer: crear apps increíbles para Android. Ya sea que trabajes desde la mesa de la cocina en una laptop o desde una oficina en casa, necesitas herramientas que te acompañen. Android Studio 4.0 es el resultado de nuestro esfuerzo por ofrecerte herramientas innovadoras y mejoradas para codificar de forma más inteligente, compilar más rápido y diseñar las apps de las que dependen tus usuarios, y ahora está disponible en el canal estable.
Algunos de los aspectos más destacados de Android Studio 4.0 son la nueva versión de Motion Editor para ayudar a darles vida a tus aplicaciones, Build Analyzer para investigar las causas de los tiempos de compilación más lentos y API en lenguaje Java 8 que puedes utilizar independientemente del nivel mínimo de API de tu app. Basándonos en tus comentarios, también hemos optimizado la interfaz de usuario de CPU Profiler para proporcionar un flujo de trabajo más intuitivo y un análisis más fácil de la actividad de subprocesos. Y la versión mejorada de Layout Inspector ahora proporciona datos en vivo de la IU de tu app para que puedas depurar fácilmente lo que se muestra en el dispositivo.
Como siempre, este lanzamiento no sería posible sin los primeros comentarios de nuestros usuarios de la versión de vista previa; así que sigue leyendo o mira abajo para conocer más detalles y nuevas funciones disponibles en esta versión estable. Si prefieres ver todo esto por tu cuenta, dirígete a la página web oficial para descargar Android Studio 4.0 ahora.

Diseño

Motion Editor

La API de MotionLayout amplía las capacidades enriquecidas de ConstraintLayout para ayudar a los desarrolladores de Android a administrar movimientos complejos y la animación de widgets en sus apps. En Android Studio 4.0, se facilita el uso de esta API con Motion Editor: una nueva y potente interfaz que no solo permite crear y editar animaciones de MotionLayout, sino también obtener vistas previas de eso. Olvídate de crear y modificar archivos XML complejos, ya que Motion Editor los genera por ti, con compatibilidad para editar conjuntos de restricciones, transiciones, fotogramas clave y atributos de vista. Y, si quieres ver el código que crea el editor, eso está a un clic de distancia. Además, para los desarrolladores que ya usan ConstraintLayout, el ID puede convertir fácilmente esos objetos a MotionLayout, lo que es muy conveniente. Más información
Crea y edita animaciones, y obtén vistas previas, en Motion Editor
Crea y edita animaciones, y obtén vistas previas, en Motion Editor

Versión mejorada de Layout Inspector

¿Alguna vez has querido investigar dónde se originó el valor de un atributo específico? ¿O ver una representación 3D en vivo de las vistas anidadas para inspeccionar más fácilmente tu jerarquía de vistas? Con la nueva versión de Layout Inspector, la depuración de IU es mucho más intuitiva, ya que permite acceder a datos que se mantienen actualizados con la app en ejecución y proporciona información sobre cómo se resuelven los recursos.
Depura la IU de tu app en tiempo real con Live Layout Inspector
Depura la IU de tu app en tiempo real con Live Layout Inspector
Usa Live Layout Inspector seleccionando View > Tool Windows > Layout Inspector en el menú principal. Si quieres realizar una implementación en un dispositivo que ejecuta el nivel 29 de la API o una versión posterior, tienes acceso a funciones adicionales, como una jerarquía de diseño dinámica que se actualiza a medida que cambian las vistas, atributos de vista detallados que también te ayudan a determinar cómo se resuelven los valores de los recursos y un modelo 3D en vivo de la IU de tu app en ejecución. Navega, anima y realiza transiciones entre vistas en tu app en ejecución, mientras que siempre tienes la posibilidad de depurar tu IU a la perfección de los píxeles. Más información

Layout Validation

Compara tu UI en varias pantallas con Layout Validation
Compara tu UI en varias pantallas con Layout Validation
Cuando desarrollas contenido para varios factores de forma, tamaños de pantalla y resoluciones, es necesario verificar que los cambios que se hagan en la IU se vean correctamente en todas las pantallas admitidas. Con la ventana Layout Validation, puedes obtener simultáneamente una vista previa de los diseños en diferentes pantallas y configuraciones, de modo que puedas asegurarte con facilidad de que tu app se vea bien en una variedad de dispositivos. Para comenzar, haz clic en la pestaña Layout Validation, en la esquina superior derecha del IDE.

Desarrollo y perfil

Mejoras de IU en CPU Profiler

La IU mejorada de CPU Profiler
La IU mejorada de CPU Profiler
Se diseñó la herramienta CPU Profiler para proporcionar una gran cantidad de información sobre la actividad de los subprocesos y los registros de seguimiento de tu app. Por eso, escuchamos los comentarios que recibimos sobre cómo podemos hacer que la IU sea aún más intuitiva para navegar y que los datos sean más fáciles de entender. En Android Studio 4.0, los registros de la CPU ahora están separados del cronograma del generador de perfiles principal y se organizaron en grupos para que el análisis sea más sencillo. Puedes mover los grupos hacia arriba y hacia abajo, o bien arrastrar y soltar elementos individuales dentro de un grupo para una personalización adicional.
Es más fácil analizar en paralelo la actividad de los subprocesos
Es más fácil analizar en paralelo la actividad de los subprocesos
A fin de facilitar el análisis paralelo, ahora puedes ver toda la actividad de los subprocesos en el cronograma de su actividad (lo que incluye métodos, funciones y eventos) y probar nuevas combinaciones de teclas de navegación para moverte fácilmente por los datos, como usar las teclas W, A, S y D para mostrar un panorama general o hacer zoom de forma detallada. También hemos rediseñado la IU de System Trace a fin de que los eventos tengan un color único para una mejor distinción visual, se ordenen los subprocesos y se muestren primero los más ocupados, y puedas enfocarte en ver los datos de únicamente los subprocesos que elijas. Finalmente, invertimos en la calidad de CPU Profiler y, en consecuencia, hemos visto una disminución significativa en las tasas de error que informaron los usuarios de los registros desde Android Studio 3.6. Hay aún más mejoras que puedes probar, así que obtén más información al respecto.

Las funciones del editor inteligente cuando se escriben reglas para reducir código

La función de editor inteligente cuando se escriben reglas para R8
La función de editor inteligente cuando se escriben reglas para R8
Se introdujo R8 en el complemento de Android Gradle 3.4.0 para combinar la expansión de sintaxis, la reducción, la ofuscación, la optimización y el proceso de dexing en un solo paso, lo que generó notables mejoras en el rendimiento de compilación. Al crear archivos de reglas para R8, Android Studio ahora ofrece funciones de edición inteligentes, como el resaltado de sintaxis, la finalización y la comprobación de errores. El editor también se integra con tu proyecto de Android a fin de proporcionar una finalización completa de símbolos para todas las clases, métodos y campos, e incluye una rápida navegación y refactorización.

Actualización de la plataforma IntelliJ IDEA 2019.3

Se actualizó el IDE principal de Android Studio con mejoras de lanzamientos de IntelliJ IDEA 2019.3 y 2019.3.3. Esas mejoras se centran en gran medida en las optimizaciones de calidad y rendimiento en todo el IDE.

Plantillas en vivo de Android para Kotlin

Las plantillas en vivo son una función conveniente de IntelliJ que te permite insertar en tu código construcciones comunes escribiendo palabras clave simples. Android Studio ahora incluye plantillas en vivo específicas de Android para tu código de Kotlin. Por ejemplo, escribe toast y presiona la tecla Tab a fin de insertar rápidamente código estándar para un mensaje de aviso. Para ver la lista completa de las plantillas disponibles en vivo, navega a Editor > Live Templates en el diálogo Settings (o Preferences).

Compatibilidad con Clangd para C++

Para los desarrolladores que escriben en C++, hemos cambiado a clangd como motor de análisis principal del lenguaje para la navegación, finalización, inspección y visualización de errores y advertencias de código. Ahora también combinamos clang-tidy con Android Studio. Para configurar el comportamiento de Clangd o Clang-Tidy, ve al diálogo Settings (o Preferences) del IDE, navega a Languages & Frameworks > C/C++ > Clangd o Clang-Tidy, y configura las opciones.

Compilación

El complemento de Android Gradle 4.0.0 incluye compatibilidad para Build Analyzer de Android Studio mediante el uso de API en lenguaje Java 8 (sin importar el nivel mínimo de API de tu app) y la creación de dependencias en funciones entre módulos de Dynamic Feature. Para ver una lista completa de actualizaciones, lee las notas de la versión del complemento de Android Gradle 4.0.0.

Build Analyzer

Resuelve los cuellos de botella en el rendimiento de tu compilación con Build Analyzer
Resuelve los cuellos de botella en el rendimiento de tu compilación con Build Analyzer
Los desarrolladores de Android confían en una variedad de complementos de Gradle y en la lógica de compilación personalizada para adaptar el sistema de compilación a sus apps. Sin embargo, las tareas desactualizadas o mal configuradas pueden causar tiempos de compilación más largos, que generan frustración y pérdida de productividad. Build Analyzer te ayuda a entender y resolver los cuellos de botella de tu compilación; para ello, destaca los complementos y las tareas que más influyen en tu tiempo de compilación en general y sugiere pasos para mitigar las regresiones. Más información

Expansión de sintaxis de bibliotecas del lenguaje Java 8 en D8 y R8

Las versiones anteriores del complemento de Android Gradle admitían una variedad de funciones del lenguaje Java 8 para todos los niveles de la API, como expresiones lambda y referencias de métodos, a través de un proceso llamado expansión de sintaxis. En Android Studio 4.0, se extendió el motor de expansión de sintaxis para admitir API de lenguaje Java independientemente de la versión de minSdkVersion de tu app. Esto significa que ahora puedes usar las API de lenguaje estándar, que antes solo estaban disponibles en los últimos lanzamientos de Android (como java.util.stream, java.util.function y java.time). Más información

Dependencias en funciones

Dependencias en funciones
Dependencias en funciones
Cuando usas el complemento de Android Gradle 4.0.0 y versiones posteriores, ahora puedes especificar si un módulo de funciones dinámicas depende de otro módulo de funciones. El hecho de poder definir esa relación garantiza que tu app cuente con los módulos necesarios para desbloquear funcionalidades adicionales, lo que genera menos solicitudes y una modularización más sencilla. Por ejemplo, una función :video puede depender de :camera. Si un usuario quiere desbloquear la posibilidad de grabar videos, tu app descarga automáticamente el módulo :camera requerido cuando solicita :video. Más información

Nuevas opciones para habilitar o inhabilitar funciones de compilación

El complemento de Android Gradle admite bibliotecas modernas, como la vinculación de datos y vistas, y funciones de compilación, como las clases autogeneradas de BuildConfig. Sin embargo, puede que no necesites esas bibliotecas y funciones para cada proyecto. En la versión 4.0.0 del complemento, ahora puedes inhabilitar las funciones de compilación discretas, como se muestra a continuación, que pueden ayudar a optimizar el rendimiento de la compilación para proyectos más grandes. Para ver el DSL y la lista completa de funciones que puedes controlar, consulta las notas de la versión.
android {
    // The default value for each feature is shown below.
    // You can change the value to override the default behavior.
    buildFeatures {
        // Determines whether to support View Binding.
        // Note that the viewBinding.enabled property is now deprecated.
        viewBinding = false
        // Determines whether to support Data Binding.
        // Note that the dataBinding.enabled property is now deprecated.
        dataBinding = false
        ...
    }
}
DSL de complemento de Android Gradle para habilitar o inhabilitar funciones de compilación

Compatibilidad esencial para archivos de secuencia de comandos de DSL en Kotlin

Android Studio 4.0 ahora admite secuencias de comando de archivos de compilación DSL en Kotlin (*.kts), lo que significa que esas secuencias ofrecen un conjunto completo de soluciones rápidas y que son compatibles con el diálogo Project Structure. Si bien estamos entusiasmados con el potencial de usar Kotlin para configurar una compilación, seguiremos perfeccionando la API de DSL del complemento de Android Gradle durante el próximo año, lo que puede generar cambios de última hora en la API para los usuarios de secuencia de comandos de Kotlin. A largo plazo, esas correcciones harán que el DSL sea más idiomático y fácil de usar para los usuarios de secuencias de comandos de Kotlin.

Metadatos de dependencias

Cuando se compila una app con el complemento de Android Gradle 4.0.0 o una versión posterior, el complemento incluye metadatos que describen las dependencias de la biblioteca que se compilan en la app. Cuando subes tu app, Play Console inspecciona esos metadatos para proporcionar alertas de problemas conocidos con los SDK y las dependencias que utiliza tu app y, en algunos casos, brindar información práctica para resolver esos problemas.
Los datos se comprimen y se encriptan con una clave de firma de Google Play, y se almacenan en el bloque de firma de tu app de lanzamiento. Si prefieres no compartir esa información, puedes optar por no hacerlo. En ese caso, incluye lo siguiente en el archivo de tu módulo build.gradle:
android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}
Inhabilita los metadatos de dependencia de tus APK, conjunto de apps o ambos elementos
Para resumir, Android Studio 4.0 incluye estas nuevas mejoras y funciones:
Diseño
  • Motion Editor: una interfaz simple para crear y editar animaciones MotionLayout, además de obtener vistas previas
  • Versión mejorada de Layout Inspector: una experiencia de depuración más intuitiva en tiempo real
  • Layout Validation: compara tu IU en varias dimensiones de pantallas
Desarrollo y perfil
  • Actualización de CPU Profiler: mejoras que hacen que la IU sea más intuitiva para navegar y que los datos sean más fáciles de entender
  • Actualización de las reglas de R8: funciones del editor inteligente para tus reglas de reducción de código, como resaltado de sintaxis, finalización y comprobación de errores
  • Actualización de la plataforma IntelliJ IDEA 2019.3 con mejoras de rendimiento y calidad
  • Actualizaciones de plantillas en vivo: plantillas en vivo específicas de Android para tu código de Kotlin
  • Compatibilidad con Clangd: Clangd y Clang-Tidy desactivados de forma predeterminada
Compilación
  • Build Analyzer: entiende y resuelve los cuellos de botella de tu compilación
  • Actualización de compatibilidad con el lenguaje Java 8: API que puedes usar independientemente del nivel de API mínimo de tu app
  • Dependencias en funciones: define dependencias entre los módulos de Dynamic Feature
  • DSL de buildFeatures: habilita o inhabilita funciones de compilación discretas, como Data Binding
  • DSL de Kotlin: compatibilidad esencial para archivos de secuencia de comandos de DSL de Kotlin
Para ver una lista de cambios, lee las notas de la versión oficiales.

Primeros pasos

Descargar

Descarga Android Studio 4.0 desde la página de descargas. Si estás usando una versión anterior de Android Studio, basta con que la actualices a la versión más reciente.
Como siempre, agradeceremos cualquier comentario en el que se incluyan aspectos que te agraden, errores o funciones que desees que agreguemos. Si encuentras un problema o error, no dudes en notificarlo. Sigue al equipo de desarrollo de Android Studio en Twitter y Medium.