1. 程式人生 > >利用BuildConfig進行編譯選擇及Gradle自定義BuildTypes和欄位

利用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;

即可獲取到當前時間戳的字串,用於業務邏輯程式碼的控制等。