【问题标题】:When does ADT set BuildConfig.DEBUG to false?ADT 何时将 BuildConfig.DEBUG 设置为 false?
【发布时间】:2012-04-08 23:52:41
【问题描述】:

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

那么如何更改构建类型?

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

【问题讨论】:

  • BuildConfig.java 由 Android 构建工具自动生成,并放在 gen 文件夹中。签名的 APK 应该有 BuildConfig.DEBUG = false。这对你来说应该不是问题。您不必手动触摸该文件...
  • 如果你使用 gradle 来释放这个标志是 100% 可靠的。因此,当您执行 ./gradlew assembleDebug 时,它是 true,而当您执行 assembleRelease 时,它​​是 false。

标签: android eclipse adt


【解决方案1】:

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

【讨论】:

  • 也坏了。其结果是显示该标志应省略的所有 Log.d 消息。附言。在哪里提交错误报告?
  • 我的总是假的,即使在调试时也是如此
【解决方案2】:

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

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

【讨论】:

  • 如果你使用proguard,这个解决方案是最好的,因为它会生成一个带有字面值的常量,所以你的调试代码将在发布模式下完全从二进制文件中删除。
【解决方案3】:

它不能正常工作:

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

令人失望的是,他们有时会发布有缺陷的功能。

【讨论】:

  • 如果您想解决这个问题,请转到上述问题的链接并加星标。
【解决方案4】:

检查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

【讨论】:

  • 是的,对我来说,它是从android.support.compat 意外导入的。我想这是用不同名称定义自己的字段的另一个原因。
  • 我的项目不允许我从我的包名导入。 Artic Fox IDE 非常糟糕
【解决方案5】:

它确实有效,但请注意代码文件永远不会更改,即使在导出签名文件时也是如此。导出过程 将此变量的值更改为 false,这可能会给您一种错误的印象,即它不工作。 我用像

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

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

【讨论】:

  • 我将 BuildConfig.DEBUG 的实例更改为 com.mypackage.BuildConfig.DEBUG,然后重新运行应用程序......它仍然一直返回 true。也许我误解了你的建议。
  • 我的意思是代码不会改变。但是,com.mypackage.BuildConfig.DEBUG 将在编译后设置为 False。尝试上面的测试日志语句(选择任意字符串进行日志记录),执行导出然后运行它。查看 adb 是否显示日志记录语句。我敢打赌 adb 不会报告该日志记录语句,这表明 DEUBUG 已设置为 false。
  • 我不确定我是否知道您对“代码”的含义...但是,我会说在导出 APK 之前进行清理(如已接受的答案中所建议)使 BuildConfig .DEBUG 和 com.mypackage.BuildConfig.DEBUG 按预期报告错误。
  • 你明白了。这是预期的行为。
  • 如果你真的使用“com.mypackage.BuildConfig.DEBUG”,它不会工作。包与您的应用相关。
【解决方案6】:

来自Preparing for Release

关闭日志记录和调试

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

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

更多信息请点击链接。

【讨论】:

【解决方案7】:

我的解决方案:

  1. 项目 -> 自动构建
  2. 项目->清理
  3. 项目 -> 构建
  4. 项目导出 Android 应用程序

它在 r20 中工作

【讨论】:

  • 这对我有用(我猜是使用最新的 ADT)。也许清洁解决了它,不确定。
【解决方案8】:

如果您在 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 设置,而是作为开发者共享的提交文件进行维护。

【讨论】:

    【解决方案9】:

    据我了解无法正常工作 (Android issue 22241)

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

    希望听到它的工作原理

    【讨论】:

    • 它应该已经在 r17 中修复了,它在错误跟踪器中标记为这样。
    • 实际上库在导出时并没有在 ADT 中以发布模式编译(在 Ant 中工作)。我更新了code.google.com/p/android/issues/detail?id=27940
    • @Xav 感谢您的调查,我现在保证不再向您发送垃圾邮件。这实际上是我遇到问题的主要项目(没有查看依赖库)。如果我可以创建一个具体的测试用例,我会将它发布到同一问题下的错误跟踪器。
    【解决方案10】:

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

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

    【讨论】:

    • 这个方法的问题是,当 DEBUG 为 false 时,java 仍然会计算每个 String 以将其传递给您的自定义类。 if (DEBUG) Log.d(...) 不太优雅但更高效。
    【解决方案11】:

    当 BuildConfig 中的值设置为其最终值时,我看到了一些奇怪的行为。这可能与您的问题有关。

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

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

    【讨论】:

      【解决方案12】:

      你会检查你的应用级别build.gradle启用debuggable true发布

      buildTypes {
          release {
              debuggable true
              }
           }
      

      相反,您保留错误或评论该行

      buildTypes {
          release {
              //debuggable true
              }
           }
      

      现在你会得到 BuildConfig.DEBUG false 用于发布构建

      【讨论】:

        猜你喜欢
        • 2019-12-26
        • 2016-07-20
        • 2013-12-11
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多