Depurando aplicativos Cordova com o Chrome

Desde a versão 4.4 o Android permite fazer uma coisa realmente útil: depurar seu aplicativo WebView (leia-se Cordova e afins) usando o próprio Chrome.

O YeAPF desde a versão 0.8.59 inclui o adb-debug que permite acompanhar a saida do console em tempo real. Isso ajuda muito mas tem vezes que o que realmente precisamos é um passo-a-passo para entendermos como que -de fato- o código se comporta. É ai que a depuração remota entra.

Ela não funciona de fábrica, e nem poderia, já que libera todo seu aplicativo na tela de qualquer Chrome.

Para ativar este recurso, é preciso modificar o MainActivity.java. Então o primeiro passo é acha-lo

$ cd meuAplicativoCordova
meuAplicativoCordova$ find . -type f -name "MainActivity.java"
./platforms/android/app/src/main/java/br/com/inovacaosistemas/meuAplicativoCordova/MainActivity.java

Uma vez achado, precisamos modificar este arquivo.

Na seção (não sessão, isso é outra coisa) dos imports acrescente os seguintes:

import android.os.Build;
import android.util.Log;
import android.content.pm.ApplicationInfo;
import android.webkit.WebView;

Depois modifique o código do onCreate() assim:

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            if(0 != (getApplicationInfo().flags = ApplicationInfo.FLAG_DEBUGGABLE)){
                Log.i("MeuAplicativoCordova", "Habilitando depuração Web");
                WebView.setWebContentsDebuggingEnabled(true);
            }
        }

Compile, instale e rode no seu dispositivo

meuAplicativoCordova$ cordova run android

Agora abra seu chrome e navegue no inspetor de dispositivos

chrome://inspect/#devices

Escolha seu aplicativo (pode que vc tenha vários, ou quem sabe com sorte alguém tenha esquecido ligado…rs) e depure como se fosse local.

Qual a vantagem disso tudo? Bom, por mais que webView do KitKat em diante seja Chrome, ele se comporta diferente em um dispositivo e em outro. Fora que há recursos que -mesmo emulados- se comportarão de forma muito diferente no dispositivo real (Câmera, GPS, Sensor de movimento, conectividade, etc)

Já verei de fazer um script que habilite/desabilite isso sem necessidade de tanta volta.

Por enquanto, é o que há