buildConfigField,resValue和manifestPlaceholders之间有什么区别?

时间:2017-03-10 18:23:49

标签: android android-gradle build.gradle

我理解它们是如何被使用的,但是想知道它们何时被使用。 对于在不同环境中使用单独的KEY的情况,我们可以使用上面提到的所有三个。所以,我很想知道为什么有三件事要做同样的事情,如果它们是针对不同的用法。谢谢!

enter image description here

1 个答案:

答案 0 :(得分:17)

使用buildConfigField将在应用生成的BuildConfig课程中生成实际的Java常量。所以对于你的例子,你会有这样的东西:

public static class BuildConfig {
    public static final String BASE_URL = "xxxxxxxxxx";
}

使用resValue将生成您在应用的res(资源)目录中指定的类型的资源。因此,对于字符串,您可以使用@string/base_urlgetResources().getString(R.string.base_url)通过XML引用它。

使用manifestPlaceholders可以在AndroidManifest.xml中添加替换。例如,GCM要求您使用<uses-permission>标记,其名称设置为X.permission.C2D_MESSAGE,其中X是您的应用程序ID。因此,如果您有多个具有不同应用程序ID的构建版本,则可以使用manifestPlaceholders标记,然后在AndroidManifest.xml中使用它,将其替换为正确的值,例如:

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />

对于记录,applicationId会自动添加为明字占位符,因此无需自行定义,但这仅仅是一个示例。

基本上,这取决于你需要它的位置。如果XML资源(布局,菜单等)需要,resValue就是您想要的。如果需要直接从Java代码访问它,buildConfigField就可以了。对于清单中的替换,manifestPlaceholders就是您想要的。