2010-04-27 6 views
30

Ich programmiere Android-Anwendungen, und der beste Weg hier kann oder kann nicht der gleiche wie Java im Allgemeinen sein.Beste Möglichkeit, Debug-Code einzubeziehen?

Ich möchte einfach ein Debug-Flag setzen, die nur bestimmte Teile des Codes ausgeführt werden, wenn es auf True festgelegt ist - Äquivalent zu C++ Festlegen eines Präprozessors # Define DEBUG und Verwenden von #ifdef DEBUG.

Gibt es einen akzeptierten oder besten Weg, dies in Java zu erreichen?

Im Moment werde ich nur eine Variable in meinem Application-Objekt setzen, aber ich kann mir nicht vorstellen, dass dies der beste Weg ist.

+2

prüfen eingebauten Android API diese Antwort heraus zu verwenden: http://stackoverflow.com/questions/1344270/java-preprocessor – zmbush

Antwort

23

Das ist die Art, wie ich es tun:

// 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! Ich wusste nicht, dass du den ganzen Weg bis zu einer einzigen Konstante importieren kannst! Ich wollte vermeiden, jedesmal X.X.CONST zu tippen. Dies kombiniert mit der Antwort, auf die im Kommentar zu meiner Frage (http://stackoverflow.com/questions/1344270/java-preprocessor) verwiesen wird, die zeigt, wie eine 'if'-Anweisung mit einer falschen Konstante in ihrem Zustand von der ausgeschlossen wird Kompilation, genau das, was ich gesucht habe. Vielen Dank! – stormin986

+0

Durch meine Experimente (Überprüfung des Byte-Codes) wird dieser Ansatz nur den Code aus der Klasse ausschließen, in dem die Konstante definiert ist. Andere Klassen haben immer noch den Code in ihnen (er wird jedoch nicht ausgeführt). Liege ich falsch? – Vlad

+0

importieren statisch ist im Grunde nur ein Name Ding – Vlad

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

Ich mag das, und ich stelle mir vor, ich werde es manchmal nützlich finden, aber ich mag, wie der andere Ansatz den gesamten Block aus der Kompilation mit einer falschen Konstante in der 'if' Erklärung. – stormin986

+1

Ich verwende beide Methoden und Kommentar-Bedingungen. Jeder hat seinen Platz, obwohl ein echter Präprozessor der beste wäre. – drawnonward

+0

Problem mit diesem ist, der Debugger ist nicht immer verbunden, wenn meine App abstürzt. Ich sammle die Stack-Trace in Ausnahme und Speichern in einer Datei. Aber ich muss es nur im Debug-Build tun. – anishsane

51

Statt Ihre eigene Flagge zu verwenden, können Sie das Flag automatisch von ADT, wie dieses Set verwenden:

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

Die FLAG_DEBUGGABLE Das Bit wird automatisch auf "True" oder "False" gesetzt, abhängig vom Attribut "debuggable" der Anwendung (in AndroidManifest.xml festgelegt). Die neueste Version von ADT (Version 8) setzt dieses Attribut automatisch für Sie, wenn Sie ein signiertes Paket nicht exportieren.

So müssen Sie sich nicht daran erinnern, Ihre eigene benutzerdefinierte Flagge zu setzen/zurücksetzen. Sie können mehr in this thread lesen.

1

Ich denke, das Schreiben von Tests ist eine bessere Alternative als das Hinzufügen von DEBUG-Code.

Mein Punkt ist, dass wenn Sie Test für eine Komponente/Methode/Klasse schreiben Sie nicht Ihren ursprünglichen Quellcode mit einigen redundanten Debug-Code verschmutzen.

24

Revision 17 von SDK-Tools (März 2012) eingeführt, einen Weg zu C des imitieren #ifdef DEBUG

Von der General Notes:

Added eine Funktion, die Sie einen Code nur im Debug-Modus laufen zu lassen . Builds generieren jetzt eine Klasse namens BuildConfig, die eine DEBUG-Konstante enthält, die automatisch entsprechend Ihrem Buildtyp festgelegt wird. Sie können die Konstante (BuildConfig.DEBUG) in Ihrem Code überprüfen, um Debug-only-Funktionen auszuführen.

+0

Gibt immer false für meine Bibliothek zurück, die meine App verwendet –

10

Dies funktioniert für mich mit dem Code if (BuildConfig.DEBUG), die BuildConfig Klasse. Dies ist ein sicherer und einfacher Code zu tun. Seien Sie vorsichtig, wenn Sie diese Art von Code verwenden. Verwenden Sie es nicht so, dass es zwei verschiedene unterschiedliche Codezweige gibt, zwischen Release und Debug Versionen. In diesem Fall könnte der App-Test für die Release-Version ungültig werden. Für mich habe ich es nur verwendet, um Log Messaging zu überspringen.

Weitere Informationen zu dieser Klasse BuildConfig @Build System Concepts.

+0

Fast keine CPU-Auslastung. Perfekt. – romulof

+0

@OrB, ich freue mich für Sie und ich denke, es ist die beste Wahl für das moderne Android Studio. Ich werde meinen Beitrag bearbeiten, da er jetzt als der einfachste Code verwendet werden sollte. Danke, dass Sie es bemerkt haben und mir eine Erinnerung geben. –

9

Ich schlage vor, BuildConfig

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