我如何在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连接,我必须将此行添加到我的AndroidManifest.xml中:

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

我想通过Gradle中定义的BuildConfig字段FACEBOOK_APP_IDreplace@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 

然后重build你的项目 (Android Studio – > Build – > Rebuild Project)。

在项目构build过程中,这两个命令都会生成生成的值(第一种情况包括Java常量,第二种情况包含Android资源),但第二种方法将生成可使用@string/FACEBOOK_APP_ID语法访问的string资源值。 这意味着它可以在清单和代码中使用。

从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中访问它:

在这里输入图像说明

在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> 

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

 context.getString(R.string.GCM_SENDER_ID); 

注意:当你使用resValue的时候,这个值可能会被string资源文件意外地覆盖(例如,用于另一种语言)

要获得一个可以在清单和java代码中使用的真正的常数值,可以使用manifestPlaceholdersbuildConfigField :eg

 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 

另一种select是:使用不同的string资源文件来replace所有与风味有关的值:

第1步:在“src”文件夹中创build一个新的文件夹,其中包含您的味道名称,即时消息“stage”

步骤2:为所有依赖风格的文件创build资源文件,例如:

在这里输入图像说明

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

在这里输入图像说明

第4步:使用项目中的string资源,放松:

在这里输入图像说明

@stkent是好的,但忘了补充说,你需要重build你的项目之后

更换

 buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

 resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID 

然后

 Android Studio -> Build -> Rebuild Project 

这将允许android生成可通过的string资源

 R.string.FACEBOOK_APP_ID