利用BuildConfig进行编译选择及Gradle自定义BuildTypes和字段

BuildConfig的用法

在Android开发中,我们使用android.util.Log来打印日志,方便我们的开发调试。但是这些代码不想在发布后执行,我们并不想在软件发布后调试日志被其他开发者看到,现在我的方法是设置一个全局变量,标记软件为Debug模式还是Release模式。来看下代码:

public class Log {
    private static final boolean DEBUG = true;

    public static void i(String tag, String msg) {
        if (DEBUG)
            android.util.Log.i(tag, msg);
    }

    public static void e(String tag, String msg) {
        if (DEBUG)
            android.util.Log.e(tag, msg);
    }

    public static void d(String tag, String msg) {
        if (DEBUG)
            android.util.Log.d(tag, msg);
    }

    public static void v(String tag, String msg) {
        if (DEBUG)
            android.util.Log.v(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (DEBUG)
            android.util.Log.w(tag, msg);
    }
}

这样打包发布之前只要改下DEBUG=false就行了,但是每次在发布之前都要手动去改这个变量,不是很方便,而且不排除开发者忘记改的情况。那么有没有更好更方便的做法呢?
ADT(r17)发布以后,Google为我们提供了一种新的调试机制,即BuildConfig.DEBUG。

ADT 17.0.0的New build features第二条如下描述:

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.

新增了一个特性,允许开发者只在Debug模式下运行部分代码。Builds会生成一个叫做BuildConfig的类,该类包含一个名为DEBUG的常量,其常量值会依据开发者的Build类型自动设定。如此,便可以利用BuildConfig.DEBUG来实现只在Debug模式下运行的代码。

因此只需要将如下代码进行修改即可,而该值会自动根据当前项目的编译方式(debug/release)进行更新:

private static final boolean DEBUG = BuildConifg.DEBUG;

而在编译完成后,我们可以看到在如下路径中会自动生成该BuildConfig.java文件:

app/build/source/BuildConfig/Build Varients/package name/BuildConfig

当然除了DEBUG字段之外,还包含如下内容:

public final class BuildConfig {
  public static final boolean DEBUG = false;
  public static final String APPLICATION_ID = "com.storm.9gag";
  public static final String BUILD_TYPE = "release";
  public static final String FLAVOR = "wandoujia";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
}

Gradle中自定义BuildConfig字段

如果上述默认生成的字段无法满足开发需求,那就需要在其中加入自定义的字段,假设我们需要加入应用的编译的时间timeStamp, 那我们则需要在gradle中加入该自定义字段:

defaultConfig {
        applicationId "com.qualcomm.qti.faceauth"
        minSdkVersion 24
        buildConfigField("String", "timeStamp", System.currentTimeMills() + "L");
}

通过增加该条属性,那么则会在BuildConfig中自动生成如下字段:

public final class BuildConfig {
  public static final boolean DEBUG = false;
  public static final String APPLICATION_ID = "com.storm.9gag";
  public static final String BUILD_TYPE = "release";
  public static final String FLAVOR = "wandoujia";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  //newly automatically added timeStamp attribute
  public static final String timeStamp = 23800883L;
}

那在代码中直接可以调用:

String timeStr = BuildConfig.timeStamp;

即可获取到当前时间戳的字符串,用于业务逻辑代码的控制等。

    原文作者:chengjian666
    原文地址: https://www.jianshu.com/p/c1e9b0b3d014
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞