1. 程式人生 > >Android Debug與Release環境切換

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包了。