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


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.


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


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


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.


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.


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
}

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

Isso simplesmente funciona bem! Obrigado!
sud007
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.