The Android Developer Challenge is back! Submit your idea before December 2.

Nuevas funciones de la versión preliminar de Android Studio

Se lanzó Android Studio 3.4 para el canal estable. Descarga esa versión aquí.

Android Studio 3.5 está en el canal Beta.

Android Studio 3.6 está en los canales para desarrolladores y Canary.

En esta página, se proporciona un resumen de las nuevas funciones y los cambios de estas versiones preliminares.

Para consultar las novedades sobre las versiones, que incluyen la lista de las correcciones destacadas de cada una, también puedes consultar las Actualizaciones de versiones.

Si encuentras un problema mientras usas una versión preliminar de Android Studio, avísanos. Tus informes de errores nos ayudan a mejorar Android Studio.

Android Studio 3.5

En esta sección, se proporciona un resumen de las nuevas funciones y los cambios de Android Studio 3.5.

Actualizaciones de Project Marble

Project Marble es una iniciativa de Android Studio para mejorar significativamente el estado del sistema y el pulido de funciones, y reducir errores. Android Studio 3.5 incluye muchas mejoras para lograr este objetivo, como las que se detallan a continuación:

  • Reducción de la latencia de la IU en la ventana del editor y funciones mejoradas del editor inteligente al usar la biblioteca de vinculación de datos
  • Velocidades de compilación mejoradas con procesamiento de anotación incremental
  • Mejoras de rendimiento al usar el NDK de Android
  • Mejora del rendimiento de la comprobación de lint al mitigar varias pérdidas de memoria
  • En Windows, se incorporaron nuevas acciones de notificación para mitigar las regresiones de velocidad de compilación del software antivirus
  • Uso de CPU significativamente reducido cuando se usa el emulador de Android
  • Rendimiento de la sincronización de Gradle mejorado gracias al ajuste de caché de compilación borrada
  • Experiencia de actualización mejorada para proporcionar más información y acciones que te ayudan a actualizar el IDE y el complemento de Android para Gradle
  • Rendimiento y UX mejorados con el editor de diseño

Para obtener información sobre las actualizaciones de Project Marble, lee la entrada del blog para desarrolladores de Android o las siguientes secciones.

Procesamiento de anotación incremental

Cuando se utiliza el complemento de Android para Gradle 3.5.0-beta01, o versiones posteriores, incluso más procesadores de anotaciones admiten la compilación incremental de Java, como la vinculación de datos. Esta optimización mejora el rendimiento de la compilación incremental. Para ver la lista completa, consulta la tabla de procesadores de anotación incremental.

Además, KAPT 1.3.30 y las versiones posteriores también son compatibles con los procesadores de anotación incremental, que puedes activar mediante la inclusión de kapt.incremental.apt=true en tu archivo gradle.properties.

Configuración de administración de la memoria

Si usas un sistema operativo de 64 bits que tiene al menos 5 GB de RAM, ahora puedes configurar la cantidad máxima de RAM que tu sistema operativo debería asignar a los procesos de Android Studio, como el IDE central, el daemon de Gradle y el daemon de Kotlin. Usa esta configuración a fin de proporcionar la cantidad óptima de memoria en cada proceso para mejorar el rendimiento de Android Studio.

Configuración de memoria, que te permite configurar la cantidad máxima de RAM para los procesos de Android Studio

Figura 1: Configuración de la memoria en Android Studio

Para acceder a esta nueva configuración, selecciona File > Settings (o Android Studio > Preferences en macOS) y busca la sección Memory Settings en Appearance & Behavior > System Settings.

Informe de uso de memoria

Los problemas de memoria en Android Studio a veces son difíciles de reproducir y de informar. Para resolver este problema, Android Studio ahora incluye un informe de uso de memoria que puedes enviar al equipo de Android Studio para identificar el origen de los problemas de memoria. En las versiones preliminares (Canary, Beta y versiones potenciales), Android Studio supervisa automáticamente el uso de la memoria y activa un análisis de montón de memoria si detecta que se alcanza con frecuencia el umbral de memoria baja.

Una vez que se activa el análisis de montón, Android Studio captura un volcado de montón localmente y lo analiza la próxima vez que ejecutas Android Studio. Durante el análisis, Android Studio quita todos los datos personales y crea un resumen del estado de la memoria. Este resumen incluye instancias de clases y objetos, además de rutas de referencia para asignaciones de memoria que son inusualmente grandes.

Una vez completado el análisis, Android Studio genera un informe para que lo revises y muestra una notificación, como se ve en la figura 2. Haz clic en Review Report para ver el contenido del informe de uso de memoria.

Notificación que indica que un informe de uso de memoria está listo para revisar

Figura 2: Notificación que indica que un informe de uso de memoria está listo para revisar

Antes de enviar el informe, puedes revisar toda la información que incluye, como se muestra en la figura 3. Cuando termines, haz clic en Send. El equipo de Android Studio revisará el informe para investigar y resolver los problemas que estés experimentando.

Informe de uso de memoria

Figura 3: Informe de uso de memoria

Para generar el informe de uso de memoria manualmente, selecciona Help > Analyze Memory Usage en la barra de menú. Cuando eliges esta opción, Android Studio vuelca el montón y te solicita que reinicies el IDE. Si lo haces, el análisis de volcado de montón se iniciará inmediatamente. De lo contrario, el análisis de volcado de montón se iniciará la próxima vez que ejecutes Android Studio. En cualquier caso, el IDE te notificará una vez que el informe de uso de memoria esté listo para que lo revises.

Publicación condicional para módulos de funciones dinámicas

La publicación condicional te permite establecer ciertos requisitos de configuración del dispositivo para que los módulos de funciones dinámicas se descarguen automáticamente durante la instalación de la app. Por ejemplo, puedes configurar un módulo de funciones dinámicas que incluya funcionalidad de realidad aumentada (RA) disponible en la instalación de la app solo para dispositivos compatibles con RA.

Este mecanismo de publicación actualmente admite controlar la descarga de un módulo en el momento de instalación de la app en función de las siguientes configuraciones del dispositivo:

Si un dispositivo no cumple con todos los requisitos que especificaste, el módulo no se descarga en el momento de la instalación de la app. Sin embargo, tu app puede solicitar más tarde descargar el módulo on demand mediante la Biblioteca de Play Core.

Antes de comenzar, asegúrate de estar usando Android Studio 3.5 Canary 11 o una versión posterior.

En las siguientes secciones, puedes ver cómo agregar compatibilidad con la publicación condicional a tus módulos de funciones dinámicas. Sin embargo, ten en cuenta que deberás unirte al programa Beta para publicar apps con módulos de funciones dinámicas en Google Play.

Cómo agregar un nuevo módulo con opciones de publicación condicional

La manera más fácil de crear un nuevo módulo de funciones dinámicas con publicación condicional es con el asistente New Module, de la siguiente manera:

  1. Para abrir el diálogo New Module, selecciona File > New > New Module en la barra de menú.
  2. En el diálogo New Module, selecciona Dynamic Feature Module y haz clic en Next.
  3. Configura tu módulo como lo harías normalmente y haz clic en Next.
  4. En la sección Module Download Options del diálogo, selecciona Only include module at app install for devices with specified features entre las siguientes opciones:
    • Do not include module at app install (on-demand): Crea un módulo que está disponible como descarga a pedido para todas las configuraciones de dispositivos que ejecutan la API nivel 21 o posterior, la más actualizada que admita tu app.
    • Include module at install-time: Crea un módulo que se incluye con tu app en el momento de la instalación.
    • Only include module at install-time for devices with specified features: Crea un módulo que se incluye con tu app en el momento de la instalación de la app solo en dispositivos con ciertas configuraciones que puedes especificar, como las funciones del dispositivo o el país.
  5. Si deseas limitar la descarga automática del módulo a ciertos países o un nivel mínimo de API, haz clic en Finish para completar la creación del módulo y, luego, lee la sección sobre cómo especificar las condiciones según el país o el nivel mínimo de API.

    De lo contrario, haz clic en + device feature y agrega una función necesaria para que un dispositivo descargue el módulo en el momento de la instalación.

  6. Junto a device-feature, selecciona una de las siguientes opciones del menú desplegable y especifica su valor:

    • Name: Te permite especificar una función de hardware o software que el dispositivo necesita para descargar el módulo en el momento de la instalación. Las funciones que admite la publicación condicional son las mismas que PackageManager enumeradas como constantes FEATURE_*.

      Si seleccionas esta opción, comienza a escribir cualquier parte del valor constante de la función, como "bluetooth", en el campo junto al menú desplegable, y selecciona una de las sugerencias que aparecen.

    • OpenGL ES Version: Te permite especificar la versión de OpenGL ES que el dispositivo necesita para descargar el módulo en el momento de la instalación. Si seleccionas esta opción, comienza a escribir la versión, como "0x00030001", en el campo junto al menú desplegable, y selecciona una de las sugerencias que aparecen.

  7. Si deseas agregar varias condiciones según las funciones del dispositivo disponibles, haz clic en + device feature para cada condición de función del dispositivo que desees especificar.

  8. Cuando hayas terminado de configurar las opciones de descarga del módulo, haz clic en Finish.

Después de que Android Studio termine de crear tu módulo de funciones dinámicas, puedes inspeccionar su manifiesto para ver la condición especificada en el nodo <dist:delivery>. A continuación, se muestra un ejemplo:

<manifest ...>
      <dist:module ...>
        <dist:delivery>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        ...
      </dist:module>
    </manifest>
    

Cómo agregar opciones de publicación condicional a un módulo de funciones dinámicas existente

Puedes agregar fácilmente opciones de publicación condicional a un módulo de funciones dinámicas existente mediante el manifiesto del módulo. Sin embargo, primero debes leer sobre la compatibilidad de las opciones de publicación condicional con otras opciones de publicación que ya hayas habilitado.

Para comenzar, primero debes migrar tu manifiesto al nuevo elemento <dist:delivery>. El siguiente fragmento de código muestra un ejemplo de la sintaxis anterior:

<dist:module
      dist:title="@string/title_dynamic_feature" dist:onDemand="true">
      <dist:fusing dist:include="true"/>
    </dist:module>
    

Las opciones de publicación anteriores ahora se especifican de la siguiente manera:

<dist:module
      dist:title="@string/title_dynamic_feature">
      <dist:delivery>
          <dist:on-demand/>
      </dist:delivery>
      <dist:fusing dist:include="true"/>
    </dist:module>
    

Luego, puedes incluir opciones de publicación condicional basadas en las funciones del dispositivo de la siguiente manera:

<dist:module
        dist:title="@string/title_dynamic_feature">
        <dist:delivery>
          <dist:on-demand/>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        <dist:fusing dist:include="true"/>
    </dist:module>
    

En las siguientes secciones, se analizan otras opciones para la publicación condicional, por ejemplo, por país o nivel mínimo de API.

Compatibilidad con otras opciones de descarga de módulos

Como los módulos de funciones dinámicas ofrecen varias opciones a fin de configurar la manera en que se suministra cada función en el dispositivo de un usuario, es importante comprender cómo las opciones de publicación condicional se ven afectadas por otros ajustes. En la siguiente tabla, se resume la compatibilidad de la publicación condicional con otras opciones de descarga de módulos.

Opción de descarga de módulos Compatibilidad con publicación condicional
Fusión (<dist:fusing dist:include="true"/>) Si un módulo configura esta opción en "true", Google Play no respeta las opciones de publicación condicional que especificas al implementar tu app en dispositivos que ejecutan el nivel de API 19 o uno inferior. Es decir, los módulos de funciones dinámicas que permiten la fusión siempre se incluyen en el momento de la instalación para dispositivos que ejecutan el nivel 19 de la API o uno inferior.
Compatibilidad con apps instantáneas (<dist:module dist:instant="true"/>) Las opciones de publicación condicional no son compatibles con los módulos de funciones dinámicas compatibles con apps instantáneas.
On demand (<dist:on-demand/>) De forma predeterminada, si especificas opciones de publicación condicional, el módulo también está disponible on demand.

Cómo especificar condiciones según el país

La publicación condicional también te permite especificar qué países deseas excluir de la descarga de tu módulo (o incluir en ella) en el momento de la instalación de la app. Especificar esta condición podría ser útil si, por ejemplo, tu módulo implementa una forma de pago que no está disponible en ciertas regiones.

En este contexto, el país del dispositivo generalmente está determinado por la dirección de facturación del usuario registrada en su cuenta de Google Play.

Si quieres especificar países para tu módulo, incluye lo siguiente en el manifiesto del módulo de funciones dinámicas:

<dist:conditions>
       <!-- Specify "true" to specify countries to exclude from downloading
       this module at app install-time, or "false" to specify countries that should
       download the module. By default, this is set to “false”. -->
      <dist:user-countries dist:exclude="true">
        <!-- Specifies the two-letter  CLDR country code for regions that should
        not download the module at app install-time. -->
        <dist:country dist:code="CN"/>
        <dist:country dist:code="HK"/>
      </dist:user-countries>
    </dist:conditions>
    

Cómo especificar condiciones para el nivel de API mínimo

Especificar una condición basada en el nivel de API de un dispositivo puede ser útil si tienes módulos de funciones dinámicas que dependen de API que están disponibles solo en ciertas versiones de la plataforma Android.

Para establecer una condición basada en un nivel de API mínimo del dispositivo, incluye lo siguiente en el manifiesto de tu módulo de funciones dinámicas (ten en cuenta que el nivel de API que especifiques como condición debe ser mayor o igual que la minSdkVersion del módulo):

<dist:conditions>
        <!-- Specifies the minimum API level that the device must satisfy
              in order to download your module at app app install-time. -->
       <dist:min-sdk dist:value="24"/>
    </dist:conditions>
    

Apply Changes

Apply Changes te permite insertar cambios de código y recursos en tu app en ejecución sin reiniciarla y, en algunos casos, sin reiniciar la actividad actual. Apply Changes implementa un enfoque completamente nuevo para preservar el estado de tu app. A diferencia de Instant Run, que reescribe el código de bytes de tu APK, Apply Changes redefine las clases en el momento mediante el aprovechamiento de la instrumentación de tiempo de ejecución compatible con Android 8.0 (nivel 26 de la API) o versiones posteriores.

Para usar Apply Changes, haz lo siguiente:

  • Si deseas aplicar solo los cambios de tu código sin reiniciar la actividad actual, haz clic en Apply Code Changes Ícono de Apply Code Changes o presiona Ctrl+Alt+F10 (o Command+Shift+Ctrl+R en macOS).

    En general, deberías usar Apply Code Changes si modificaste el código en el cuerpo de un método, pero no modificaste ningún recurso. Cuando también hayas modificado recursos, usa Apply Changes and Restart Activity.

  • Si deseas aplicar los recursos y cambios de código sin reiniciar tu app, haz clic en Apply Changes and Restart Activity Ícono de Apply Changes o presiona Ctrl+F10 (o Command+Ctrl+R en macOS).

    Esta opción te permite aplicar cambios en los recursos y el código al reiniciar la actividad actual sin reiniciar tu app.

Cómo habilitar la ejecución de resguardo para Apply Changes

Cuando los cambios que realizaste no se pueden aplicar sin reiniciar la app, Android Studio te solicita que ejecutes Ícono Run tu app nuevamente. Sin embargo, si no quieres recibir la solicitud cada vez que esto ocurre, puedes configurar Android Studio para que ejecute automáticamente tu app cuando no se puedan aplicar tus cambios.

Para habilitar este comportamiento, sigue estos pasos:

  1. Abre el diálogo Settings o Preferences:

    • En Windows o Linux, selecciona File > Settings en la barra de menú.
    • En macOS, selecciona Android Studio > Preferences en la barra de menú.
  2. Ve a Build, Execution, Deployment > Deployment.

  3. Marca las casillas para habilitar la ejecución de resguardo automática en cualquiera de las acciones de Apply Changes.

  4. Haz clic en OK.

Limitaciones

Apply Changes tiene las siguientes limitaciones:

  • Apply Changes solo es compatible con dispositivos que ejecutan Android 8.0 (nivel 26 de la API) o una versión posterior.
  • Al igual que con Instant Run, ciertos cambios de código, ente los que se incluyen los que aparecen a continuación, no se pueden aplicar hasta que se reinicie la app:
    • Agregar o borrar una clase, un método o un campo
    • Cambiar el manifiesto
    • Cambiar las firmas de métodos
    • Cambiar modificadores de métodos o clases
    • Renombrar clases
    • Cambiar la herencia de clase
    • Agregar o quitar un recurso
    • Cambiar las bibliotecas nativas (archivos .so)
    • Cambiar los valores de enumeraciones

Problemas conocidos

Apply Changes tiene los siguientes problemas conocidos:

  • La velocidad de Apply Changes a veces puede ser más lenta que la de Instant Run. La prioridad inicial era la estabilidad, por lo que continuaremos mejorando el rendimiento durante los próximos meses.
  • Es posible que veas un comportamiento inesperado si usas cargadores de clase personalizados que no sean del contexto del sistema o del subproceso de la aplicación.

IntelliJ IDEA 2019.1

En la versión 2019.1, el IDE principal de Android Studio se actualizó con mejoras de IntelliJ IDEA, como la personalización del tema.

Esta versión también incluye mejoras de las siguientes actualizaciones para corrección de errores:

Android Studio 3.6

En esta sección, se proporciona un resumen de las nuevas funciones y los cambios de Android Studio 3.6.

Apply Changes

Ahora puedes agregar una clase y, luego, implementar ese cambio de código a tu app en ejecución. Para ello, haz clic en Apply Code Changes Ícono de Apply Code Changes o Apply Changes and Restart Activity Ícono de Apply Changes.

Para obtener más información sobre la diferencia entre estas dos acciones, consulta Apply Changes.

Actualizaciones de NDK

Las siguientes actualizaciones admiten el desarrollo nativo (C/C++) en Android Studio.

Compatibilidad con Kotlin

Las siguientes funciones de NDK en Android Studio, anteriormente compatibles con Java, ahora también son compatibles con Kotlin:

  • Navega desde una declaración JNI hasta la función de implementación correspondiente en C/C++. Puedes ver esta asignación si te desplazas sobre el marcador del elemento C o C++ cerca del número de línea del archivo de código fuente administrado.
  • Crea automáticamente una función de implementación de stub para una declaración JNI. Primero define la declaración JNI y, luego, escribe "jni" o el nombre del método en el archivo C/C++ que quieres activar.

  • Las funciones de implementación nativas no utilizadas se destacan como advertencia en el código fuente. Las declaraciones JNI con implementaciones faltantes también se destacan como error.

  • Cuando renombras (refactorizas) una función de implementación nativa, se actualizan todas las declaraciones JNI correspondientes. Renombra una declaración JNI para actualizar la función de implementación nativa.

  • Se incluye comprobación de firma para implementaciones JNI vinculadas implícitamente.

Otras mejoras de JNI

  • Aspectos visuales

    • En las funciones de implementación de JNI, se muestran sugerencias de tipo para los parámetros y los valores resultantes.
    • Se pueden plegar los nombres de funciones alterados por JNI.

  • Compatibilidad con RegisterNatives

    • Autocompletado para el nombre de la declaración del método, los tipos de parámetros y el tipo de resultado

    • Posibilidad de renombrar la refactorización del nombre de declaración del método

    • Comprobación de firma para funciones JNI vinculadas

  • Más asistencia de la función JNI

    • Autocompletado, inspección, navegación y cambio de nombre de la refactorización para literales de strings en lo siguiente:
      • FindClass
      • GetMethodID y GetStaticMethodID
      • GetFieldID y GetStaticFieldID
    • Diferentes inspecciones para lo siguiente:
      • Call[Static]<type>Method
      • CallNonvirtual<type>Method
      • Get[Static]<type>Field
      • NewObject