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

在最新版本的ADT(r17)中,生成的常量被添加了根据构buildtypes设置的BuildConfig.DEBUG 。 我的问题是,它从来没有设置为false,我希望它做“Android工具 – >导出签名的应用程序包”,但它不适合我。

那么如何改变构buildtypes呢?

增加了一个function,只允许您在debugging模式下运行一些代码。 Builds现在生成一个名为BuildConfig的类,其中包含一个根据您的构buildtypes自动设置的DEBUG常量。 您可以检查代码中的(BuildConfig.DEBUG)常量以运行仅debuggingfunction

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

它不能正常工作:

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

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

Eclipse中 ,我始终在发布中导出应用程序之前禁用“自动构build”选项。 然后我清理项目并导出。 否则它开始以debugging模式编译,然后BuildConfig.DEBUG的值可能是错误的。

使用Android Studio ,我只需在build.gradle中添加自己的自定义variables:

 buildTypes { debug { buildConfigField "Boolean", "DEBUG_MODE", "true" } release { buildConfigField "Boolean", "DEBUG_MODE", "false" } } 

当我构build项目时,BuildConfig.java如下生成:

 public final class BuildConfig { // Fields from build type: debug public static final Boolean DEBUG_MODE = true; } 

然后在我的代码中,我可以使用:

 if (BuildConfig.DEBUG_MODE) { // do something } 

我build议在切换debugging/发布版本之后进行清理。

它可以工作,但是请注意,即使导出签名文件,代码文件也不会更改。 导出过程将此variables的值更改为false,这可能会给您错误的印象,即它不起作用。 我用类似的日志语句testing了这个

 if (com.mypackage.BuildConfig.DEBUG) Log.d(TAG, location.getProvider() + " location changed"); 

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

我的解决scheme:

  1. 项目 – >自动生成
  2. 项目 – >清洁
  3. 项目 – >构build
  4. 项目导出Android应用程序

这是在r20工作

从准备发布 :

closures日志和debugging

确保在构build要发布的应用程序之前停用日志logging并禁用debugging选项。 您可以通过删除对源文件中的日志方法的调用来停用日志logging。 您可以通过从清单文件中的标记删除android:debuggable属性或通过在清单文件中将android:debuggable属性设置为false来禁用debugging。 另外,删除在您的项目中创build的任何日志文件或静态testing文件。

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

更多信息在链接之后。

我想提出一个简单的解决方法,如果您在APK导出期间使用proguard。

Proguard提供了一种在发行模式中移除对特定function的呼叫的方法。 任何debugging日志的调用都可以通过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 

有了这个,你不需要关心任何不必要的string计算传递给@Jeremyfa指向的debugging日志。 计算只是在发布版本中删除。

因此,BuildConfig.DEBUG的解决方法使用proguard的相同function,如下所示。

 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选项,因为这不取决于构build器的单独IDE设置,而是作为提交文件维护,这些文件在开发人员之间共享。

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

 import io.fabric.sdk.android.BuildConfig; 

在这种情况下, BuildConfig.DEBUG将总是返回false ;

 import com.yourpackagename.BuildConfig; 

在这种情况下, BuildConfig.DEBUG将会返回你真正的构build变体

PS我只是复制这个从我的答案在这里: BuildConfig.DEBUG总是假的时候用gradle构build库项目

根据我的理解,无法正常工作( Android问题22241 )

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

很想听到它的作品,虽然

创build自己的class级的一个好方法是:

 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创build的一个bug。 https://code.google.com/p/android/issues/detail?id=182449