定義和使用構建配置欄位
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
建立了一個資源值。它可以是任何型別的資源(string
,dimen
,color
等)。這類似於在適當的檔案中定義資源:例如,在 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 的維度,那麼每個維度都有自己的值。例如,如果 color
和 size
有兩個尺寸的味道,你還將擁有以下變數:
領域 | 描述 |
---|---|
FLAVOR_color |
含有顏色味道值的 String 。 |
FLAVOR_size |
含有大小味道值的 String 。 |