Wie erkenne ich, ob ich mich im Release- oder Debug-Modus befinde?

374

Wie kann ich in meinem Code erkennen, dass ich mich im Release- oder Debug-Modus befinde?

David
quelle

Antworten:

770

Die einfachste und beste langfristige Lösung ist die Verwendung BuildConfig.DEBUG. Dies ist ein booleanWert, der truefür einen Debug-Build gilt, falseandernfalls:

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

Es wurde berichtet, dass dieser Wert bei Eclipse-basierten Builds nicht 100% zuverlässig ist, obwohl ich persönlich kein Problem festgestellt habe, sodass ich nicht sagen kann, wie groß das Problem tatsächlich ist.

Wenn Sie Android Studio verwenden, oder wenn Sie Gradle über die Befehlszeile verwenden, können Sie Ihre eigenen Sachen hinzufügen BuildConfigoder auf andere Weise optimieren die debugund releaseBuild - Typen zu unterscheiden helfen , diese Situationen zur Laufzeit.

Die Lösung von Illegal Argument basiert auf dem Wert des android:debuggableFlags im Manifest. Wenn Sie auf diese Weise einen "Debug" -Build von einem "Release" -Build unterscheiden möchten, ist dies per Definition die beste Lösung. debuggableBedenken Sie jedoch, dass die Flagge in Zukunft wirklich ein unabhängiges Konzept von dem ist, was Gradle / Android Studio als "Debug" -Build betrachtet. Jeder Build-Typ kann das debuggableFlag auf einen beliebigen Wert setzen, der für diesen Entwickler und für diesen Build-Typ sinnvoll ist.

CommonsWare
quelle
34
BuildConfigbefindet sich im Paket Ihrer App, z. B.import com.mycompany.myapp.BuildConfig;
Chris Cirefice
10
Aufgrund eines Fehlers in AndroiStudio funktioniert dies nicht mehr, es ist immer falsch, auch im DEBUG-Modus
user387184
1
@ user387184: In Android Studio 1.2.2 bekomme ich public static final boolean DEBUG = Boolean.parseBoolean("true");für einen Debug Build. Während die eine bizarre Art und Weise zu Satz ist DEBUGzu true, sollte es funktionieren. Wenn Sie dies in einer der Testversionen 1.3.0 sehen oder wenn Sie einen reproduzierbaren Testfall für 1.2.2 haben, reichen Sie bitte ein Problem ein . Ich sehe keine offenen Probleme, die dieses Problem melden.
CommonsWare
2
Ich benutze v1.2.2 und BuildConfig.DEBUG ist immer falsch, dann habe ich den folgenden Vorschlag ausprobiert, der für mich funktioniert - ich werde auch Ihren versuchen - vielen Dank!
user387184
3
Wie sich herausstellt, funktioniert dies bei Verwendung einer Bibliothek nicht (gibt immer true zurück): stackoverflow.com/q/20176284/878126 . Ich frage mich, was die beste Alternative ist
Android-Entwickler
59

Versuche Folgendes:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

Kotlin:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE

Es stammt aus Bundels Post von hier

Illegales Argument
quelle
3
Diese Antwort funktioniert in allen Fällen unabhängig vom Bibliotheksprojekt oder Anwendungsprojekt.
Lavekush Agrawal
Was muss importiert werden, damit getApplicationInfo().flagses funktioniert?
A1m
1
ok, es funktioniert einfach nicht im statischen Kontext, siehe stackoverflow.com/questions/10641144/…
A1m
54

Ja, Sie werden keine Probleme haben mit:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}

Es sei denn, Sie importieren die falsche BuildConfig-Klasse. Stellen Sie sicher, dass Sie auf die BuildConfig-Klasse Ihres Projekts verweisen und nicht auf eine Ihrer Abhängigkeitsbibliotheken.

Geben Sie hier die Bildbeschreibung ein

Vansuita Jr.
quelle
1
"Es sei denn, Sie importieren die falsche BuildConfig-Klasse" ... Ja, sehr guter Punkt: D
Benjamin Piette
Vielen Dank! Dies war das Problem in meinem Projekt, irgendwie nahm es die BuildConfig des Bibliotheksprojekts auf (die immer im Release-Modus ist, bis Android Studio 3 herauskommt)
Amit Garg
36

Aufgrund der gemischten Kommentare zu habe BuildConfig.DEBUGich Folgendes verwendet, um Crashlytics (und Analytics) im Debug-Modus zu deaktivieren:

update /app/build.gradle

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"

    defaultConfig {
        applicationId "your.awesome.app"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 100
        versionName "1.0.0"
        buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'true'
    }
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'false'
        }
        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

Dann erkennen Sie in Ihrem Code die ENABLE_CRASHLYTICSFlagge wie folgt:

    if (BuildConfig.ENABLE_CRASHLYTICS)
    {
        // enable crashlytics and answers (Crashlytics by default includes Answers)
        Fabric.with(this, new Crashlytics());
    }

Verwenden Sie dasselbe Konzept in Ihrer App und benennen ENABLE_CRASHLYTICSSie es nach Belieben um. Ich mag diesen Ansatz, weil ich das Flag in der Konfiguration sehen und das Flag steuern kann.

Irgendwer irgendwo
quelle
Sie sollten Crashlytics und Answers nicht separat aufrufen. Verwenden Sie einfach: Fabric.with (dies, neue Crashlytics ()); Crashlytics und Antworten einzuschließen.
Mike Bonnell
1
Danke, @MikeBonnell, ich habe den Code in den Beispielcode geändert
Jemand irgendwo
Ich sehe keinen Unterschied zu BuildConfig.DEBUG. Wenn Sie BuildConfig.ENABLE_CRASHLYTICS nur für Ihre Debug-Builds festlegen, haben BuildConfig.DEBUG und BuildConfig.ENABLE_CRASHLYTICS immer den gleichen Wert, oder?
k2col
Ich denke, dass Entwickler bei der Arbeit an Bibliotheksprojekten Probleme hatten, Debug- / Release-Builds mit BuildConfig.DEBUG zu erkennen. Möglicherweise war auch ein früher Android Studio-Fehler aufgetreten ...
Jemand irgendwo
13

Alternativ können Sie mit BuildConfig.BUILD_TYPE unterscheiden.

Wenn Sie Debug Build BuildConfig.BUILD_TYPE.equals("debug");ausführen, wird true zurückgegeben. Und für Release Build BuildConfig.BUILD_TYPE.equals("release");gibt true zurück.

Prudhvi
quelle
1
Dies ist die richtige Antwort. Gibt "release" zurück, während BuildConfig.DEBUG immer zurückgibt true.
Minas Mina
6

Ich verwende diese Lösung, um herauszufinden, dass meine App in der Debug-Version ausgeführt wird.

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}
Giedrius Šlikas
quelle
1
Bitte fügen Sie Ihrer Antwort eine Beschreibung hinzu. Es wäre hilfreicher als nur ein Stück Code.
Mathews Sunny
Ich habe if (BuildConfig.DEBUG) {} in einem abhängigen Gradle-Modul verwendet, das (natürlich) KEINEN VERWEIS auf die build.gradle-Datei der App hatte - dies führte dazu, dass der Debug-Modus falsch erkannt wurde. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }Das Problem wurde behoben. Danke
kosiara - Bartosz Kosarzycki
Dies ist eine echte Antwort. Ändern Sie einfach "Debug" in "Debug"
Jetwiz
1

Stellen Sie sicher, dass Sie die richtige BuildConfig-Klasse importieren. Und ja, Sie haben keine Probleme mit:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
Salim Lachdhaf
quelle
Das funktioniert einfach gut! Vielen Dank!
sud007