Is it possible to access a BuildConfig value from AndroidManifest.xml?
In my build.gradle file, I have:
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
is defined in my gradle.properties files:
# Facebook identifier (app ID)
FACEBOOK_APP_ID=XXXXXXXXXX
To use Facebook connect in my app, I must add this line to my AndroidManifest.xml:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/applicationId"/>
I want to replace @string/applicationId
by the BuildConfig field FACEBOOK_APP_ID
defined in gradle, like this:
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="FACEBOOK_APP_ID"/>
Is that possible using BuildConfig? If not, how can I achieve this?
note: when you use
resValue
the value can accidentally be overridden by the strings resource file (e.g. for another language)To get a true constant value that you can use in the manifest and in java-code, use both
manifestPlaceholders
andbuildConfigField
: e.g.access in the manifest file:
from java:
If the constant value needs to be buildType-specific, the helper
addConstant
needs to be tweaked (to work with groovy closure semantics), e.g.,Replace
with
then rebuild your project (Android Studio -> Build -> Rebuild Project).
The two commands both produce generated values - consisting of Java constants in the first case, and Android resources in the second - during project builds, but the second method will generate a
string
resource value that can be accessed using the@string/FACEBOOK_APP_ID
syntax. This means it can be used in the manifest as well as in code.Another way to access Gradle Build Config values from your AndroidManifest.xml is through placeholders like this:
and then in your manifest:
See more details here: https://developer.android.com/studio/build/manifest-build-variables.html
(Old link just for reference: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger)
@stkent is good but forgets to add that you need to rebuild your project afterwards
Replace
with
then
This will allow android generate the string resource accessible via
Access build.gradle properties in your manifest as in following example:
For example you have a property "applicationId" in your build.gradle and you want to access that in your AndroidManifest:
Access "applicationId" in AndroidManifest:
Similarly, we can create string resources for other constants and access them in code files as simple as:
Another option: use a different string resource file to replace all Flavor-dependent values:
Step 1: Create a new folder in the "src" folder with the name of your flavor, im my case "stage"
Step 2: Create resource files for all files that are dependent on the flavor for example:
Step 3: I am also using different icons, so you see the mipmap folders as well. For this quetion, only the "strings.xml" is important. Now you can overwrite all important string resources. You only need to include the ones you want to override, all others will be used from the main "strings.xml", it will show up in Android Studio like this:
Step 4: Use the string resources in your project and relax: