繁体   English   中英

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

[英]How can I access a BuildConfig value in my AndroidManifest.xml file?

是否可以从 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 连接,我必须将此行添加到我的 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 吗? 如果没有,我怎样才能做到这一点?

代替

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语法访问该值。 这意味着它可以在清单和代码中使用。

从 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

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

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

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}"/>

来自爪哇:

BuildConfig.FACEBOOK_APP_ID

如果常量值需要特定于addConstant需要调整助手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")
    }

访问清单中的 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>

同样,我们可以为其他常量创建字符串资源,并在代码文件中访问它们,就像这样简单:

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

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

第 1 步:在“src”文件夹中创建一个新文件夹,名称为您的风味,我的情况是“stage”

第 2 步:为所有依赖于风味的文件创建资源文件,例如:

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

您可以使用长值如下

buildConfigField 'long', 'FLAVOR_LONG', '11500L'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM