如何访问 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
语法访问的资源值。这意味着它既可以在清单中使用,也可以在代码中使用。
另一种选择:使用不同的字符串资源文件来替换所有与风味相关的值:
第一步:
在 "src" 文件夹中创建一个新文件夹,名称为你的口味,我的例子是 "stage"
第 2 步:
为所有依赖flavor的文件创建资源文件
例如:
第 3 步:
我还使用了不同的图标,因此您也可以看到 mipmap 文件夹。对于这个问题,只有 "strings.xml" 是重要的。现在您可以覆盖所有重要的字符串资源。你只需要包含你想要覆盖的那些,所有其他的都将从主 "strings.xml" 中使用,它会像这样显示在 Android Studio 中:
第 4 步:
在你的项目中使用字符串资源并放松:
从 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
(旧link仅供参考: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>
同样,我们可以为其他常量创建字符串资源,并在代码文件中访问它们,就像:
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 代码中使用的真正常量值,请同时使用 manifestPlaceholders
和 buildConfigField
:例如
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,则需要调整助手 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'
是否可以从 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
然后
这两个命令都生成生成的值 - 在第一种情况下由 Java 常量组成,在第二种情况下由 Android 资源组成 - 在项目构建期间,但第二种方法将生成 string
可以使用 @string/FACEBOOK_APP_ID
语法访问的资源值。这意味着它既可以在清单中使用,也可以在代码中使用。
另一种选择:使用不同的字符串资源文件来替换所有与风味相关的值:
第一步: 在 "src" 文件夹中创建一个新文件夹,名称为你的口味,我的例子是 "stage"
第 2 步: 为所有依赖flavor的文件创建资源文件 例如:
第 3 步: 我还使用了不同的图标,因此您也可以看到 mipmap 文件夹。对于这个问题,只有 "strings.xml" 是重要的。现在您可以覆盖所有重要的字符串资源。你只需要包含你想要覆盖的那些,所有其他的都将从主 "strings.xml" 中使用,它会像这样显示在 Android Studio 中:
第 4 步: 在你的项目中使用字符串资源并放松:
从 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
(旧link仅供参考: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>
同样,我们可以为其他常量创建字符串资源,并在代码文件中访问它们,就像:
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 代码中使用的真正常量值,请同时使用 manifestPlaceholders
和 buildConfigField
:例如
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,则需要调整助手 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'