在最新版本的 ADT (r17) 中,添加了根据构建类型设置的生成常量 BuildConfig.DEBUG
。我遇到的问题是它永远不会设置为 false,我希望它在执行“Android 工具 - > 导出签名的应用程序包”时会发生变化,但它对我来说没有。
那么如何更改构建类型呢?
添加了一项功能,允许您仅在调试模式下运行某些代码。构建现在会生成一个名为 BuildConfig 的类,其中包含一个根据您的构建类型自动设置的 DEBUG 常量。您可以检查代码中的 (BuildConfig.DEBUG) 常量以运行仅调试功能
目前,您可以通过禁用“自动构建”、清理项目然后通过“Android 工具 -> 导出签名的应用程序包”导出来获得正确的行为。当您运行应用程序时,BuildConfig.DEBUG
应该是 false。
使用 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
}
我建议在切换调试/发布版本后进行清理。
它不能正常工作:
问题 27940:对于导出的应用程序包,BuildConfig.DEBUG 为“true”
令人失望的是,他们有时会发布错误的功能。
检查 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
意外导入的。我想这是使用不同名称定义自己的字段的另一个原因。
它确实有效,但请注意代码文件永远不会更改,即使在导出签名文件时也是如此。导出过程将此变量的值更改为 false,这可能会给您一种错误的印象,即它不工作。我用像这样的日志语句测试了这个
if (com.mypackage.BuildConfig.DEBUG)
Log.d(TAG, location.getProvider() + " location changed");
测试时,我的 Log 语句不再产生任何输出。
关闭日志记录和调试 确保在构建应用程序以供发布之前停用日志记录并禁用调试选项。您可以通过删除源文件中对 Log 方法的调用来停用日志记录。您可以通过从清单文件中的标记中删除 android:debuggable 属性或通过在清单文件中将 android:debuggable 属性设置为 false 来禁用调试。此外,删除在您的项目中创建的任何日志文件或静态测试文件。此外,您应该删除添加到代码中的所有调试跟踪调用,例如 startMethodTracing() 和 stopMethodTracing() 方法调用。
更多信息在链接之后。
我的解决方案:
项目 -> 自动构建项目 -> 清理项目 -> 构建项目 导出 Android 应用程序
它适用于 r20
如果您在 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 设置,而是作为开发人员共享的提交文件进行维护。
据我了解,不能正常工作 (Android issue 22241)
我在一个项目(使用 Eclipse)上遇到了一些麻烦,在导出我的项目的签名 APK 时,该常量没有设置为 true :(
很想听到它的工作原理
一个好方法是创建自己的类:
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
);
}
}
当 BuildConfig 中的值设置为其最终值时,我看到了一些奇怪的行为。这可能与您的问题有关。
简单的解释是在 Proguard 运行之前首先设置默认值,然后在 Proguard 运行之后,使用正确的值重新生成 BuildConfig 文件。但是,此时 Proguard 已经优化了您的代码,但您遇到了问题。
这是我针对 Gradle 创建的一个错误。 https://code.google.com/p/android/issues/detail?id=182449
你会检查你的应用程序级别 build.gradle
启用 debuggable true
发布吗
buildTypes {
release {
debuggable true
}
}
相反,您保留错误或评论该行
buildTypes {
release {
//debuggable true
}
}
现在你会得到 BuildConfig.DEBUG false 用于发布构建