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

ant*_*ony 127 android android-xml android-facebook android-gradle-plugin

是否可以从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
}
Run Code Online (Sandbox Code Playgroud)

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

# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

要在我的应用中使用Facebook连接,我必须将此行添加到我的AndroidManifest.xml:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/> 
Run Code Online (Sandbox Code Playgroud)

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

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/> 
Run Code Online (Sandbox Code Playgroud)

使用BuildConfig可以吗?如果没有,我怎么能实现这个目标?

stk*_*ent 178

更换

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
Run Code Online (Sandbox Code Playgroud)

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID
Run Code Online (Sandbox Code Playgroud)

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

这两个命令在项目构建期间都生成生成的值 - 第一种情况下包含Java常量,第二种情况包含Android资源,但第二种方法将生成string可以使用@string/FACEBOOK_APP_ID语法访问的资源值.这意味着它可以在清单和代码中使用.

  • 确保你写resValue"string"而不是resValue"String" (9认同)

Gre*_*ryK 81

从AndroidManifest.xml访问Gradle Build Config值的另一种方法是通过这样的占位符:

android {
    defaultConfig {
        manifestPlaceholders = [ facebookAppId:"someId..."]
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            manifestPlaceholders = [ facebookAppId:"anotherId..." ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的清单中:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/> 
Run Code Online (Sandbox Code Playgroud)

在此处查看更多详细信息:https://developer.android.com/studio/build/manifest-build-variables.html

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

  • 这是一个很好的解决方案. (2认同)
  • 是的,这是一个很好的方法,只显示字符串注入! (2认同)
  • 您如何从Java中的manifestPlaceholders获取值?这对于在Java代码和清单中使用的常量很有用。 (2认同)

TmT*_*ron 33

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

要获得可以在清单和java代码中使用的真正常量值,请使用manifestPlaceholdersbuildConfigField:例如

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

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }
Run Code Online (Sandbox Code Playgroud)

访问清单文件:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>
Run Code Online (Sandbox Code Playgroud)

来自java:

BuildConfig.FACEBOOK_APP_ID
Run Code Online (Sandbox Code Playgroud)

如果常量值需要特定于buildType,则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")
    }
Run Code Online (Sandbox Code Playgroud)


Vin*_*nay 6

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

例如,build.gradle中有一个属性"applicationId",并且您想在AndroidManifest中访问该属性:

在此输入图像描述

在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>
Run Code Online (Sandbox Code Playgroud)

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

context.getString(R.string.GCM_SENDER_ID);
Run Code Online (Sandbox Code Playgroud)