Come posso rilevare se sono in modalità di rilascio o debug?


Risposte:


770

La soluzione più semplice e migliore a lungo termine è usare BuildConfig.DEBUG. Questo è un booleanvalore che sarà trueper una build di debug, falsealtrimenti:

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

Ci sono state segnalazioni che questo valore non è affidabile al 100% dalle build basate su Eclipse, anche se personalmente non ho riscontrato un problema, quindi non posso dire quanto sia realmente un problema.

Se stai usando Android Studio o se stai usando Gradle dalla riga di comando, puoi aggiungere le tue cose BuildConfigo modificare i tipi debuge releasecostruire tipi per aiutare a distinguere queste situazioni in fase di esecuzione.

La soluzione di Argomento illegale si basa sul valore della android:debuggablebandiera nel manifest. Se è così che desideri distinguere una build "debug" da una build "release", allora per definizione, questa è la soluzione migliore. Tuttavia, tieni presente che andando avanti, la debuggablebandiera è davvero un concetto indipendente da ciò che Gradle / Android Studio considera una build "debug". Qualsiasi tipo di build può scegliere di impostare il debuggableflag su qualsiasi valore che abbia senso per quello sviluppatore e per quel tipo di build.


34
BuildConfigsi trova nel pacchetto della tua app, ad es.import com.mycompany.myapp.BuildConfig;
Chris Cirefice,

10
a causa di un bug in AndroiStudio questo non funziona più, è sempre falso, anche in modalità DEBUG
user387184

1
@ user387184: In Android Studio 1.2.2, ottengo public static final boolean DEBUG = Boolean.parseBoolean("true");una build di debug. Mentre questo è un modo bizzarro per set DEBUGa true, dovrebbe funzionare. Se lo vedi in una delle versioni di test 1.3.0 o se hai un caso di test riproducibile per 1.2.2, presenta un problema . Non vedo problemi in sospeso che segnalano questo problema.
CommonsWare,

2
Sto usando v1.2.2 e BuildConfig.DEBUG è sempre falso, quindi ho provato il suggerimento di seguito che funziona per me - proverò anche il tuo - molte grazie!
user387184,

3
A quanto pare, questo non funzionerà quando si utilizza una libreria (restituisce sempre true): stackoverflow.com/q/20176284/878126 . Mi chiedo qual è la migliore alternativa
sviluppatore Android del

59

Prova quanto segue:

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

Kotlin:

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

È preso da post di bundells da qui


3
Questa risposta funzionerà in tutti i casi, indipendentemente dal progetto della biblioteca o dal progetto dell'applicazione.
Lavekush Agrawal,

Cosa deve essere importato per getApplicationInfo().flagsfunzionare?
A1m,

1
ok non funziona in un contesto statico, vedi stackoverflow.com/questions/10641144/…
A1m

54

Sì, non avrai problemi ad usare:

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

A meno che non si stia importando la classe BuildConfig sbagliata. Assicurati di fare riferimento alla classe BuildConfig del tuo progetto, non a nessuna delle tue librerie di dipendenze.

inserisci qui la descrizione dell'immagine


1
"A meno che tu non stia importando la classe BuildConfig sbagliata" ... Sì, ottimo punto: D
Benjamin Piette,

Grazie! Questo era il problema nel mio progetto, in qualche modo stava raccogliendo BuildConfig del progetto di libreria (che è sempre in modalità di rilascio fino a quando non esce Android Studio 3)
Amit Garg

36

A causa dei commenti contrastanti su BuildConfig.DEBUG, ho usato quanto segue per disabilitare crashlytics (e analisi) in modalità debug:

aggiorna /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'
        }
    }
}

quindi, nel tuo codice rilevi la ENABLE_CRASHLYTICSbandiera come segue:

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

usa lo stesso concetto nella tua app e rinomina ENABLE_CRASHLYTICScome preferisci. Mi piace questo approccio perché posso vedere il flag nella configurazione e posso controllare il flag.


Non dovresti chiamare Crashlytics e Risposte separatamente. Basta usare: Fabric.with (questo, nuovo Crashlytics ()); per includere Crashlytics e Risposte.
Mike Bonnell,

1
Grazie, @MikeBonnell, ho apportato la modifica del codice al codice di esempio
Someone Somewhere

Non vedo come sia diverso dall'uso di BuildConfig.DEBUG: se imposti BuildConfig.ENABLE_CRASHLYTICS solo per le tue build di debug, BuildConfig.DEBUG e BuildConfig.ENABLE_CRASHLYTICS avranno sempre lo stesso valore, giusto?
k2col,

Penso che il dev che sta lavorando ai progetti di libreria abbia avuto problemi nel rilevare build di debug / release usando BuildConfig.DEBUG. Potrebbe essersi verificato anche un bug di Android Studio ...
Someone Somewhere,

13

In alternativa, è possibile differenziare utilizzando BuildConfig.BUILD_TYPE;

Se stai eseguendo il debug build BuildConfig.BUILD_TYPE.equals("debug");restituisce true. E per il rilascio build BuildConfig.BUILD_TYPE.equals("release");restituisce vero.


1
Questa è la risposta corretta Restituisce "release" mentre BuildConfig.DEBUG restituisce sempre true.
Minas Mina,

6

Sto usando questa soluzione per scoprire che la mia app è in esecuzione sulla versione di debug.

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}

1
Aggiungi una descrizione alla tua risposta. Sarebbe più utile di un semplice pezzo di codice.
Mathews Sunny,

Stavo usando if (BuildConfig.DEBUG) {} un modulo Gradle dipendente che non aveva (ovviamente) NESSUN RIFERIMENTO al file build.gradle dell'app - questo ha causato il riconoscimento della modalità debug in modo errato. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }RISOLTO il problema. Grazie
kosiara - Bartosz Kosarzycki

questa è la vera risposta, basta cambiare "Debug" in "debug"
Jetwiz

1

Assicurati di importare la classe BuildConfig corretta E sì, non avrai problemi ad usare:

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

Funziona benissimo! Grazie!
sud007,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.