2012-03-24 76 views
96

在最新版本的ADT(r17)中,生成的常量增加了BuildConfig.DEBUG,该值是根据构建类型设置的。我遇到的问题是,它从来没有设置为false,我希望它在执行“Android工具 - >导出签名的应用程序包”时发生变化,但它不适用于我。ADT何时将BuildConfig.DEBUG设置为false?

那么如何更改构建类型?

Added a feature that allows you to run some code only in debug mode. Builds now generate a class called BuildConfig containing a DEBUG constant that is automatically set according to your build type. You can check the (BuildConfig.DEBUG) constant in your code to run debug-only functions

+2

BuildConfig.java构建工具,并放置到根文件夹。已签名的APK应该具有BuildConfig.DEBUG = false。它不应该是你的问题。您不应该手动触摸该文件... – 2013-11-27 19:27:11

+1

如果使用gradle释放此标志是100%可靠的。所以当你做一个./gradlew assembleDebug它的真实情况,并且在做汇编时它的错误。 – slott 2013-12-26 17:27:37

回答

53

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

+6

没有为我工作(r21p2,六月,Win7) – Tom 2012-09-11 20:43:01

+3

我同意汤姆。在r21 ... – ChuongPham 2012-11-16 14:04:15

+0

也被破坏了。其结果是显示所有应该被该标志省略的Log.d消息。 ps。在哪里提交错误报告? – tomi 2013-01-24 10:37:14

1

正常,据我了解(Android issue 22241

我曾在一个项目的一些麻烦(使用Eclipse工作)不工作,出口的签署APK时常数未设置为true我项目:(

很想听到它的工作原理虽然

+1

它应该已经在r17中修复了,它在bug跟踪器中被标记为这样。 – smith324 2012-03-24 22:59:59

+2

我刚刚尝试过它,它为我工作。 – 2012-03-28 22:24:39

+1

实际上,在导出(在Ant中工作)时,libs不会在ADT中以发布模式进行编译。我更新了http://code.google.com/p/android/issues/detail?id=27940 – 2012-03-28 22:51:41

5

Preparing for Release

Turn off logging and debugging

Make sure you deactivate logging and disable the debugging option before you build your application for release. You can deactivate logging by removing calls to Log methods in your source files. You can disable debugging by removing the android:debuggable attribute from the tag in your manifest file, or by setting the android:debuggable attribute to false in your manifest file. Also, remove any log files or static test files that were created in your project.

Also, you should remove all Debug tracing calls that you added to your code, such as startMethodTracing() and stopMethodTracing() method calls.

更多信息正在关注该链接。

+1

我认为这个过程现在在编译时自动发生:http://developer.android.com/tools/sdk/tools-notes.html – 2013-11-27 19:40:45

+0

导致编译时错误:«避免硬编码调试模式;留下它允许调试和发布版本自动分配一个» – 2015-04-07 21:30:41

32

它不能正常工作:

问题27940:BuildConfig.DEBUG是导出的应用程序包

这是令人失望的是,他们有时会释放出越野车的特点“真”。

+9

请转到上面提到的问题的链接,如果您希望修复此问题,请点击“星号”。 – Guy 2012-07-30 05:56:13

5

对我来说,解决办法:

  1. 项目 - >自动构建
  2. 项目 - >清洁
  3. 项目 - >构建
  4. 项目导出Android应用

这是工作r20

+1

看起来它在r21中再次被打破。该死的,谷歌... – ChuongPham 2012-11-16 14:02:51

+1

这刚刚为我工作(使用最新的ADT我猜)。也许清洁固定它,不知道。 – Jonny 2013-01-15 09:03:16

9

它确实有效,bu请注意,即使导出签名文件,代码文件也不会更改。输出进程将此变量的值更改为false,这可能会给您错误的印象,即它不起作用。 我的日志语句测试这个喜欢

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

测试时,我的日志报表不再产生任何输出。

+1

这对我来说不起作用(R22)。 – 2013-06-10 16:02:58

+1

你到底做了什么? – pbhowmick 2013-06-11 13:56:06

+1

我将BuildConfig.DEBUG的实例更改为com.mypackage.BuildConfig.DEBUG,然后重新运行应用程序...并且它始终返回true。也许我误解了你的建议。 – 2013-06-12 11:27:02

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 
     ); 
} 

} 
+12

这个方法的问题是,当DEBUG为false的事件,Java仍然会计算每个字符串以将其传递给您的自定义类。 if(DEBUG)Log.d(...)不太优雅,但更高效。 – Jeremyfa 2013-09-27 21:42:26

30

随着Eclipse的,我总是在释放导出应用程序之前禁用“自动构建”选项。然后我清理项目并导出。否则它开始以调试模式编译,然后BuildConfig.DEBUG的值可能是错误的。

随着的Android工作室,我只需添加在的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 
} 

我建议在切换调试/发布版本后进行清理。

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设置,而是维持作为其开发者之间共享文件的承诺。

0

我见过有当BuildConfig的值设置为它们的最终值与做一些奇怪的行为。这可能与您的问题有关。

简单的解释是,默认值设置最初运行Proguard的之前,Proguard的运行在此之后,BuildConfig文件再生与正确的价值观。但是,Proguard已经通过这一点优化了您的代码,并且您遇到了问题。

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

3

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

import io.fabric.sdk.android.BuildConfig; 

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

import com.yourpackagename.BuildConfig; 

在这种情况下BuildConfig。DEBUG将返回您的实体构建变体

P.S我只是复制这一个从这里我的答案是:是自动生成的Android BuildConfig.DEBUG always false when building library projects with gradle

+0

是的,对我来说,它是从'android.support.compat'无意中导入的。我想这是另一个用不同的名字来定义你自己的领域的原因。 – arekolek 2017-04-24 10:45:20

相关问题