Android Debug與Release環境切換
在Android開發中,通常會有Debug和Release環境,比如:Debug環境用測試介面,Release環境用正式介面;Debug環境列印Log,Release環境不列印Log等等。
1.BuildConfig檔案
BuildConfig檔案是專案編譯後自動生成的,它存在於module的
\build\generated\source\buildConfig資料夾下面:
其實BuildConfig檔案是一個java類,在debug中是這樣的:
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.wj.study;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.wj.study";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
在release中是這樣的:
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.wj.study;
public final class BuildConfig {
public static final boolean DEBUG = false;
public static final String APPLICATION_ID = "com.wj.study";
public static final String BUILD_TYPE = "release";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
預設有六個引數,其中boolean值的DEBUG引數標誌了debug包與release包的區別。在debug包中DEBUG=true,release包中DEBUG=false。
那麼,在module中就可以通過BuildConfig.DEBUG的值來區分debug和release。
當然,如果要新增額外的引數來區分debug和release也是可以的,在module的build.gradle檔案中新增:
buildTypes {
debug {
buildConfigField "Boolean", "DEBUG_MODE", "true"
}
release {
buildConfigField "Boolean", "DEBUG_MODE", "false"
}
}
編譯後,在debug的BuildConfig.java中會自動新增一行:
// Fields from build type: debug
public static final Boolean DEBUG_MODE = false;
在Release的BuildConfig.java中也會自動新增一行:
// Fields from build type: release
public static final Boolean DEBUG_MODE = true;
那麼也就可以用BuildConfig.DEBUG_MODE來區分。
從上面可以看出,編譯自動生成的BuildConfig檔案可以區分debug和release包,但如果在專案中有多個module(通常有很多個module),每個module都會生成自己的BuildConfig檔案,那麼就需要每個module自己各行處理debug和release的區別。這樣就導致不統一,比如開啟和關閉列印Log,就得各自管理。
現在在專案的非主module “Lib module base”中建立一個列印Log的類LogUtil:
public class LogUtil {
private final static boolean DEBUG = BuildConfig.DEBUG;
public static void d(String tag, String msg) {
Log.d(tag, "d-->DEBUG=" + DEBUG);
if (DEBUG) {
Log.d(tag, msg);
}
}
}
再在主module中引用這個LogUtil類,從實際的測試結果上看,無論是debug包還是release包,結果LogUtil.DEBUG的值都是false。因為編譯時被依賴的 module 預設會提供 Release 版給其它module 或工程使用,這就導致該 BuildConfig.DEBUG 會始終為 false。
接下來用Application的FLAG_DEBUGGABLE來解決這個問題。
2.通過Application的FLAG_DEBUGGABLE來判斷
元素application有一個屬性debuggable,在debug構建的時候會設定成false,在release構建的時候會設定成ture。這些都是自動設定,並不需要在元素application中設定android:debuggable=”false|true”。
所以可以這樣寫:
public static void init(Context context) {
DEBUG = context.getApplicationInfo() != null &&
(context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
}
但在呼叫的時候要在Application的onCreate方法中呼叫:
public class Study extends Application {
@Override
public void onCreate() {
super.onCreate();
LogUtil.init(getApplicationContext());
}
}
因此,這就可以判斷debug包和release包了。