ADT何时将BuildConfig.DEBUG设置为false?

时间:2012-03-24 21:38:10

标签: android eclipse adt

在最新版本的ADT(r17)中,添加了生成的常量BuildConfig.DEBUG,它是根据构建类型设置的。我遇到的问题是它永远不会设置为false,我希望它在执行“Android工具 - >导出签名的应用程序包”时会改变,但它不适合我。

那么如何更改构建类型?

  

添加了一项功能,允许您仅在调试模式下运行某些代码。   Builds现在生成一个名为BuildConfig的类,其中包含一个DEBUG   根据您的构建类型自动设置的常量。您   可以检查代码中的(BuildConfig.DEBUG)常量来运行   仅调试功能

12 个答案:

答案 0 :(得分:56)

目前,您可以通过禁用“自动构建”,清理项目然后通过“Android工具 - >导出签名的应用程序包”导出来获得正确的行为。运行应用程序时BuildConfig.DEBUG应为false。

答案 1 :(得分:36)

使用 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
}

我建议在切换调试/发布版本后清理。

答案 2 :(得分:33)

它无法正常工作:

问题27940:对于导出的应用程序包,BuildConfig.DEBUG为“true”

令人失望的是他们有时会发布错误的功能。

答案 3 :(得分:10)

它确实有效,但请注意,即使导出签名文件,代码文件也不会更改。导出进程会将此变量的值更改为false,这可能会给您一个错误的印象,即它无效。 我用

之类的日志语句对此进行了测试
if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

测试时,我的Log语句不再产生任何输出。

答案 4 :(得分:8)

检查imports,有时 BuildConfig 是从任意类库中无意中导入的。例如:

import io.fabric.sdk.android.BuildConfig;

在这种情况下, BuildConfig.DEBUG 将始终返回 false ;

import com.yourpackagename.BuildConfig;

在这种情况下, BuildConfig.DEBUG 将返回真实版本

p.s我只是从我的答案中复制这个:BuildConfig.DEBUG always false when building library projects with gradle

答案 5 :(得分:5)

来自Preparing for Release

  

关闭日志记录和调试

     

确保停用日志记录并禁用调试选项   在构建应用程序以进行发布之前。你可以停用   通过删除源文件中对Log方法的调用来进行日志记录。您可以   通过从中删除android:debuggable属性来禁用调试   清单文件中的标记,或通过设置   在清单文件中android:debuggable属性为false。也,   删除在您的。中创建的任何日志文件或静态测试文件   项目

     

此外,您应该删除添加到您的所有调试跟踪调用   代码,例如startMethodTracing()和stopMethodTracing()方法   调用

更多信息请点击链接。

答案 6 :(得分:5)

我的解决方案:

  1. 项目 - >自动构建
  2. 项目 - >
  3. 项目 - >构建
  4. 项目导出Android应用程序
  5. 它在r20中起作用

答案 7 :(得分: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设置,而是作为承包文件维护,这些文件在开发人员之间共享。

答案 8 :(得分:1)

据我所知(Android issue 22241

,无效

我在项目上遇到了一些麻烦(使用Eclipse),在导出我的项目的签名APK时,该常量未设置为true :(

希望能听到它有效吗

答案 9 :(得分: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
        );
}

}

答案 10 :(得分:0)

我发现一些奇怪的行为与BuildConfig中的值设置为最终值有关。这可能与您的问题有关。

简单的解释是,在Proguard运行之前最初设置默认值,然后在Proguard运行之后,使用正确的值重新生成BuildConfig文件。但是,Proguard已经针对这一点优化了您的代码,并且您遇到了问题。

这是我针对Gradle创建的错误。 https://code.google.com/p/android/issues/detail?id=182449

答案 11 :(得分:0)

您是否会检查您的应用级别 build.gradle 是否启用 debuggable true 以进行发布

buildTypes {
    release {
        debuggable true
        }
     }

相反,您保持错误或注释该行

buildTypes {
    release {
        //debuggable true
        }
     }

现在你会得到 BuildConfig.DEBUG false for release build