릴리스 또는 디버그 모드인지 어떻게 알 수 있습니까?


답변:


770

가장 간단하고 최상의 장기 솔루션은을 사용하는 것 BuildConfig.DEBUG입니다. 이는 디버그 빌드에 대한 boolean값입니다 true. false그렇지 않으면 다음과 같습니다.

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

개인적으로 문제가 발생하지 않았지만이 문제가 Eclipse 기반 빌드에서 100 % 신뢰할 수 없다는보고가 있었으므로 실제로 문제의 정도를 말할 수는 없습니다.

Android Studio를 사용 중이거나 명령 행에서 Gradle을 사용중인 경우 런타임시 이러한 상황을 구별하는 데 도움이되도록 빌드 및 빌드 유형에 자체 항목을 추가 BuildConfig하거나 조정할 수 있습니다.debugrelease

Illegal Argument의 솔루션 android:debuggable은 매니페스트 의 플래그 값을 기반으로합니다 . 이것이 "디버그"빌드와 "릴리스"빌드를 구별하려는 방법이라면 정의에 따르면 이것이 최상의 솔루션입니다. 그러나 앞으로 debuggable플래그는 Gradle / Android Studio가 "디버그"빌드로 간주하는 것과는 독립적 인 개념입니다. 모든 빌드 유형은 debuggable해당 개발자 및 해당 빌드 유형에 적합한 값으로 플래그 를 설정하도록 선택할 수 있습니다 .


34
BuildConfig예 :import com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
AndroiStudio의 버그로 인해 더 이상 작동하지 않습니다. 디버그 모드에서도 항상 거짓입니다
user387184

1
@ user387184 : Android Studio 1.2.2에서는 public static final boolean DEBUG = Boolean.parseBoolean("true");디버그 빌드를 얻 습니다. 이것이 기괴한 방법으로 설정 DEBUG되어 true있지만 작동해야합니다. 1.3.0 테스트 릴리스 중 하나에서이 문제가 발생하거나 1.2.2의 재현 가능한 테스트 사례가있는 경우 문제를 제기하십시오 . 이 문제를보고 한 해결되지 않은 문제가 없습니다.
CommonsWare

2
나는 v1.2.2를 사용하고 있으며 BuildConfig.DEBUG는 항상 거짓입니다. 그러면 아래의 제안을 시도해보십시오.
user387184

3
결과적으로 라이브러리를 사용할 때 항상 작동하지 않습니다 (항상 true를 반환) : stackoverflow.com/q/20176284/878126 . 최고의 대안이 무엇인지 궁금해
Android 개발자

59

다음을 시도하십시오 :

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

코 틀린 :

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

여기 에서 bundells 포스트에서 가져옵니다


3
이 답변은 라이브러리 프로젝트 또는 응용 프로그램 프로젝트에 관계없이 모든 경우에 작동합니다.
Lavekush Agrawal

getApplicationInfo().flags작동 하려면 무엇을 가져와야 합니까?
A1m

1
정적 인 상황에서는 작동하지 않습니다. stackoverflow.com/questions/10641144/…
A1m

54

예, 다음을 사용하는 데 아무런 문제가 없습니다.

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

잘못된 BuildConfig 클래스를 가져 오지 않는 한. 종속성 라이브러리가 아닌 프로젝트의 BuildConfig 클래스를 참조하고 있는지 확인하십시오.

여기에 이미지 설명을 입력하십시오


1
"잘못된 BuildConfig 클래스를 가져 오지 않는 한"... 예, 아주 좋은 지적 : D
Benjamin Piette

감사! 이것은 내 프로젝트의 문제였습니다. 어쨌든 라이브러리 프로젝트의 BuildConfig (Android Studio 3가 나올 때까지 항상 릴리스 모드입니다)를 선택했습니다.
Amit Garg

36

에 대한 혼합 의견으로 인해 BuildConfig.DEBUG다음을 사용하여 디버그 모드에서 crashlytics (및 분석)를 비활성화했습니다.

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

그런 다음 코드에서 ENABLE_CRASHLYTICS다음과 같이 플래그 를 감지합니다 .

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

앱에서 동일한 개념을 사용하고 ENABLE_CRASHLYTICS원하는 이름 으로 바꿉니다 . 구성에서 플래그를 볼 수 있고 플래그를 제어 할 수 있기 때문에이 방법이 마음에 듭니다.


Crashlytics와 Answers를 별도로 호출해서는 안됩니다. 그냥 사용하십시오 : Fabric.with (this, new Crashlytics ()); Crashlytics 및 Answers를 포함합니다.
Mike Bonnell

1
감사합니다, @MikeBonnell, 코드를 예제 코드로 변경했습니다
Someone Somewhere

이것이 BuildConfig.DEBUG를 사용하는 것과 어떻게 다른지 알 수 없습니다. 디버그 빌드에 BuildConfig.ENABLE_CRASHLYTICS 만 설정하면 BuildConfig.DEBUG와 BuildConfig.ENABLE_CRASHLYTICS는 항상 동일한 값을 갖습니까?
k2col

개발자의 라이브러리 프로젝트 작업에서 BuildConfig.DEBUG를 사용하여 디버그 / 릴리스 빌드를 감지하는 데 문제가 있다고 생각합니다. 초기 Android Studio 버그도 관련되었을 수 있습니다.
누군가 어딘가에

13

또는 BuildConfig.BUILD_TYPE을 사용하여 차별화 할 수 있습니다 .

디버그 빌드를 실행하면 BuildConfig.BUILD_TYPE.equals("debug");true를 반환합니다. 그리고 릴리스 빌드의 BuildConfig.BUILD_TYPE.equals("release");경우 true를 리턴합니다.


1
이것이 정답입니다. Buildrelease.DEBUG는 항상을 반환하지만 "release"를 반환합니다 true.
Minas Mina

6

내 앱이 디버그 버전에서 실행되고 있음을 알기 위해이 솔루션을 사용하고 있습니다.

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

1
답변에 설명을 추가하십시오. 그것은 단지 코드 조각보다 더 도움이 될 것입니다.
Mathews Sunny

내가 사용하던 if (BuildConfig.DEBUG) {} 잘못된 방법으로 인식이 발생 디버그 모드 - (물론) 응용 프로그램의 build.gradle 파일 NO 참조를했다 종속 Gradle을 모듈. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }문제가 해결되었습니다. 감사합니다
kosiara-Bartosz Kosarzycki

이것은 실제 답변입니다. "Debug"를 "debug"로 변경하십시오
Jetwiz

1

올바른 BuildConfig 클래스를 가져오고 있는지 확인하십시오. 예, 다음을 사용하는 데 아무런 문제가 없습니다.

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

이것은 잘 작동합니다! 감사합니다!
sud007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.