Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

People also ask

What is content within the AndroidManifest XML file?

The AndroidManifest. xml file contains information of your package, including components of the application such as activities, services, broadcast receivers, content providers etc.

How do I edit AndroidManifest XML?

You can edit the XML manually by clicking on the AndroidManifest. xml tab. Android manifest files generally include a single <manifest> tag with a single <application> tag.

What is the root element of AndroidManifest XML?

The root element of the AndroidManifest. xml file. It must contain an <application> element and specify xmlns:android and package attributes. Defines the Android namespace.


Replace

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

with

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

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:

android {
    defaultConfig {
        manifestPlaceholders = [ facebookAppId:"someId..."]
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            manifestPlaceholders = [ facebookAppId:"anotherId..." ]
        }
    }
}

and then in your manifest:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebookAppId}"/> 

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)


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 and buildConfigField: e.g.

android {
    defaultConfig {
        def addConstant = {constantName, constantValue ->
            manifestPlaceholders += [ (constantName):constantValue]
            buildConfigField "String", "${constantName}", "\"${constantValue}\""
        }

        addConstant("FACEBOOK_APP_ID", "xxxxx")
    }

access in the manifest file:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${FACEBOOK_APP_ID}"/>

from java:

BuildConfig.FACEBOOK_APP_ID

If the constant value needs to be buildType-specific, the helper addConstant needs to be tweaked (to work with groovy closure semantics), e.g.,

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

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:

enter image description here

Access "applicationId" in AndroidManifest:

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

Similarly, we can create string resources for other constants and access them in code files as simple as:

context.getString(R.string.GCM_SENDER_ID);

@stkent is good but forgets to add that you need to rebuild your project afterwards

Replace

buildConfigField "long", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

with

resValue "string", "FACEBOOK_APP_ID", FACEBOOK_APP_ID

then

Android Studio -> Build -> Rebuild Project

This will allow android generate the string resource accessible via

R.string.FACEBOOK_APP_ID

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:

enter image description here

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:

enter image description here

Step 4: Use the string resources in your project and relax:

enter image description here