如何访问 AndroidManifest.xml 文件中的 BuildConfig 值?

是否可以从 AndroidManifest.xml 访问 BuildConfig 值?

在 build.gradle 文件中,我有:

defaultConfig {
applicationId "com.compagny.product"
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"


// Facebook app id
buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
}

FACEBOOK_APP_ID是在我的 gradle.properties 文件中定义的:

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX

要在我的应用程序中使用 Facebook connect,我必须将这一行添加到 AndroidManifest.xml:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/>

我想用 gradle 中定义的 BuildConfig 字段 FACEBOOK_APP_ID替换 @string/applicationId,如下所示:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/>

使用 BuildConfig 是否可行? 如果不可行,我如何实现这一点?

63711 次浏览

替换

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

然后是 重建你的项目(Android Studio-> Build-> Rebuild Project)。

这两个命令都会在项目构建期间生成值——第一种情况下由 Java 常量组成,第二种情况下由 Android 资源组成,但是第二种方法将生成一个 string资源值,可以使用 @string/FACEBOOK_APP_ID语法访问这个值。这意味着它既可以在清单中使用,也可以在代码中使用。

另一种选择: 使用不同的字符串资源文件替换所有与风味相关的值:

第一步: 创建一个新的文件夹在“ src”文件夹的名称与您的口味,我的情况下“舞台”

第二步: 为所有依赖于风格的文件创建资源文件 例如:

enter image description here

第三步: 我还使用了不同的图标,所以您也可以看到 mipmap 文件夹。对于这个问题,只有“ strings.xml”是重要的。现在可以覆盖所有重要的字符串资源。你只需要包含那些你想覆盖的,所有其他的都会从主“ strings.xml”中使用,它会在 Android Studio 中显示如下:

enter image description here

第四步: 使用项目中的字符串资源并放松:

enter image description here

从 AndroidManifest.xml 访问 Gradle Build Config 值的另一种方法是通过占位符,如下所示:

android {
defaultConfig {
manifestPlaceholders = [ facebookAppId:"someId..."]
}
productFlavors {
flavor1 {
}
flavor2 {
manifestPlaceholders = [ facebookAppId:"anotherId..." ]
}
}
}

然后在你的货单上:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/>

点击这里查看更多细节: https://developer.android.com/studio/build/manifest-build-variables.html

(旧链接仅供参考: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger)

在清单中访问 build.gradle 属性,如下例所示:

例如,在 build.gradle 中有一个属性“ applicationId”,并且希望在 AndroidManifest 中访问该属性:

enter image description here

在 AndroidManifest 中访问“ applicationId”:

<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>

类似地,我们可以为其他常量创建字符串资源,并在代码文件中访问它们,如下所示:

context.getString(R.string.GCM_SENDER_ID);

@ stkent 很好,但是忘记了添加一条,那就是你需要在之后重新构建你的项目

替换

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

那么

Android Studio -> Build -> Rebuild Project

这将允许 android 生成可通过以下方式访问的字符串资源

R.string.FACEBOOK_APP_ID

注意: 当您使用 resValue时,该值可能意外地被字符串资源文件覆盖(例如,对于另一种语言)

要获得一个可以在清单和 Java 代码中使用的真正的常量值,请同时使用 manifestPlaceholdersbuildConfigField: e.g。

android {
defaultConfig {
def addConstant = {constantName, constantValue ->
manifestPlaceholders += [ (constantName):constantValue]
buildConfigField "String", "${constantName}", "\"${constantValue}\""
}


addConstant("FACEBOOK_APP_ID", "xxxxx")
}

访问清单文件:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>

来自 java:

BuildConfig.FACEBOOK_APP_ID

如果常量值需要是 buildType 特定的,那么就需要调整 helper addConstant(使用 groovy 闭包语义) ,例如,

buildTypes {
def addConstantTo = {target, constantName, constantValue ->
target.manifestPlaceholders += [ (constantName):constantValue]
target.buildConfigField "String", "${constantName}", "\"${constantValue}\""
}
debug {
addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-debug")
}
release {
addConstantTo(owner,"FACEBOOK_APP_ID", "xxxxx-release")
}

您可以使用长值,如下所示

BuildConfigField‘ long’,‘ FLAVOR _ Long’,‘11500L’