Ocultar trazas en una app final de Android

  2 mins read

A la hora de desarrollar un aplicación hay multiples formas de
Es de esperar que cuando terminamos de desarrollar una aplicación y la subimos al play store no queremos mostrar ninguna traza de depuración, ya no solo porque el usuario final vea nuestras trazas sino por rendimiento ya que aunque no lo parezca, el logger consume memoria.

En este pequeño tutorial haré un recopilatorio de las técnicas más usadas para ocultar trazas en las aplicaciones finales. Varias de ellas vienen en este hilo de stackoverflow.

Técnica condicional

La más obvia de ellas es crear una propia clase “Logger” con un método “.d(String tag, String msg)” el cual en base a una constante declarada en la misma hace la traza o no. Algo así:

public class Logger {

	private static final LOG = true;

	public void d(String tag, String msg) {

		if (LOG) {
			Log.d(tag, msg);
		}

	}

}

El problema de esto es que nuestra aplicación final estará evaluando estas trazas y no trazará nada ya que esta variable LOG deberá ser puesta a false antes de subirla al play store. También está el problema de que suelen utilizarse StringBuilders implícitos cuando se trazan ciertas cosas por ejemplo:

Log.d(TAG, "Valor: " + x + ", valor2:" + y);

Esto tiene un consumo y no vale para nada ya que la cadena final no va a ser utilizada. Como veis esta técnica puede ser la menos recomendable.

Técnica con proguard

Solución por: Christopher
Esta técnica se basa en usar proguard para que justo antes de subirla al play store el mismo proguard quite nuestras trazas, para ello configuraremos proguard con esta configuración:

-dontskipnonpubliclibraryclasses
-dontobfuscate
-forceprocessing
-optimizationpasses 5

-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

Posible problema: Que al quitar proguard nuestras lineas de trazas los stacktrace que nos puedan reportar los usuarios finales puedan ser difíciles de entender ya que las lineas de código no coincidirán. Aún así es mucho mejor solución que la anterior ya que nos evitamos los problemas de memoria.

Técnica con regex

Solución por: Nicolas Raoul
Esta técnica es bastante parecida a la anterior solo que tenemos que ejecutar una herramienta externa para quitar las trazas antes de subirla.

Comentar trazas:

find . -name "*.java" | xargs grep -l 'Log.' | xargs sed -i 's/Log./;// Log./g'

Descomentar trazas:

find . -name "*.java" | xargs grep -l 'Log.' | xargs sed -i 's/;// Log./Log./g'

El problema de esta técnica puede ser el mismo que anterior a no ser que reemplacemos por “” en vez de reemplazar la linea entera.

Personalmente me quedo con la 3ª que aunque puede ser la menos cómoda para mi es la más efectiva, elegir la vuestra dependiendo de vuestras necesidades personales.

Written by:

Christian Panadero Martinez

  • ¿Conocéis alguna más? No dudéis en comentarla aquí mismo!