2010-04-27 10 views
30

Estoy programando aplicaciones de Android, y la mejor manera aquí puede o no ser la misma que Java en general.¿La mejor manera de incluir el código de depuración?

Simplemente quiero ser capaz de establecer un indicador de depuración que solo ejecutará ciertas partes del código cuando se establezca en verdadero - equiv a C++ estableciendo un preprocesador #define DEPURACIÓN y utilizando #ifdef DEPURACIÓN.

¿Existe alguna forma aceptada o mejor para lograr esto en Java?

Ahora mismo voy a establecer una variable en mi objeto Aplicación, pero no me imagino que esta es la mejor manera.

+2

Salida esta respuesta: http://stackoverflow.com/questions/1344270/java-preprocessor – zmbush

Respuesta

23

Esa es la manera que lo hago:

// in some.class.with.Constants 
public static final boolean DEV_MODE = true; 

// in some other class 
import static some.class.with.Constants.DEV_MODE; 

if(DEV_MODE){ 
    Log.d('sometag', 'somemessage'); 
} 
+3

Nice! ¡No sabía que pudieras importar todo el camino a una sola constante! Estaba buscando evitar escribir X.X.CONST todo el tiempo. Esto, combinado con la respuesta a la que se hace referencia en el comentario sobre mi pregunta (http://stackoverflow.com/questions/1344270/java-preprocessor), que muestra cómo una declaración 'if' con una constante falsa en su condición se excluye del compilación, es exactamente lo que estaba buscando. ¡Gracias! – stormin986

+0

Por mis experimentos (verificando el código de byte), este enfoque solo excluirá el código de la clase donde se define la constante .. otras clases todavía tendrán el código en ellas (aunque no se ejecutará). ¿Me equivoco? – Vlad

+0

importar estática es básicamente una cosa de nombre – Vlad

6
if (Debug.isDebuggerConnected()) { 
    // debug stuff 
} 
+0

Me gusta esto, y me imagino que a veces lo encontraré bastante útil, pero me gusta cómo el otro enfoque omite todo el bloque de la compilación con una constante falsa en el 'si' declaración. – stormin986

+1

Uso ambos métodos y comentarios condicionales. Cada uno tiene su lugar, aunque un preprocesador real sería lo mejor. – drawnonward

+0

Problema con esto es que el depurador no siempre está conectado, cuando mi aplicación falla. Estoy recopilando el seguimiento de pila en la excepción y guardado en un archivo. Pero DEBO hacerlo solo en la construcción de depuración. – anishsane

51

En lugar de utilizar su propia bandera, se puede utilizar el indicador establecido automáticamente por ADT, así:

final static int appFlags = context.getApplicationInfo().flags; 
final static boolean isDebug = (appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0 

El FLAG_DEBUGGABLE bit se establece automáticamente en verdadero o falso, dependiendo del atributo "depurable" de la aplicación (establecido en AndroidManifest.xml). La última versión de ADT (versión 8) establece automáticamente este atributo para usted cuando no exporta un paquete firmado.

Por lo tanto, no tiene que recordar configurar/restablecer su propio marcador personalizado.

Puede leer más en this thread.

1

Creo que escribir pruebas es una alternativa mejor que agregar el código DEBUG.

Mi punto es que cuando se escribe la prueba para algún componente/método/clase no se contamina el código fuente original con algún código de depuración redundante.

24

Revisión 17 de herramientas de SDK (Marzo 2012) introdujo una manera de imitar de #ifdef DEBUG

C Desde el General Notes:

añadido una característica que le permite ejecutar algún código sólo en el modo de depuración . Las compilaciones ahora generan una clase llamada BuildConfig que contiene una constante DEBUG que se establece automáticamente de acuerdo con su tipo de compilación. Puede verificar la constante (BuildConfig.DEBUG) en su código para ejecutar funciones de solo depuración.

+0

Siempre devuelve falso para mi biblioteca que mi aplicación está usando –

10

Esto funciona para mí con código if (BuildConfig.DEBUG), utilizando la claseBuildConfig. Este es un código seguro y fácil de hacer. Tenga cuidado al usar este estilo de código. No lo use de modo que haya 2 diferentes ramas distintas de código, entre las versiones Release y Debug. Si lo hace, podría invalidar la prueba de la aplicación para la versión de lanzamiento. Para mí, lo he usado solo para omitir la llamada a los mensajes Log.

Más detalles sobre esta clase BuildConfig @Build System Concepts.

+0

Casi cero uso de CPU. Perfecto. – romulof

+0

@OrB, me alegro por ti y creo que es la mejor opción para el moderno Android Studio. Editaré mi publicación ya que ahora debe usarse como el código más fácil de hacer. Gracias por notar y darme un recordatorio. –

9

Es mejor utilizar la API de Android incorporado BuildConfig

if (BuildConfig.DEBUG) { 
    // do something for a debug build 
} 
Cuestiones relacionadas