lunes, 15 de septiembre de 2014

Depuración

Android Studio nos permitirá depurar nuestras aplicaciones sobre dispositivos virtuales o físicos. Con Android Studio podremos:
  • Seleccionar el dispositivo sobre el que queremos depurar nuestra aplicación.
  • Visualizar el registro del sistema.
  • Añadir puntos de ruptura en nuestro código.
  • Examinar variables y evaluar expresiones en tiempo de ejecución.
  • Ejecutar las herramientas para depuración desde el SDK de Android.
  • Realizar capturas de pantalla y vídeo de nuestras aplicaciones.

Cada vez que depuramos nuestra aplicación, Android Studio creará una versión específica de ésta para su depuración, conectará con el dispositivo (virtual o físico), instalará la aplicación en él y posteriormente la ejecutará. El IDE mostrará los mensajes registrados por el sistema mientras la aplicación se está ejecutando y nos proporcionará de las herramientas necesarias para filtrar mensajes, trabajar con puntos de ruptura y controlar el flujo de ejecución.

Ejecutando nuestra aplicación en modo depuración.

Imagen 1. Cuadro de diálogo para seleccionar el dispositivo en el que
se va a ejecutar nuestra aplicación.

Para depurar nuestra aplicación seguiremos los pasos siguientes:
  • Abrimos el proyecto con Android Studio.
  • Pulsamos el botón Debug de la barra de herramientas.
  • Desde el cuadro de diálogo de dispositivos (Choose Device, ver imagen 1), elegiremos un dispositivo físico o virtual de la lista de dispositivos disponibles.
  • Pulsamos el botón OK y la aplicación pasará a ser ejecutada en el dispositivo seleccionado.

Si en el listado de dispositivos disponibles no se encuentra el que nos interesa, pulsaremos el botón para crear uno desde el gestor para dispositivos virtuales de Android (AVD - Android Virtual Device manager).

Utilizaremos el panel Debug  para depurar nuestra aplicación. Desde la pestaña Debugger tendremos acceso a las hebras y a sus variables. Desde la pestaña Console podremos consultar el estado del dispositivo. Desde la pestaña Logcat podremos consultar el registro del sistema. Este panel además incluye otras herramientas de depuración de las que hablaremos más adelante.

Imagen 2. El panel de depuración Debug donde se muestra la hebra actual y las propiedades de una variable concreta.

Usando el registro del sistema.

El registro del sistema muestra mensajes mientras depuramos nuestra aplicación. Estos mensajes incluyen información relacionada con las aplicaciones que se están ejecutando en ese instante en el dispositivo. Si queremos usar el registro del sistema para depurar la aplicación, debemos asegurarnos de que los mensajes muestran la traza completa de las excepciones mientras estamos en la fase de desarrollo.

Registrando mensajes desde nuestro código.

Para registrar nuestros propios mensajes desde el código, usaremos la clase Log. Estos mensajes los podremos ir consultando desde el registro mientras depuramos nuestra aplicación. Los mensajes podemos usarlos para detectar fallos en el flujo de ejecución de nuestra aplicación.

En el siguiente ejemplo se muestra la manera en la que podemos registrar la disponibilidad del estado de una actividad:
import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restaurando el estado ...");
            /* Procesamos la restauración del estado. */
        } else {
            Log.d(TAG, "onCreate() Inicializando el estado ...");
            /* Procesamos la creación de un nuevo estado. */
        }
    }
}
Durante el desarrollo de nuestra aplicación, también podemos capturar las excepciones y registrar su traza completa:
void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}
Nota. Los mensajes de depuración no deberían aparecer cuando la aplicación es usada en producción. Para ello, podemos utilizar un indicador DEBUG y utilizarlo para registrar los mensajes de depuración solo si ese indicador está disponible.

Viendo el registro del sistema.

Tanto el DDMS de Android (Dalvik Debug Monitor Server) como el panel Debug muestran el registro del sistema; sin embargo, el DDMS de Android nos permitirá ver los mensajes asociados a un proceso en particular. Para ver el registro del sistema desde el DDMS de Android:
  • Ejecutamos la aplicación en modo depuración.
  • Seleccionamos el panel Android  .
  • Si el registro del sistema está vacío, pulsa el botón Restart .
Imagen 4. Registro del sistema desde la herramienta Android DDMS.

El registro del sistema muestra los mensajes relacionados con servicios y aplicaciones Android. Podremos filtrar los mensajes de varias formas:
  • Para mostrar los mensajes asociados a un proceso, seleccionaremos el proceso desde la vista Devices y pulsaremos el botón . Si la vista de dispositivos Devices no se encuentra disponible, pulsaremos el botón para volver a mostrarla. Este botón solo será visible si la vista Devices está oculta.
  • Para filtrar los mensajes atendiendo a su criticidad, utilizaremos la lista desplegable Log level.
  • Para mostrar solo los mensajes que contienen una cadena determinada, utilizaremos el campo de búsqueda.

Trabajando con puntos de ruptura.

Los puntos de ruptura nos permitirán detener la ejecución de nuestra aplicación en una línea concreta de nuestro código y poder examinar el valor que tienen las variables, evaluar expresiones o continuar la ejecución de la aplicación línea a línea. Utilizaremos los puntos de ruptura para detectar errores en tiempo de ejecución que no apreciamos a simple vista. Para añadir un punto de ruptura:
  1. Abrimos el archivo fuente en el que quieres insertar el punto de ruptura.
  2. Localizamos la línea en la que queremos añadir el punto de ruptura.
  3. Pulsamos sobre la parte izquierda de la línea, sobre la zona no imprimible. Un punto rojo indicará que se ha añadido el punto de ruptura a esa línea (ver imagen 5).
  4. Ejecutamos la aplicación en modo depuración.
Tan pronto como la aplicación alcance el punto de ruptura, ésta se detendrá. En ese momento podremos hacer uso de las herramientas de depuración disponibles para detectar la causa del error.

Imagen 5. El punto rojo significa que en esa línea hay un punto de ruptura.

Consultando y configurando los puntos de ruptura.

Podemos consultar y configurar los puntos de ruptura pulsando el botón View Breakpoints en la parte izquierda del panel Debug.

Imagen 6. Desde la ventana de puntos de ruptura podremos consultar y configurar los puntos de ruptura disponibles en la aplicación.
Podemos activar y desactivar los puntos de ruptura fácilmente desde el listado de la izquierda de la ventana, sin la necesidad de tener que desplazarnos hasta las líneas de código donde fueron declarados. Si un punto de ruptura se encuentra desactivado, Android Studio no se detendrá en su línea. Seleccionando un punto de ruptura desde el listado, podremos además configurar opciones adicionales como programar un punto de ruptura para que éste se active o desactive cuando se alcance otro punto de ruptura determinado. También podremos definir puntos de ruptura especiales asociados al lanzamiento de excepciones concretas (Exception Breakpoints en la imagen 6).

Depurando nuestra aplicación con puntos de ruptura.

Cuando hayamos especificado los puntos de ruptura en nuestro código, pulsaremos el botón Return para iniciar la aplicación de nuevo. Cuando se alcanza un punto de ruptura, Android Studio pausa la aplicación, resaltando la línea de código asociada. El panel de depuración Debug nos permitirá examinar las variables y controlar la ejecución paso a paso:
  • Para examinar las propiedades de un objeto, despliega la vista Variables. Si la vista Variable no es visible, pulsa el botón Restore Variable View .
  • Para evaluar una expresión en el punto actual de ejecución, pulsaremos el botón Evaluate Expression .
  • Para avanzar hasta la siguiente línea de código sin tener en cuenta el código de los métodos, pulsaremos el botón Step Over .
  • Para avanzar hasta la siguiente línea de código teniendo en cuenta el código de los métodos, pulsaremos el botón Step Into .
  • Para avanzar hasta la siguiente línea posterior a la invocación del método actual, pulsaremos el botón Step out.
  • Para continuar con la ejecución normal de la aplicación, pulsaremos el botón Resume Program .
Imagen 7. Vista de las variables desde el panel Debug.

Controlando el almacenamiento de objetos.

Android Studio nos permite hacer un seguimiento de los objetos almacenados en el heap de Java y examinar las clases y las hebras a las que pertenecen. Esto nos permitirá ver los objetos almacenados durante un período de tiempo determinado. Esta información es muy útil para controlar el uso de memoria y de cómo puede afectar al rendimiento de nuestra aplicación.

Para hacer un seguimiento de cómo se asigna la memoria a los objetos:
  1. Ejecutamos la aplicación en modo depuración.
  2. Seleccionamos el panel Android .
  3. Seleccionamos la pestaña Devices | logcat.
  4. Seleccionamos un dispositivo desde la lista desplegable.
  5. Seleccionamos la aplicación (nombre de paquete) desde el listado de aplicaciones en ejecución.
  6. Pulsamos el botón Allocation Tracking .
  7. Interaccionamos con la aplicación desde el dispositivo.
  8. Pulsamos el botón Stop Allocation Tracking cuando hayamos finalizado el seguimiento.

Los objetos para los que el sistema asigna memoria muestran la siguiente información:
  • Número de orden.
  • Clase a la que pertenece el objeto almacenado.
  • Espacio de memoria asignado al objeto.
  • Identificador de la hebra de ejecución.
  • El método, la clase y el número de línea en la que se realizó la asignación de memoria.
  • Traza completa de las líneas en las que se producen las asignaciones.
Imagen 8. Seguimiento de la asignación de memoria en Android Studio.

Interpretando los resultados de la depuración.

Aún cuando nuestra aplicación no genere errores en tiempo de ejecución, esto no significa que esté libre de problemas. Deberíamos tener en cuenta las siguientes cuestiones:
  • ¿Usa nuestra aplicación de manera eficiente la memoria?
  • ¿Genera nuestra aplicación tráfico de red innecesario?
  • ¿En qué métodos deberíamos centrar nuestra atención para mejorar el rendimiento de nuestra aplicación?
  • ¿Reacciona de manera correcta nuestra aplicación cuando se recibe una llamada de teléfono o un mensaje?

Contamos con una herramienta autónoma que cuenta con una serie de utilidades para depurar y analizar nuestras aplicaciones. Se trata del monitor de dispositivos de Android (Android Device Monitor). La herramienta DDMS de Android también está integrada. Podemos usar esta herramienta para analizar el uso de memoria, examinar el tráfico de red y simular llamadas  y mensajes de teléfono.
Para abrir el monitor de dispositivos pulsa el botón de la barra de herramientas.

Capturas de pantalla y video.

Durante la ejecución de nuestra aplicación, Android Studio nos permitirá realizar capturas de pantalla y video. Estas capturas nos serán útiles a la hora de promocionar nuestra aplicación y a la hora de elaborar informes de error para nuestro equipo de desarrollo.

Para capturar una pantalla:
  1. Ejecutamos la aplicación en modo depuración.
  2. Seleccionamos el panel Android .
  3. Pulsamos el botón Screen Capture  para realizar la captura.
  4. Si queremos añadir un marco a la captura, activaremos la opción Frame screenshot.
  5. Pulsamos el botón Save para guardar la captura.

Para capturar un vídeo:
  1. Ejecutamos la aplicación en modo depuración.
  2. Seleccionamos el panel Android .
  3. Pulsamos el botón Screen Record para iniciar la grabación.
  4. Pulsamos el botón Start Recording.
  5. Interaccionamos con la aplicación.
  6. Pulsamos el botón Stop recording cuando hayamos acabado.
  7. Especificamos un nombre para el archivo resultante y pulsamos el botón OK.

No hay comentarios:

Publicar un comentario