Cómo depurar código Java en una aplicación cordova en Android de tu dispositivo usando adb en Windows

Una clara desventaja de trabajr con cordova usando el CLI (y no Android Studio directamente) es que tu aplicación (el lado nativo) no puede ser depurado correctamente y no se puede obtener información acerca de un error o advertencias (al menos durante la ejecución en un dispositivo), por ejemplo, analiza la siguiente clase de Java que extiende a un plugin:

package com.ourcodeworld.plugins;

import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Intent;
import android.content.Context;
import android.widget.Toast;

public class randomClass extends CordovaPlugin {
    
    @Override
    public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
        if (action.equals("ejecutarFuncionAsombrosa")) {
            /** 
             * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             * El siguiente código lanzará una excepción y tu aplicación colapsará
             **/
            Intent intent = new Intent("com.nononsenseapps.filepicker.FilePickerActivity");
            intent.putExtra("informacion_id", "contenido");
            cordova.startActivityForResult((CordovaPlugin) this, intent, 0);
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        showToast("Enviar aquí resultado cordova");
        if(resultCode == cordova.getActivity().RESULT_OK){
            // Algo de codigo para manipular respuesta
            return;
        }else if(resultCode == cordova.getActivity().RESULT_CANCELED){
            // ...
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     * Mostrar android toast
     */
    public void showToast(String toLog){
        Context context = cordova.getActivity();
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, toLog, duration);
        toast.show();
    }
}

Teóricamente, el código anterior compilará sin error alguno pues el código está correctamente escrito y no mostrará ningun error durante la compilación usando cordova run android en la consola (sin embargo, el error está en la función execute y te explicaremos porque luego). Ahora, la clase anterior está expuesta en javascript usando myApp.ejecutarFuncionAsombrosa() así que una vez compilada la aplicación, si ejecutas esa función en Javascript, booom:

App stopped android cordova

Tu aplicación simplemente dejará de funcionar sin ningun mensaje util acerca de lo que paso. Así que basicamente, si estás trabajando en un plugin y no tienes ni idea de que carajos está fallando, probablemente quieras pegarte un tiro en este momento. Sin embargo, no todo está perdido, al menos, no aún. Si tienes un dispositivo Android y un cable USB, puedes aprender a depurar errores.

Nota: este método tambien funciona con dispositivos Android Virtuales (emuladores) siempre y cuando esten abiertos.

Depurando ando

Con el fin de depurar tu aplicación desde tu dispositivo, necesitamos usar adb logcat. Logcat es una herramienta de linea de comando que crea un archivo log a partir de los mensajes del sistema, incluyendo rastros de pila (stack trace) cuando el dispositivo lanza un error y mensajes enviados desde tu aplicación usando la clase Log (aprende más sobre esta clase en la documentación oficial de Android).

Esta herramienta (un archivo ejecutable en Windows) está disponible en el SDK de Android (usualmente /sdk/build-tools/adb.exe), así que si puedes compilar tu aplicación, tienes instalado Android studio, podrás depurar tu aplicación en el dispositivo, para ello sigue los siguientes pasos:

1. Conecta tu dispositivo o inicia el emulador

Como primera medida despues de conectarlo (o iniciar el emulador), dale un poco de tiempo para que así el computador lo reconozca.

2. Ejecuta adb

Como una buena practica (practica que hace todo más facil), vamos a redirigir todo el contenido obtenido por logcat hacia un archivo log, que en este caso será log.txt localizado en la carpeta que quieras del sistema (si no existe será creado).

Abre la linea de comandos (cmd.exe), ejecuta el siguiente comando y deja la ventana abierta pues está estará activa trabajando en el fondo (deten la ejecución del comando o simplemente cierra la ventana para evitar el ingreso de información inutil).

adb logcat > C:\Users\<TU-NOMBRE-DE-USUARIO>\Desktop\log.txt

El comando debería crear un archivo log.txt en el escritorio y este será constantemente actualizado con el contenido obtenido por ADB mientras usas tu aplicación. Generalmente en Windows adb no está disponible como variable de entorno, así que a menos que ya la hayas declarado como una variable de entorno y quieres hacer esto rápidamente, puedes proveer el path absoluto del ejecutable en la consola.

En este caso adb.exe está localizado en la siguiente carpeta en Window:

Android ADB windows

Así que usariamos el siguiente comando en vez del primero:

C:\Users\sdkca\AppData\Local\Android\sdk\platform-tools\adb.exe logcat > C:\Users\sdkca\Desktop\log.txt

Ahora ADB debería estar siendo ejecutado en la linea de comandos y no va a parar a menos que se lo ordenes.

3. Compila e instala tu aplicación

Compila tu aplicación de cordova usando cordova run android --device o el comando que sea que uses. Cabe destacar que desde el momento que la aplicación es instalada y ejecutada, logcat iniciara a generar contenido y lo guardará en log.txt. El orden de los pasos que dimos en este tutorial no es obligatorio y puedes depurar una vez la app ya esté instalada, el orden que dimos es solamente para que a programadores cuyo error es lanzado al iniciar la aplicación sepan como hacerlo. 

4. Prueba y verifica que está fallando

Asumiendo que tu aplicación inicia correctamente, pero cuando una función de javascript, que ejecuta código nativo falla, es hora de verificar errores ! En este ejemplo, la aplicación falla cuando ejecutamos myApp.ejecutarFuncionAsombrosa(). Eso deberia detener la aplicación en Android, ahora necesitamos verificar que contenido obtuvo logcat.

Si tu aplicación ya colapso, deten ADB en tu linea de comando usando CTRL+BREAK o simplemente deten la ventana CMD (esto con el fin de detener la generación de más contenido en el log que no necesitamos) y abre el archivo log.txt.

Finalmente viene el incomodo momento de buscar el error en log (Para acelerar el proceso fijate en la hora en la que ejecutaste la función en javascript):

Output logcat android

Como puedes ver, el archivo log.txt nos dio información valiosa que de ninguna otra manera hubieramos obtenido sin usar ADB, el mensaje de error es:

Ahora sabemos que el error era que estabamos llamando una actividad inexistente, así que para resolverlo solo necesitamos crear una. Recuerda que puedes filtrar el contenido generado por adb usando parametro como -f para mostrar solamente errores (lee más acerca de la API de logcat en la documentación oficial aqui).

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable