wake-up-neo.com

Wann setzt ADT BuildConfig.DEBUG auf false?

In der neuesten Version von ADT (r17) wurde eine generierte Konstante hinzugefügt. BuildConfig.DEBUG, das entsprechend dem Buildtyp festgelegt wird. Das Problem, das ich habe, ist, dass es nie auf false gesetzt ist. Ich habe erwartet, dass es sich ändert, wenn ich "Android Tools -> Signiertes Anwendungspaket exportieren" ausführe, aber für mich nicht.

Wie ändere ich den Build-Typ?

Es wurde eine Funktion hinzugefügt, mit der Sie Code nur im Debug-Modus ausführen können. Builds generieren jetzt eine Klasse mit dem Namen BuildConfig, die eine DEBUG-Konstante enthält, die automatisch entsprechend Ihrem Build-Typ festgelegt wird. Sie können die Konstante (BuildConfig.DEBUG) in Ihrem Code überprüfen, um nur Debug-Funktionen auszuführen

107
smith324

Derzeit können Sie das richtige Verhalten erzielen, indem Sie "Automatisch erstellen" deaktivieren, das Projekt bereinigen und dann über "Android Tools -> Signiertes Anwendungspaket exportieren" exportieren. Wenn Sie die Anwendung ausführen, wird BuildConfig.DEBUG sollte falsch sein.

56
smith324

Mit Eclipse deaktiviere ich immer die Option "Automatisch erstellen", bevor ich die App in der Version exportiere. Dann reinige ich das Projekt und exportiere. Andernfalls wird die Kompilierung im Debug-Modus gestartet, und der Wert von BuildConfig.DEBUG ist möglicherweise falsch.

Mit Android Studio füge ich einfach meine eigene benutzerdefinierte Variable in die build.gradle ein:

buildTypes {
    debug {
        buildConfigField "Boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "Boolean", "DEBUG_MODE", "false"
    }
}

Wenn ich das Projekt erstelle, wird BuildConfig.Java wie folgt generiert:

public final class BuildConfig {
  // Fields from build type: debug
  public static final Boolean DEBUG_MODE = true;
}

Dann kann ich in meinem Code Folgendes verwenden:

if (BuildConfig.DEBUG_MODE) {
    // do something
}

Ich empfehle, nach dem Wechsel von Debug/Release Build zu reinigen.

36
Arnaud SmartFun

Es funktioniert nicht richtig:

Issue 2794 : BuildConfig.DEBUG ist "true" für das exportierte Anwendungspaket

Es ist enttäuschend, dass sie manchmal fehlerhafte Funktionen veröffentlichen.

33

Es funktioniert, aber beachten Sie, dass sich die Codedatei auch beim Exportieren der signierten Datei nie ändert. Der Export process ändert den Wert dieser Variablen in false, was möglicherweise den falschen Eindruck erweckt, dass sie nicht funktioniert. Ich habe dies mit Logging-Anweisungen wie getestet

if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

Beim Testen erzeugen meine Log-Anweisungen keine Ausgabe mehr.

10
pbhowmick

From Vorbereitung für die Veröffentlichung :

Deaktivieren Sie die Protokollierung und das Debuggen

Stellen Sie sicher, dass Sie die Protokollierung deaktivieren und die Debugging-Option deaktivieren, bevor Sie Ihre Anwendung für die Freigabe erstellen. Sie können die Protokollierung deaktivieren, indem Sie die Aufrufe der Protokollmethoden in Ihren Quelldateien entfernen. Sie können das Debuggen deaktivieren, indem Sie das Attribut "Android: debuggable" aus dem Tag in Ihrer Manifestdatei entfernen oder das Attribut "Android: debuggable" in Ihrer Manifestdatei auf "false" setzen. Entfernen Sie auch alle Protokolldateien oder statischen Testdateien, die in Ihrem Projekt erstellt wurden.

Außerdem sollten Sie alle Debug-Tracing-Aufrufe entfernen, die Sie Ihrem Code hinzugefügt haben, z. B. die Methodenaufrufe startMethodTracing () und stopMethodTracing ().

Weitere Informationen finden Sie unter dem Link.

5
peter

Die Lösung für mich:

  1. Projekt -> Automatisch erstellen
  2. Projekt -> Reinigen
  3. Projekt -> Erstellen
  4. Projektexport Android Anwendung

Es ist Arbeit in R20

5
e.shishkin

Ich würde eine einfache Problemumgehung vorschlagen, wenn Sie beim APK-Export proguard verwenden.

Proguard bietet eine Möglichkeit, Aufrufe bestimmter Funktionen im Freigabemodus zu entfernen. Alle Aufrufe zum Debuggen von Protokollen können mit der folgenden Einstellung in proguard-project.txt Entfernt werden.

# Remove debug logs
-assumenosideeffects class Android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

Und Optimierungseinstellung in project.properties.

proguard.config=${sdk.dir}/tools/proguard/proguard-Android-optimize.txt:proguard-project.txt

Auf diese Weise müssen Sie keine unnötige String-Berechnung vornehmen, die an das Debug-Protokoll übergeben wird, auf das @Jeremyfa verwiesen hat. Die Berechnungen werden nur im Releasebuild entfernt.

Die Problemumgehung für BuildConfig.DEBUG verwendet dieselbe Funktion von proguard wie die folgende.

public class DebugConfig {

    private static boolean debug = false;

    static {
        setDebug(); // This line will be removed by proguard in release.
    }

    private static void setDebug() {
        debug = true;
    }

    public static boolean isDebug() {
        return debug;
    }
}

Und folgende Einstellung in proguard-project.txt.

-assumenosideeffects class com.neofect.rapael.client.DebugConfig {
    private static *** setDebug();
}

Ich würde es vorziehen, dies zu verwenden, um die Option Build Automatically Zu deaktivieren, da dies nicht von der individuellen Einstellung IDE des Builders abhängt, sondern als festgeschriebene Datei verwaltet wird, die von den Entwicklern gemeinsam genutzt wird.

3
neo.kim

Funktioniert meines Wissens nicht richtig ( Android issue 22241 )

Ich hatte einige Probleme bei einem Projekt (mit Eclipse), diese Konstante wurde beim Exportieren einer signierten APK meines Projekts nicht auf true gesetzt :(

Würde gerne hören, dass es funktioniert

1

ein guter Weg ist das Erstellen einer eigenen Klasse:

public class Log {

public static void d(String message) {
    if (BuildConfig.DEBUG)
        Android.util.Log.d(
            "[" + (new Exception().getStackTrace()[1].getClassName()) + "]",
            "{" + (new Exception().getStackTrace()[1].getMethodName()) + "} "
            + message
        );
}

}
1

Ich habe ein merkwürdiges Verhalten festgestellt, das damit zu tun hat, dass die Werte in BuildConfig auf ihre endgültigen Werte gesetzt werden. Dies hat möglicherweise etwas mit Ihrem Problem zu tun.

Die einfache Erklärung ist, dass die Standardwerte zunächst festgelegt werden, bevor Proguard ausgeführt wird. Nach dem Ausführen von Proguard wird die BuildConfig-Datei mit den richtigen Werten neu generiert. Allerdings hat Proguard Ihren Code zu diesem Zeitpunkt bereits optimiert und Sie haben Probleme.

Hier ist ein Fehler, den ich gegen Gradle gemacht habe. https://code.google.com/p/Android/issues/detail?id=182449

0
TALE