定义和使用构建配置字段
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 。 |