利用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;
即可獲取到當前時間戳的字串,用於業務邏輯程式碼的控制等。