在最新版本的ADT(r17)中,添加了生成的常量BuildConfig.DEBUG
,它是根据构建类型设置的。我遇到的问题是它永远不会设置为false,我希望它在执行“Android工具 - >导出签名的应用程序包”时会改变,但它不适合我。
那么如何更改构建类型?
添加了一项功能,允许您仅在调试模式下运行某些代码。 Builds现在生成一个名为BuildConfig的类,其中包含一个DEBUG 根据您的构建类型自动设置的常量。您 可以检查代码中的(BuildConfig.DEBUG)常量来运行 仅调试功能
答案 0 :(得分:56)
目前,您可以通过禁用“自动构建”,清理项目然后通过“Android工具 - >导出签名的应用程序包”导出来获得正确的行为。运行应用程序时BuildConfig.DEBUG
应为false。
答案 1 :(得分:36)
使用 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
}
我建议在切换调试/发布版本后清理。
答案 2 :(得分:33)
答案 3 :(得分:10)
它确实有效,但请注意,即使导出签名文件,代码文件也不会更改。导出进程会将此变量的值更改为false,这可能会给您一个错误的印象,即它无效。 我用
之类的日志语句对此进行了测试if (com.mypackage.BuildConfig.DEBUG)
Log.d(TAG, location.getProvider() + " location changed");
测试时,我的Log语句不再产生任何输出。
答案 4 :(得分:8)
检查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
答案 5 :(得分:5)
关闭日志记录和调试
确保停用日志记录并禁用调试选项 在构建应用程序以进行发布之前。你可以停用 通过删除源文件中对Log方法的调用来进行日志记录。您可以 通过从中删除android:debuggable属性来禁用调试 清单文件中的标记,或通过设置 在清单文件中android:debuggable属性为false。也, 删除在您的。中创建的任何日志文件或静态测试文件 项目
此外,您应该删除添加到您的所有调试跟踪调用 代码,例如startMethodTracing()和stopMethodTracing()方法 调用
更多信息请点击链接。
答案 6 :(得分:5)
我的解决方案:
它在r20中起作用
答案 7 :(得分:3)
如果您在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设置,而是作为承包文件维护,这些文件在开发人员之间共享。
答案 8 :(得分:1)
答案 9 :(得分:1)
一个好方法是创建自己的类:
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
);
}
}
答案 10 :(得分:0)
我发现一些奇怪的行为与BuildConfig中的值设置为最终值有关。这可能与您的问题有关。
简单的解释是,在Proguard运行之前最初设置默认值,然后在Proguard运行之后,使用正确的值重新生成BuildConfig文件。但是,Proguard已经针对这一点优化了您的代码,并且您遇到了问题。
这是我针对Gradle创建的错误。 https://code.google.com/p/android/issues/detail?id=182449
答案 11 :(得分:0)
您是否会检查您的应用级别 build.gradle
是否启用 debuggable true
以进行发布
buildTypes {
release {
debuggable true
}
}
相反,您保持错误或注释该行
buildTypes {
release {
//debuggable true
}
}
现在你会得到 BuildConfig.DEBUG false for release build