BuildConfig.DEBUG
,它根据构建类型进行设置。我的问题是它从未被设置为 false,我期望在执行“Android 工具->导出签名应用程序包”时会发生变化,但对我来说并没有发生。那么如何更改构建类型呢?
添加了一个功能,允许您仅在调试模式下运行某些代码。现在构建会生成一个名为 BuildConfig 的类,其中包含一个 DEBUG 常量,该常量根据您的构建类型自动设置。您可以在代码中检查 (BuildConfig.DEBUG) 常量以运行仅限于调试的函数。
BuildConfig.DEBUG
,它根据构建类型进行设置。我的问题是它从未被设置为 false,我期望在执行“Android 工具->导出签名应用程序包”时会发生变化,但对我来说并没有发生。目前,您可以通过禁用“自动构建”,清理项目,然后通过“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
}
我建议在切换调试/发布版本后进行清理。
imports
,有时会无意间从库的任何类导入BuildConfig。 例如:import io.fabric.sdk.android.BuildConfig;
import com.yourpackagename.BuildConfig;
附言:我只是从这里复制了答案:在使用Gradle构建库项目时,BuildConfig.DEBUG始终为false
android.support.compat
意外导入的。我想这是另一个理由,只需使用不同的名称定义自己的字段。 - arekolek它确实起作用,但请注意代码文件从未更改,即使在导出签名文件时也是如此。 导出过程将此变量的值更改为 false,这可能会让您产生错误的印象,认为它没有起作用。 我使用类似以下的日志记录语句进行了测试
if (com.mypackage.BuildConfig.DEBUG)
Log.d(TAG, location.getProvider() + " location changed");
测试时,我的Log语句不再产生任何输出。
来自发布准备:
关闭日志记录和调试
在构建应用程序发布版本之前,请确保停用日志记录并禁用调试选项。您可以通过从源文件中删除对Log方法的调用来停用日志记录。您可以通过从清单文件中的 标签中删除android:debuggable属性,或在清单文件中将android:debuggable属性设置为false来禁用调试。此外,请删除项目中创建的任何日志文件或静态测试文件。
另外,您应该删除添加到代码中的所有调试跟踪调用,例如startMethodTracing()和stopMethodTracing()方法调用。
更多信息请查看链接。
如果您在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();
}
我更倾向于使用这种方法而不是禁用自动构建
选项,因为这不依赖于构建者个人的IDE设置,而是作为提交的文件进行维护,这些文件在开发人员之间共享。
您是否检查了应用程序级别的build.gradle
文件,将debuggable true
更改为发布版本?
buildTypes {
release {
debuggable true
}
}
buildTypes {
release {
//debuggable true
}
}
据我所知,它不能正常工作(Android问题22241)
在一个项目中(使用Eclipse工作),我遇到了一些麻烦,当导出我的项目的已签名APK时,常量没有设置为true :(
虽然如此,我很想听听它是如何工作的