ChatGPT解决这个技术问题 Extra ChatGPT

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

在最新版本的 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。

s
smith324

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


也坏了。其结果是显示该标志应省略的所有 Log.d 消息。附言。在哪里提交错误报告?
我的总是假的,即使在调试时
A
Arnaud SmartFun

使用 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,这个解决方案是最好的,因为它会生成一个带有字面值的常量,因此您的调试代码将在发布模式下从二进制文件中完全删除。
R
Randy Sugianto 'Yuku'

它不能正常工作:

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

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


如果您希望解决此问题,请转到上述问题的链接并“加星标”。
C
Community

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

import io.fabric.sdk.android.BuildConfig;

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

import com.yourpackagename.BuildConfig;

在这种情况下,BuildConfig.DEBUG 将返回您真正的构建变体。

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


是的,对我来说,它是从 android.support.compat 意外导入的。我想这是使用不同名称定义自己的字段的另一个原因。
我的项目不允许我从我的包名中导入。 Artic Fox IDE 漏洞百出
p
pbhowmick

它确实有效,但请注意代码文件永远不会更改,即使在导出签名文件时也是如此。导出过程将此变量的值更改为 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”,它将无法正常工作。该软件包与您的应用程序相关。
p
peter

Preparing for Release

关闭日志记录和调试 确保在构建应用程序以供发布之前停用日志记录并禁用调试选项。您可以通过删除源文件中对 Log 方法的调用来停用日志记录。您可以通过从清单文件中的标记中删除 android:debuggable 属性或通过在清单文件中将 android:debuggable 属性设置为 false 来禁用调试。此外,删除在您的项目中创建的任何日志文件或静态测试文件。此外,您应该删除添加到代码中的所有调试跟踪调用,例如 startMethodTracing() 和 stopMethodTracing() 方法调用。

更多信息在链接之后。


我认为这个过程现在在构建时自动发生:developer.android.com/tools/sdk/tools-notes.html
导致编译时错误:«避免硬编码调试模式;忽略它允许调试和发布版本自动分配一个»
e
e.shishkin

我的解决方案:

项目 -> 自动构建项目 -> 清理项目 -> 构建项目 导出 Android 应用程序

它适用于 r20


这对我有用(我猜是使用最新的 ADT)。也许清洁解决了它,不确定。
n
neokim

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


V
Vincent Mimoun-Prat

据我了解,不能正常工作 (Android issue 22241)

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

很想听到它的工作原理


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

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

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(...) 不那么优雅但更高效。
T
TALE

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

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

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


M
Mohd Qasim

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

buildTypes {
    release {
        debuggable true
        }
     }

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

buildTypes {
    release {
        //debuggable true
        }
     }

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