web-dev-qa-db-fra.com

La meilleure façon d'inclure le code de débogage?

Je programme des applications Android, et la meilleure façon ici peut ou non être la même que Java en général.

Je veux simplement pouvoir définir un indicateur de débogage qui n'exécutera certaines parties de code que lorsqu'il est défini sur true - équivalent à C++ en définissant un préprocesseur #define DEBUG et en utilisant #ifdef DEBUG.

Existe-t-il un moyen accepté ou le meilleur pour y parvenir en Java?

Pour le moment, je vais simplement définir une variable dans mon objet Application, mais je n'imagine pas que c'est la meilleure façon.

38
stormin986

C'est comme ça que je le fais:

// 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');
}
31
yanchenko

Au lieu d'utiliser votre propre indicateur, vous pouvez utiliser l'indicateur défini automatiquement par ADT, comme ceci:

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

Le FLAG_DEBUGGABLE bit est automatiquement défini sur true ou false, selon l'attribut "debuggable" de l'application (défini dans AndroidManifest.xml). La dernière version d'ADT (version 8) définit automatiquement cet attribut lorsque vous n'exportez pas un package signé.

Ainsi, vous n'avez pas à vous souvenir d'avoir défini/réinitialisé votre propre indicateur personnalisé.

Vous pouvez en lire plus dans ce fil .

55
HRJ

La révision 17 des outils SDK (mars 2012) a introduit un moyen d'imiter les C's #ifdef DEBUG

De la Notes générales :

Ajout d'une fonctionnalité qui vous permet d'exécuter du code uniquement en mode débogage. Les générations génèrent désormais une classe appelée BuildConfig contenant une constante DEBUG qui est automatiquement définie en fonction de votre type de génération. Vous pouvez vérifier la constante (BuildConfig.DEBUG) dans votre code pour exécuter des fonctions de débogage uniquement.

26
IlDan

Je suggère d'utiliser la fonction intégrée Android API BuildConfig

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
19
Sunny Tambi

Cela fonctionne pour moi avec le code if (BuildConfig.DEBUG), en utilisant la classe BuildConfig . C'est un code sûr et facile à faire. Soyez prudent lorsque vous utilisez ce style de code. Ne l'utilisez pas de telle sorte qu'il existe 2 différentes branches de code distinctes, entre les versions Release et Debug . Si vous le faites, cela pourrait invalider le test de l'application pour la version Release. Pour moi, je l'ai utilisé uniquement pour éviter d'appeler la messagerie Log.

Plus de détails sur cette classe BuildConfig @ Build System Concepts .

12
if ( Debug.isDebuggerConnected() ) {
  // debug stuff
}
6
drawnonward

Je pense que l'écriture de tests est une meilleure alternative que l'ajout de code DEBUG.

Mon point est que lorsque vous écrivez un test pour un composant/une méthode/une classe, vous ne polluez pas votre code source d'origine avec du code de débogage redondant.

1
fiction