如何添加元数据到gradle / AndroidStudio生成的清单

我正在从Ant / Eclipse环境迁移到Gradle / Android Studio,并且我们使用的一些工具需要Android应用程序使用android:name和android:value字段设置元数据标记。

我们目前有两个构build变体的应用程序,在build.gradle文件中指定为productFlavours / buildTypes。 由于Android manifest.xml文件是在构build时由gradle生成的,我显然不能直接将元数据放在xml文件中。

有没有一种方法可以在build.gradle文件中指定它,以便这两个buildType的元数据字段添加到生成的Manifest.xml中,但具有不同的“android:value”值?

Solutions Collecting From Web of "如何添加元数据到gradle / AndroidStudio生成的清单"

你可以使用这种方法:

  1. 的build.gradle:
buildTypes { debug { ... resValue "string", "my_string", "string value debug" } release { ... resValue "string", "my_string", "string value release" } } 

要么

  productFlavors { staging { ... resValue "string", "my_string", "string value staging" } production { ... resValue "string", "my_string", "string value production" } } 
  1. 在AndroidManifest.xml中使用Gradle文件同步项目之后:
  <meta-data android:name="MY_META" android:value="@string/my_string"/> 

为什么不能把meta-data直接放在清单中?

您可以通过sourceSets为每个gradle buildTypes指定一个清单:

 sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' res.srcDirs = ['src/main/res'] } debug { manifest.srcFile 'src/main/debug/AndroidManifest.xml' res.srcDirs = ['src/main/debug/res'] } release { manifest.srcFile 'src/main/release/AndroidManifest.xml' res.srcDirs = ['src/main/release/res'] } } 

这里如果你在debugging中build立,gradle会把“main”清单和debugging清单合并。

受到其他一些答案的启发,这个效果很好。

1)在你的清单中放置一个占位符:

 <meta-data android:name="MY_META" android:value="${someKeyForValue}"/> 

2)在你的build.gradle中设置值

 flavorDimensions "env" productFlavors { dev { flavorDimension "env" ... someKeyForValue = "TheDynamicValue_01" } prod { flavorDimension "env" ... someKeyForValue = "TheDynamicValue_02" } } 

这种方法避免了创build资源,原始清单读得更清楚一点,即在构build时将会注入一个值。

有关清单占位符支持的更多信息,请参阅: Android工具和Manifest占位符

 android { ... buildTypes { debug { ... resValue "string", "GOOGLE_MAPS_ANDROID_API_KEY", "(your development Maps API key)" } release { ... resValue "string", "GOOGLE_MAPS_ANDROID_API_KEY", "(your production Maps API key)" } } } <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/GOOGLE_MAPS_ANDROID_API_KEY"/> Your IDE may complain about this string resource not existing, but it will build just fine.