我如何在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_ID
replace@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代码中使用的真正的常数值,可以使用manifestPlaceholders
和buildConfigField
: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
- xxhdpi android的缩放因子?
- Android:如何使用AlarmManager
- Android Studio项目结构(与Eclipse项目结构)
- 如何解决Android中的java.lang.OutOfMemoryError问题
- 我想让我的应用程序只在Android横向
- testing运行失败:无法find检测信息:ComponentInfo {} – 尝试在IntelliJ中使用Gradle进行testing的错误
- LocationRequest setInterval(long millis)和LocationRequest setFastestInterval(long millis)之间的区别
- 通过Retrofit 2上传图像时是否可以显示进度条?
- Android Studio:无法恢复密钥