定義和使用構建配置欄位

BuildConfigField

Gradle 允許 buildConfigField 行定義常量。這些常量在執行時可以作為 BuildConfig 類的靜態欄位訪問。這可以通過定義 defaultConfig 塊中的所有欄位來建立風格 ,然後根據需要覆蓋它們以獲得單獨的構建風格。

此示例定義構建日期並標記生產的構建而不是測試:

android {
    ...
    defaultConfig {
        ...
        // defining the build date
        buildConfigField "long", "BUILD_DATE", System.currentTimeMillis() + "L"
        // define whether this build is a production build
        buildConfigField "boolean", "IS_PRODUCTION", "false"
        // note that to define a string you need to escape it
        buildConfigField "String", "API_KEY", "\"my_api_key\""
    }

    productFlavors {
        prod {
            // override the productive flag for the flavor "prod"
            buildConfigField "boolean", "IS_PRODUCTION", "true"
            resValue 'string', 'app_name', 'My App Name'
        }
        dev {
            // inherit default fields
            resValue 'string', 'app_name', 'My App Name - Dev'
        }
    }
}

gen 資料夾中自動生成的<package_name> .BuildConfig.java 包含基於以上指令的以下欄位:

public class BuildConfig {
    // ... other generated fields ...
    public static final long BUILD_DATE = 1469504547000L;
    public static final boolean IS_PRODUCTION = false;
    public static final String API_KEY = "my_api_key";
}

現在可以通過訪問生成的 BuildConfig 類在執行時在應用程式中使用已定義的欄位:

public void example() {
    // format the build date
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
    String buildDate = dateFormat.format(new Date(BuildConfig.BUILD_DATE));
    Log.d("build date", buildDate);
    
    // do something depending whether this is a productive build
    if (BuildConfig.IS_PRODUCTION) {
        connectToProductionApiEndpoint();
    } else {
        connectToStagingApiEndpoint();
    }
}

ResValue

productFlavors 中的 resValue 建立了一個資源值。它可以是任何型別的資源(stringdimencolor 等)。這類似於在適當的檔案中定義資源:例如,在 strings.xml 檔案中定義字串。優點是可以根據 productFlavor / buildVariant 修改 gradle 中定義的那個。要訪問該值,請編寫與從資原始檔訪問 res 一樣的程式碼:

getResources().getString(R.string.app_name)

重要的是,以這種方式定義的資源不能修改檔案中定義的現有資源。他們只能建立新的資源值。

某些庫(例如 Google Maps Android API)需要在 Manifest 中提供的 API 金鑰作為 meta-data 標記。如果除錯和生成版本需要不同的金鑰,請指定由 Gradle 填充的清單佔位符。

在你的 AndroidManifest.xml 檔案中:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="${MAPS_API_KEY}"/>

然後在 build.gradle 檔案中相應地設定欄位:

android {
    defaultConfig {
        ...
        // Your development key
        manifestPlaceholders = [ MAPS_API_KEY: "AIza..." ]
    }

    productFlavors {
        prod {
            // Your production key
            manifestPlaceholders = [ MAPS_API_KEY: "AIza..." ]
        }
    }
}

Android 構建系統自動生成許多欄位並將它們放在 BuildConfig.java 中。這些欄位是:

除了上述內容之外,如果你定義了多個 flavor 的維度,那麼每個維度都有自己的值。例如,如果 colorsize 有兩個尺寸的味道,你還將擁有以下變數:

領域 描述
FLAVOR_color 含有顏色味道值的 String
FLAVOR_size 含有大小味道值的 String