定义和使用构建配置字段

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