ADT는 언제 BuildConfig.DEBUG를 false로 설정합니까?


110

최신 버전의 ADT (r17) BuildConfig.DEBUG에서는 빌드 유형에 따라 설정 되는 생성 된 상수가 추가되었습니다 . 내가 가진 문제는 그것이 결코 거짓으로 설정되지 않았다는 것입니다. "Android 도구-> 서명 된 응용 프로그램 패키지 내보내기"를 수행 할 때 변경 될 것으로 예상했지만 저에게는 그렇지 않았습니다.

그렇다면 빌드 유형을 어떻게 변경합니까?

디버그 모드에서만 일부 코드를 실행할 수있는 기능이 추가되었습니다. 이제 빌드는 빌드 유형에 따라 자동으로 설정되는 DEBUG 상수를 포함하는 BuildConfig라는 클래스를 생성합니다. 코드에서 (BuildConfig.DEBUG) 상수를 확인하여 디버그 전용 함수를 실행할 수 있습니다.


2
BuildConfig.java는 Android 빌드 도구에 의해 자동으로 생성되며 gen 폴더에 배치됩니다. 서명 된 APK는 BuildConfig.DEBUG = false 여야합니다. 그것은 당신에게 문제가되지 않아야합니다. 당신은 ... 수동으로 해당 파일을 터치 할 필요가 없습니다
IgorGanapolsky

1
gradle을 사용하여이 플래그를 해제하면 100 % 신뢰할 수 있습니다. 따라서 ./gradlew assembleDebug를 수행하면 true이고 assembleRelease를 수행하면 false입니다.
slott dec

답변:


56

현재 "자동으로 빌드"를 비활성화하고 프로젝트를 정리 한 다음 "Android 도구-> 서명 된 애플리케이션 패키지 내보내기"를 통해 내 보내면 올바른 동작을 얻을 수 있습니다. 응용 프로그램을 실행할 때 BuildConfig.DEBUG거짓이어야합니다.


너무 부서졌습니다. 이 플래그에 의해 생략되어야하는 모든 Log.d 메시지를 표시하는 결과가 있습니다. 추신. 버그 신고는 어디에?
tomi

내 것은 디버깅 할 때도 항상 거짓이다
behelit

39

Eclipse를 사용하면 릴리스에서 앱을 내보내기 전에 항상 "자동 빌드"옵션을 비활성화합니다. 그런 다음 프로젝트를 정리하고 내 보냅니다. 그렇지 않으면 디버그 모드에서 컴파일을 시작하고 BuildConfig.DEBUG의 값이 잘못되었을 수 있습니다.

Android Studio를 사용 하여 build.gradle에 고유 한 맞춤 변수를 추가하기 만하면됩니다.

buildTypes {
    debug {
        buildConfigField "Boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "Boolean", "DEBUG_MODE", "false"
    }
}

프로젝트를 빌드 할 때 BuildConfig.java가 다음과 같이 생성됩니다.

public final class BuildConfig {
  // Fields from build type: debug
  public static final Boolean DEBUG_MODE = true;
}

그런 다음 내 코드에서 다음을 사용할 수 있습니다.

if (BuildConfig.DEBUG_MODE) {
    // do something
}

디버그 / 릴리스 빌드를 전환 한 후 청소하는 것이 좋습니다.


1
이 솔루션은 리터럴 값으로 상수를 생성하므로 릴리스 모드에서 디버그 코드가 바이너리에서 완전히 제거되므로 proguard를 사용하는 경우 가장 좋습니다.
Victor Laerte

33

제대로 작동하지 않습니다.

문제 27940 : 내 보낸 응용 프로그램 패키지에 대해 BuildConfig.DEBUG가 "true"

때때로 버그가있는 기능을 릴리스하는 것은 실망 스럽습니다.


9
위에서 언급 한 문제에 대한 링크로 이동하여이 문제를 해결하려면 '별표 표시'하십시오.
Guy

11

작동하지만 코드 파일은 서명 된 파일을 내보낼 때도 변경되지 않습니다. 내보내기 프로세스 는이 변수의 값을 false로 변경하여 작동하지 않는다는 잘못된 인상을 줄 수 있습니다. 다음과 같은 로깅 문으로 이것을 테스트했습니다.

if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

테스트 할 때 내 로그 문이 더 이상 출력을 생성하지 않습니다.


1
정확히 뭘 한거야?
pbhowmick 2013-06-11

2
BuildConfig.DEBUG의 인스턴스를 com.mypackage.BuildConfig.DEBUG로 변경 한 다음 앱을 다시 실행했는데 ... 항상 true를 반환했습니다. 당신의 제안을 오해했을 수도 있습니다.
Chris Rae

1
내가 말하는 것은 코드가 변경되지 않는다는 것입니다. 그러나 com.mypackage.BuildConfig.DEBUG는 컴파일 후 False로 설정됩니다. 위와 같이 테스트 로깅 문을 시도하고 (기록 할 임의 문자열 선택) 내보내기를 수행 한 다음 실행합니다. adb가 로깅 문을 표시하는지 확인합니다. 나는 adb가 DEUBUG가 false로 설정되었음을 알리는 로깅 진술을보고하지 않을 것이라는 내기를 할 것입니다.
pbhowmick

1
"코드"에 대해 무엇을 의미하는지 잘 모르겠습니다.하지만 APK를 내보내기 전에 정리하면 (허용 된 답변에서 제안한대로) BuildConfig.DEBUG와 com.mypackage.BuildConfig가 모두 만들어 졌다고 말할 것입니다. .DEBUG는 예상대로 false를보고합니다.
Chris Rae

맞아요. 그것이 예상되는 동작입니다.
pbhowmick 2013-06-13

10

imports때때로 BuildConfig 가 의도하지 않게 라이브러리의 모든 클래스에서 가져 오는지 확인하십시오 . 예를 들면 :

import io.fabric.sdk.android.BuildConfig;

이 경우 BuildConfig.DEBUG 는 항상 false를 반환합니다 .

import com.yourpackagename.BuildConfig;

이 경우 BuildConfig.DEBUG실제 빌드 변형을 반환합니다 .

추신 나는 내 대답에서 이것을 복사합니다 : BuildConfig.DEBUG는 gradle로 라이브러리 프로젝트를 빌드 할 때 항상 false입니다.


1
네, 실수로에서 가져 왔습니다 android.support.compat. 다른 이름으로 자신의 필드를 정의하는 또 다른 이유라고 생각합니다.
arekolek apr

5

에서 출시 준비 :

로깅 및 디버깅 끄기

릴리스 용 애플리케이션을 빌드하기 전에 로깅을 비활성화하고 디버깅 옵션을 비활성화해야합니다. 소스 파일에서 Log 메서드에 대한 호출을 제거하여 로깅을 비활성화 할 수 있습니다. 매니페스트 파일의 태그에서 android : debuggable 속성을 제거하거나 매니페스트 파일에서 android : debuggable 속성을 false로 설정하여 디버깅을 비활성화 할 수 있습니다. 또한 프로젝트에서 생성 된 모든 로그 파일 또는 정적 테스트 파일을 제거합니다.

또한 startMethodTracing () 및 stopMethodTracing () 메서드 호출과 같이 코드에 추가 한 모든 디버그 추적 호출을 제거해야합니다.

더 많은 정보는 링크를 따라갑니다.


1
이 프로세스는 이제 빌드 시간에 자동으로 발생한다고 생각했습니다. developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky 2013

컴파일 타임 오류 발생 :«디버그 모드를 하드 코딩하지 마십시오. 생략하면 디버그 및 릴리스 빌드가 자동으로 하나를 할당 할 수 있습니다.»
Nikita Bosik 2015

5

나를위한 솔루션 :

  1. 프로젝트-> 자동 빌드
  2. 프로젝트-> 청소
  3. 프로젝트-> 빌드
  4. Project Export Android 애플리케이션

r20에서 작동합니다.


1
이것은 방금 저에게 효과적이었습니다 (내가 추측하는 최신 ADT 사용). 청소로 문제가 해결되었을 수도 있습니다.
Jonny

3

APK 내보내기 중에 proguard를 사용하는 경우 간단한 해결 방법을 제안하고 싶습니다.

Proguard는 릴리스 모드에서 특정 기능에 대한 호출을 제거하는 방법을 제공합니다. 에서 다음 설정을 사용하여 디버깅 로그에 대한 모든 호출을 제거 할 수 있습니다 proguard-project.txt.

# Remove debug logs
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

그리고 project.properties.

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

이를 통해 @Jeremyfa가 가리키는 디버그 로그로 전달되는 불필요한 문자열 계산에 대해 걱정할 필요가 없습니다. 릴리스 빌드에서 계산이 제거되었습니다.

따라서 BuildConfig.DEBUG의 해결 방법은 다음과 같은 proguard의 동일한 기능을 사용합니다.

public class DebugConfig {

    private static boolean debug = false;

    static {
        setDebug(); // This line will be removed by proguard in release.
    }

    private static void setDebug() {
        debug = true;
    }

    public static boolean isDebug() {
        return debug;
    }
}

그리고 proguard-project.txt.

-assumenosideeffects class com.neofect.rapael.client.DebugConfig {
    private static *** setDebug();
}

이것은 Build Automatically빌더의 개별 IDE 설정에 의존하지 않고 개발자간에 공유되는 커밋 된 파일로 유지되기 때문에 옵션 을 비활성화하는 데 사용하는 것을 선호합니다 .


1

내가 이해하는 한 제대로 작동하지 않음 ( Android 문제 22241 )

내 프로젝트의 서명 된 APK를 내보낼 때 상수가 true로 설정되지 않은 프로젝트 (Eclipse로 작업)에 문제가있었습니다.

그래도 작동하는 것을 듣고 싶습니다.


1
r17에서 수정 되었어야하는데, 버그 추적기에 표시되어 있습니다.
smith324

1
실제로 libs는 내보낼 때 ADT의 릴리스 모드에서 컴파일되지 않습니다 (Ant에서 작동). code.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet을

1
@Xav를 조사해 주셔서 감사합니다. 이제 스팸 발송을 중단하겠습니다. 실제로 문제가있는 주요 프로젝트였습니다 (종속 라이브러리를 보지 않음). 구체적인 테스트 케이스를 만들 수 있다면 같은 문제로 버그 추적기에 게시하겠습니다.
smith324

1

좋은 방법은 자신 만의 클래스를 만드는 것입니다.

public class Log {

public static void d(String message) {
    if (BuildConfig.DEBUG)
        android.util.Log.d(
            "[" + (new Exception().getStackTrace()[1].getClassName()) + "]",
            "{" + (new Exception().getStackTrace()[1].getMethodName()) + "} "
            + message
        );
}

}

12
이 메소드의 문제점은 DEBUG가 false 일 때 이벤트가 발생하면 java는 여전히 각 문자열을 계산하여 사용자 정의 클래스에 전달한다는 것입니다. if (DEBUG) Log.d (...)는 덜 우아하지만 더 효율적입니다.
Jeremyfa

0

BuildConfig의 값이 최종 값으로 설정 될 때와 관련된 이상한 동작을 보았습니다. 이것은 귀하의 문제와 관련이있을 수 있습니다.

간단한 설명은 Proguard가 실행되기 전에 초기에 기본값이 설정되고 Proguard가 실행 된 후 BuildConfig 파일이 적절한 값으로 다시 생성된다는 것입니다. 그러나 Proguard는 이미이 시점에서 코드를 최적화했으며 문제가 있습니다.

다음은 Gradle에 대해 만든 버그입니다. https://code.google.com/p/android/issues/detail?id=182449

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