BuildConfig.DEBUG始终返回false

时间:2016-04-01 07:54:17

标签: android android-log

运行应用程序时,为什么BuildConfig.DEBUG返回false?

我用它来控制日志,如下所示:

public static void d(String LOG_TAG, String msg){
    if(BuildConfig.DEBUG){
        Log.d(LOG_TAG,msg);
    }
}

9 个答案:

答案 0 :(得分:35)

检查类中的导入,确保使用正确的Bui​​ldConfig路径。您可以不使用应用程序中的BuildConfig,而是使用某些库。

答案 1 :(得分:6)

在您的Android Studio 构建变体中,您是否使用调试变体?

flavorsdebug使用release时适用。

在调试模式下,BuildConfig.BUILD为真,在发布模式下,它为假。

答案 2 :(得分:4)

如果该代码在库中,那么由于3-year-old bug in gradle,它总是错误的。

答案 3 :(得分:2)

此问题有一种解决方法:

应用

import java.io.*;
import java.util.Arrays;



//import java.util.concurrent.TimeUnit;


public class JavacTest {

    private static void printLines(String name, InputStream ins)
            throws Exception {
        String line;
        BufferedReader in 
                = new BufferedReader(new InputStreamReader(ins));
        while ((line = in.readLine()) != null) {
            System.out.println(name + " " + line);
        }
    }

    private static void runProcess(String command) 
            throws Exception {
        Process pro = Runtime.getRuntime().exec(command);
        printLines(command 
                + " stdin:", pro.getInputStream());
        printLines(command 
                + " stderr:", pro.getErrorStream());
        //Take your time
        pro.waitFor();
        System.out.println(command 
                + " exitValue() " + pro.exitValue());
    }

    private static void runProcess2(String [] command) 
            throws Exception {
        Process pro = Runtime.getRuntime().exec(command);
        printLines(Arrays.toString(command) 
                + " stdin:", pro.getInputStream());
        printLines(Arrays.toString(command) 
                + " stderr:", pro.getErrorStream());
        //Take your time
        pro.waitFor();
        System.out.println(Arrays.toString(command) 
                + " exitValue() " + pro.exitValue());
    } 



   /*
    Note about paths:


    When NetBeans runs a  .java  program, the compiled class  .class  is put in a 
    subfolder of  build in the same folder of the project:  
    build/classes/Programs. 
    When a  .java program is run with javac from inside another master
    .java program, the corresponding  .class file is put in the 
    same folder as the master  .java program.
    */

    public static void main(String[] args) {
        try {
            System.out.println("\nCompiling with javac: .java -> .class");
            runProcess("/home/jose/jdk1.8.0_101/bin/javac  "
                    + "  /home/jose/NetBeansProjects/eJVolu17P/src"
                    + "/Programs/AddTwoIntegers.java");
            //take your time
            //TimeUnit.SECONDS.sleep(1);


            System.out.println("\n\nShowing the bytecode "
                    + "content of the .class file with javap");
            runProcess("/home/jose/jdk1.8.0_101/bin/javap  "
                    + "-c /home/jose/NetBeansProjects/eJVolu17P/src"
                    + "/Programs/AddTwoIntegers.class");
            System.out.println("\n\nWorking Directory = " +
                System.getProperty("user.dir"));
            //TimeUnit.SECONDS.sleep(1);


            System.out.println("\n\nRunning the .class file with java");
            String[] Commands  = new String[4];
            //Path to java
            Commands[0] = "/home/jose/jdk1.8.0_101/bin/java"; 
             //Command: claspath
            Commands[1] = "-cp";
            //Path to parent folder of  package with the .java program = Programs
            Commands[2] = "/home/jose/NetBeansProjects/eJVolu17P/src/";
            //Used package + name of compiled class without suffix .class
            Commands[3] = "Programs.AddTwoIntegers";
            runProcess2(Commands );
        } catch (Exception e) {
        }
    }
}

<强>库

dependencies {
    releaseCompile project(path: ':library', configuration: 'release')
    debugCompile project(path: ':library', configuration: 'debug')
}

答案 4 :(得分:2)

也许并不理想,但我最终创造了自己的

    buildTypes {
    debug {
        buildConfigField "boolean", "IS_DEBUG", "true" // Had issues with BuildConfig.DEBUG, created IS_DEBUG to ensure functionality behaved as expected.
    }
    release {
        signingConfig signingConfigs.release
        buildConfigField "boolean", "IS_DEBUG", "false"
    }
}

然后以BuildConfig.IS_DEBUG编程方式解决它。

答案 5 :(得分:2)

确保类顶部的build config自动导入语句属于您的项目。

com.your.package.name.BuildConfig

BuildConfig导入可能属于已发布的库,其中DEBUG为假。

答案 6 :(得分:2)

请勿导入BuildConfig。这是一个自动生成的类,即使Android Studio会告诉您,也无需导入它。

如果Android Studio提示您导入BuildConfig,则可能是因为您需要进行初始Gradle构建来创建自动生成的类,该类最终在com.yourdomain.yourapp.BuildConfig中创建。升级Android Studio和Gradle或运行 Build-> Clean project

如果您导入另一个软件包的BuildConfig,那么它当然永远是错误的,因为它们仅发布其发行版本而不是其调试版本。

关于建议修改build.gradle的其他答案,我发现指定buildType与Android Studio的默认行为及其生成的BuildConfig冲突,并指出我有重复的条目。

从本质上说:

  • 请勿导入任何软件包的BuildConfig(因此请保持红色)
  • 请勿在您的buildType中添加build.gradle(这可能与自动生成类的默认构建行为冲突)
  • 忽略皮棉错误
  • 运行构建

错误应该消失。

当我升级Android Studio和Gradle以及清理项目时,会遇到这种情况。

忽略导入提示

请勿导入其他程序包的BuildConfig,因为它们不会发布其调试版本,所以它始终为false。

enter image description here

导入将导致您遇到的错误

在我的项目中,如果我导入一个建议的库,它将显示您得到的错误,因为没有人发布调试版本,因此,如果您指向某人,那么它永远都是假的其他的。

enter image description here

enter image description here

忽略智能并运行项目

只需运行一个构建即可。该课程将自动生成,警告将消失。

enter image description here

答案 7 :(得分:1)

也许您正在导入错误的包,请检查。 (一些Android库也有BuildConfig类)

答案 8 :(得分:1)

我在build.config中指定了debuggable true,但这总是总是错误

此更改完成后,所有人都可以正常使用:

enter image description here