Como detectar se estou no modo de liberação ou depuração?

374

Como posso detectar no meu código que estou no modo Release ou Debug?

David
fonte

Respostas:

770

A solução mais simples e melhor a longo prazo é usar BuildConfig.DEBUG. Este é um booleanvalor que será truepara uma compilação de depuração, falsecaso contrário:

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

Há relatos de que esse valor não é 100% confiável nas compilações baseadas no Eclipse, embora eu pessoalmente não tenha encontrado um problema, portanto não posso dizer quanto de um problema realmente é.

Se você estiver usando o Android Studio, ou se estiver usando o Gradle na linha de comando, poderá adicionar suas próprias coisas BuildConfigou ajustar os tipos debuge releasebuild para ajudar a distinguir essas situações em tempo de execução.

A solução do Argumento ilegal é baseada no valor do android:debuggablesinalizador no manifesto. Se é assim que você deseja distinguir uma compilação "debug" de uma compilação "release", então, por definição, essa é a melhor solução. No entanto, lembre-se de que daqui para frente, a debuggablebandeira é realmente um conceito independente do que o Gradle / Android Studio considera uma compilação de "depuração". Qualquer tipo de construção pode optar por definir o debuggablesinalizador para qualquer valor que faça sentido para esse desenvolvedor e para esse tipo de construção.

CommonsWare
fonte
34
BuildConfigestá localizado no pacote do seu aplicativo, por exemplo:import com.mycompany.myapp.BuildConfig;
Chris Cirefice
10
devido a um bug no AndroiStudio isso não funciona mais, é sempre falsa, mesmo no modo de depuração
user387184
11
@ user387184: No Android Studio 1.2.2, recebo public static final boolean DEBUG = Boolean.parseBoolean("true");uma compilação de depuração. Enquanto que é uma maneira bizarra de conjunto DEBUGpara true, ele deve funcionar. Se você estiver vendo isso em uma das versões de teste 1.3.0 ou se tiver um caso de teste reproduzível para 1.2.2, registre um problema . Não vejo nenhum problema pendente relatando esse problema.
CommonsWare
2
Estou usando a v1.2.2 e o BuildConfig.DEBUG é sempre falso, então tentei a sugestão abaixo, que funciona para mim - tentarei a sua também - muito obrigado!
user387184
3
Como se vê, isso não funcionará ao usar uma biblioteca (sempre retorna true): stackoverflow.com/q/20176284/878126 . Gostaria de saber qual é a melhor alternativa
desenvolvedor Android
59

Tente o seguinte:

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

Kotlin:

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

É retirado do pacote postal aqui

Argumento ilegal
fonte
3
Esta resposta funcionará em todos os casos, independentemente do projeto da biblioteca ou do aplicativo.
Lavekush Agrawal
O que precisa ser importado para getApplicationInfo().flagsfuncionar?
A1m 28/02/19
11
ok ele simplesmente não funciona no contexto estático, consulte stackoverflow.com/questions/10641144/…
A1m 28/02/19
54

Sim, você não terá problemas ao usar:

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

A menos que você esteja importando a classe BuildConfig errada. Verifique se você está referenciando a classe BuildConfig do seu projeto, não de nenhuma das suas bibliotecas de dependência.

insira a descrição da imagem aqui

Vansuita Jr.
fonte
11
"A menos que você está importando errado a classe BuildConfig" ... Sim, ponto muito bom: D
Benjamin Piette
Obrigado! Este foi o problema no meu projeto, de alguma forma ele estava pegando BuildConfig do projeto de biblioteca (que é sempre o modo de lançamento até Android Studio 3 sai)
Amit Garg
36

Devido aos comentários mistos sobre BuildConfig.DEBUG , usei o seguinte para desativar crashlytics (e analytics) no modo de depuração:

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

Em seguida, no seu código, você detecta o ENABLE_CRASHLYTICSsinalizador da seguinte maneira:

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

use o mesmo conceito no seu aplicativo e renomeie ENABLE_CRASHLYTICSpara o que quiser. Eu gosto dessa abordagem porque posso ver o sinalizador na configuração e posso controlar o sinalizador.

Alguém algum lugar
fonte
Você não deve chamar Crashlytics e Answers separadamente. Basta usar: Fabric.with (this, new Crashlytics ()); para incluir Crashlytics e Answers.
precisa
11
Obrigado, @MikeBonnell, fiz a alteração do código no código de exemplo
Someone Somewhere
Não vejo como isso é diferente do uso de BuildConfig.DEBUG - se você definir apenas BuildConfig.ENABLE_CRASHLYTICS para suas compilações de depuração, BuildConfig.DEBUG e BuildConfig.ENABLE_CRASHLYTICS sempre terão o mesmo valor, certo?
K2col # 23/17
Eu acho que os desenvolvedores que estavam trabalhando em projetos de biblioteca tiveram problemas para detectar compilações de depuração / versão usando o BuildConfig.DEBUG. Pode ter havido um bug do Android Studio também envolvido ...
Someone Somewhere
13

Como alternativa, você pode diferenciar usando BuildConfig.BUILD_TYPE;

Se você estiver executando o debug build, BuildConfig.BUILD_TYPE.equals("debug");retornará true. E para o release build, BuildConfig.BUILD_TYPE.equals("release");retorna verdadeiro.

Prudhvi
fonte
11
Essa é a resposta correta. Retorna "release", enquanto BuildConfig.DEBUG sempre retorna true.
Minas Mina
6

Estou usando esta solução para descobrir que meu aplicativo está sendo executado na versão de depuração.

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}
Giedrius Šlikas
fonte
11
Por favor, adicione uma descrição à sua resposta. Seria mais útil do que apenas um pedaço de código.
Mathews Ensolarado
Eu estava usando if (BuildConfig.DEBUG) {} um módulo gradle dependente que não tinha (é claro) NO REFERENCE ao arquivo build.gradle do aplicativo - isso fazia com que o modo de depuração fosse reconhecido de maneira incorreta. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }CORRIGIDO o problema. Graças
kosiara - Bartosz Kosarzycki
esta é a resposta real, basta alterar "Debug" para "debug"
Jetwiz
1

Certifique-se de importar a classe BuildConfig correta. E sim, você não terá problemas ao usar:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
Salim Lachdhaf
fonte
Isso simplesmente funciona bem! Obrigado!
sud007