¿Cómo detecto si estoy en modo de liberación o depuración?

Respuestas:

770

La solución más simple y mejor a largo plazo es usar BuildConfig.DEBUG. Este es un booleanvalor que será truepara una compilación de depuración, de lo falsecontrario:

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

Ha habido informes de que este valor no es 100% confiable de las compilaciones basadas en Eclipse, aunque personalmente no he encontrado un problema, por lo que no puedo decir qué problema realmente es.

Si está utilizando Android de estudio, o si está utilizando Gradle desde la línea de comandos, puede añadir su propio material a BuildConfigo de otra manera modificar las debugy releaseconstruir tipos para ayudar a distinguir estas situaciones en tiempo de ejecución.

La solución de Argumento ilegal se basa en el valor de la android:debuggablebandera en el manifiesto. Si así es como desea distinguir una compilación de "depuración" de una compilación de "lanzamiento", entonces, por definición, esa es la mejor solución. Sin embargo, tenga en cuenta que en el futuro, la debuggablebandera es realmente un concepto independiente de lo que Gradle / Android Studio considera que es una construcción de "depuración". Cualquier tipo de compilación puede elegir establecer el debuggableindicador en cualquier valor que tenga sentido para ese desarrollador y para ese tipo de compilación.

CommonsWare
fuente
34
BuildConfigse encuentra en el paquete de su aplicación, por ejemploimport com.mycompany.myapp.BuildConfig;
Chris Cirefice
10
debido a un error en AndroiStudio, esto ya no funciona, siempre es falso, incluso en modo
DEPURACIÓN
1
@ user387184: en Android Studio 1.2.2, obtengo public static final boolean DEBUG = Boolean.parseBoolean("true");una compilación de depuración. Mientras que es una forma extraña de conjunto DEBUGa true, que debería funcionar. Si está viendo esto en una de las versiones de prueba 1.3.0, o si tiene un caso de prueba reproducible para 1.2.2, presente un problema . No veo ningún problema pendiente que informe este problema.
CommonsWare
2
Estoy usando v1.2.2 y BuildConfig.DEBUG siempre es falso, luego probé la sugerencia a continuación que funciona para mí, probaré la tuya también. ¡Muchas gracias!
user387184
3
Como resultado, esto no funcionará cuando se use una biblioteca (siempre devuelve verdadero): stackoverflow.com/q/20176284/878126 . Me pregunto cuál es la mejor alternativa
desarrollador de Android
59

Intenta lo siguiente:

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

Kotlin:

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

Se toma de la publicación de bundells de aquí

Argumento ilegal
fuente
3
Esta respuesta funcionará en todos los casos, independientemente del proyecto de biblioteca o proyecto de aplicación.
Lavekush Agrawal
¿Qué se necesita importar para getApplicationInfo().flagstrabajar?
A1m
1
ok, simplemente no funciona en contexto estático, consulte stackoverflow.com/questions/10641144/…
A1m
54

Sí, no tendrás problemas para usar:

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

A menos que esté importando la clase BuildConfig incorrecta. Asegúrese de hacer referencia a la clase BuildConfig de su proyecto, no a ninguna de sus bibliotecas de dependencias.

ingrese la descripción de la imagen aquí

Vansuita Jr.
fuente
1
"A menos que esté importando la clase BuildConfig incorrecta" ... Sí, muy buen punto: D
Benjamin Piette
¡Gracias! Este fue el problema en mi proyecto, de alguna manera estaba recogiendo BuildConfig del proyecto de biblioteca (que siempre está en modo de lanzamiento hasta que salga Android Studio 3)
Amit Garg
36

Debido a los comentarios mixtos sobre BuildConfig.DEBUG, utilicé lo siguiente para deshabilitar crashlytics (y análisis) en modo de depuración:

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

luego, en su código, detecta la ENABLE_CRASHLYTICSbandera de la siguiente manera:

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

use el mismo concepto en su aplicación y cambie el nombre ENABLE_CRASHLYTICSa lo que quiera. Me gusta este enfoque porque puedo ver la bandera en la configuración y puedo controlarla.

Alguien en alguna parte
fuente
No debe llamar a Crashlytics and Answers por separado. Simplemente use: Fabric.with (this, new Crashlytics ()); para incluir Crashlytics y respuestas.
Mike Bonnell
1
Gracias, @ MikeBonnell, hice el cambio de código al código de ejemplo
alguien en algún lugar el
No veo cómo esto es diferente de usar BuildConfig.DEBUG: si solo configura BuildConfig.ENABLE_CRASHLYTICS para sus compilaciones de depuración, BuildConfig.DEBUG y BuildConfig.ENABLE_CRASHLYTICS siempre tendrán el mismo valor, ¿verdad?
k2col
Creo que el desarrollador que trabajaba en proyectos de biblioteca tenía problemas para detectar compilaciones de depuración / lanzamiento usando BuildConfig.DEBUG. También podría haber habido un error temprano de Android Studio ...
Someone Somewhere
13

Alternativamente, puede diferenciar usando BuildConfig.BUILD_TYPE;

Si está ejecutando, la compilación de depuración BuildConfig.BUILD_TYPE.equals("debug");devuelve verdadero. Y para el lanzamiento, la construcción BuildConfig.BUILD_TYPE.equals("release");vuelve a ser verdadera.

Prudhvi
fuente
1
Esta es la respuesta correcta. Devuelve "release" mientras que BuildConfig.DEBUG siempre devuelve true.
Minas Mina
6

Estoy usando esta solución en caso de descubrir que mi aplicación se está ejecutando en la versión de depuración.

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}
Giedrius Šlikas
fuente
1
Agregue una descripción a su respuesta. Sería más útil que solo un fragmento de código.
Mathews Sunny
Estaba usando if (BuildConfig.DEBUG) {} un módulo gradle dependiente que (por supuesto) NO HABÍA REFERENCIA al archivo build.gradle de la aplicación; esto provocó que el modo de depuración se reconociera de manera incorrecta. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }CORREGIDO el problema. Gracias
kosiara - Bartosz Kosarzycki
esta es la respuesta real, simplemente cambie "Debug" a "debug"
Jetwiz
1

Asegúrese de importar la clase BuildConfig correcta. Y sí, no tendrá problemas para usar:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
Salim Lachdhaf
fuente
¡Esto funciona bien! ¡Gracias!
sud007