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


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.


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


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


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.


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.


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
}

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.
}

Das funktioniert einfach gut! Vielen Dank!
sud007
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.