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

在最新版本的 ADT (r17)中,添加了一个根据构建类型设置的生成常量 BuildConfig.DEBUG。我的问题是它从来没有被设置为 false,我希望它在“ Android Tools-> Export Signed Application Package”时会改变,但是对我来说没有。

那么如何更改构建类型呢?

增加了一个特性,允许您只在调试模式下运行一些代码。 构建现在生成一个名为 BuildConfig 的类,其中包含一个 DEBUG 根据生成类型自动设置的常量 可以检查代码中要运行的(BuildConfig.DEBUG)常量 仅用于调试的函数

68599 次浏览

根据我的理解,它不能正常工作(Android 问题22241)

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

不过我很想听听它的效果

来自 准备释放:

关闭日志记录和调试

Make sure you deactivate logging and disable the debugging option 在您构建要发布的应用程序之前。您可以停用 通过删除对源文件中的 Log 方法的调用来进行日志记录 通过从中删除 android: debug 属性来禁用调试 清单文件中的标记,或通过设置 可调试属性在清单文件中设置为 false, 中创建的任何日志文件或静态测试文件 项目。

此外,还应删除添加到 代码,例如 startMethodTraces ()和 stopMethodTraces ()方法 电话。

更多信息请点击这个链接。

目前,您可以通过禁用“ Build Automated”,清理项目,然后通过“ Android Tools-> Export Signed Application Package”导出来获得正确的行为。当您运行应用程序时,BuildConfig.DEBUG应该为 false。

它不能正常工作:

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

It's disappointing that they sometimes release buggy features.

我的解决办法是:

  1. Project-> 自动生成
  2. 工程项目-> 清洁
  3. 工程项目-> 建造
  4. ProjectExportAndroid 应用程序

这是工作用 r20

It does work, but note that the code file never changes, even when exporting the signed file. The export 程序 changes the value of this variable to false, which might give you the false impression that it is not working. 我使用如下日志语句对此进行了测试

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

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

一个好的方法是创建自己的类:

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
);
}


}

With 日食, I always disable "Build Automatically" option before Exporting the app in release. Then I clean the project and export. Otherwise it starts compiling in debug mode, and then the value of BuildConfig.DEBUG may be wrong.

使用 安卓工作室,我只需在 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
}

I recommand to clean after switching debug/release build.

我想提出一个简单的解决办法,如果你使用前卫在 APK 出口。

Proguard provides a way to remove calls to specific functions in release mode. Any calls for debugging logs can be removed with following setting in 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

有了这个,您就不需要关心任何不必要的 String 计算传递到@Jeremyfa 所指向的调试日志。这些计算在发布版本中被删除。

So the workaround for BuildConfig.DEBUG uses the same feature of proguard like following.

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 设置,而是作为提交文件进行维护,这些文件在开发人员之间共享。

我见过一些奇怪的行为,它们与 BuildConfig 中的值设置为最终值时有关。这可能和你的问题有关。

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

这里是一个错误,我创建对 Gradle.https://code.google.com/p/android/issues/detail?id=182449

Check for imports, sometimes BuildConfig is imported from any class of library unintentionally. For example:

import io.fabric.sdk.android.BuildConfig;

在这种情况下,BuildConfig.DEBUG总是返回 假的;

import com.yourpackagename.BuildConfig;

在这种情况下,BuildConfig.DEBUG将返回您的 real build variant

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

你会检查你的应用程序级别 build.gradle debuggable true的发布版本

buildTypes {
release {
debuggable true
}
}

而是保留 false 或注释该行

buildTypes {
release {
//debuggable true
}
}

现在您将获得 BuildConfig.DEBUG false 作为发布版本