Desactiva las llamadas a Log antes de publicar tu app de Android

Todos utilizamos la clase  android.util.Log para volcar a la consola mensajes de error o que nos informen de lo que está haciendo nuestro programa. Pero de acuerdo con Google en su documento «Preparing for release«, es muy importante desactivar el logging antes de publicar una aplicación en versión release:

Turn off logging and debugging

Make sure you deactivate logging and disable the debugging option before you build your application for release. You can deactivate logging by removing calls to Log methods in your source files.

Pero seamos realistas: ¿es práctico eliminar todas las llamadas a los métodos de la clase Log de nuestro código fuente cuando vamos a crear nuestro apk de release? Afortunadamente no hay que llegar a tanto.

Existe una manera mucho más sencilla para activar o desactivar el logging según estemos generan un apg de debug o un apk en versión release. Lo primero, es crear una clase propia que utilizaremos en lugar de la clase android.util.Log.

Esta clase tendrá métodos estáticos que referencian a los métodos de la clase Log:

 

Por consiguiente cuando queramos enviar algo a la consola de Log, en vez de

Simplemente invocaremos a los metodos estáticos de nuestra clase de Log:

En función de la variable DEBUG, que tendremos definida en algún lugar de ámbito global, se invocarán los métodos de la clase android.util.Log, o no. Obviamente tenemos que acordarnos de tener la variable DEBUG a true cuando estemos depurando nuestro código fuente, y cambiarla a false cuando generemos el apk en versión release.

Pero, ¿tenemos acordarnos de cambiarla la bandera booleana según estemos compilando para debug o para relese? ¿No habrá una manera de automatizar también esto? Claro que la hay.

Sobreescribir cadenas en nuestros resources usando Gradle.

Android Studio utiliza el motor Gradle para compilar el código fuente y generar el fichero apk. Gradle permite establecer las asi llamadas «variantes de compilación» (build variants). Como su nombre indica, nos proporciona una manera sencilla de crear diferentes versiones de la misma aplicación a partir de un mismo proyecto.

Normalmente tendremos dos build variants: la de debug, y la de release como podrás comprobar si examinas el fichero build.gradle de tu proyecto de Android Studio:

que se corresponden con las dos versiones de compilación que puedes en la ventana «Build Variants» de Android Studio:

android_Studio_build_variants

 

Si te fijas en el script de gradle, verás que lo que hace es establecer las características que tendrá el apk generado. Por ejemplo, la versión debug no utiliza proguard para ofuscar el código fuente, y es depurable, pero la versión release no lo es.

Lo que vamos a hacer es añadir una cadena de texto a nuestros resources, tal y como si la hubieramos declarado en un fichero /values/strings.xml, pero utilizando nuestro script de gradle, tal que asi:

 

De esta manera, en nuestro codigo fuente podremos consultar el contenido de la cadena «COMPILE_MODE» de manera análoga a cualquier otra cadena que hayamos definido en el fichero strings.xml. Por ejemplo:

 

Ya no tendremos que preocuparnos mas por activar y desactivar los mensajes log de nuestra app. Cuando compilemos con la variante de compilado de debug, la bandera booleana DEBUG será true, y los mensajes se enviarán a la consola. Cuando compilemos con la variante «release», la bandera boolean DEBUG será false y los mensajes no se enviaran a la consola de salida. El rendimiento de nuestra app será mayor, y ademas cumplimos con las normas de diseño de Google.