I want to create a global variable similar with applicationId. It is set value in build.gradle and will be used in manifest. Is it possible?
-
gradle is a part of build system/ IDE, not related with the app – droidev Oct 23 '15 at 04:57
-
if you explain the real use case, I think may be we can help – droidev Oct 23 '15 at 05:00
-
Possible duplicate of http://stackoverflow.com/questions/17197636/is-it-possible-to-declare-a-variable-in-gradle-usable-in-java – Ankur Aggarwal Oct 23 '15 at 05:07
4 Answers
You can set them, for instance I'm setting it for different product flavors
productFlavors {
production {
applicationId = "com.myapp.app"
resValue "string", "authority", "com.facebook.app.FacebookContentProvider5435651423234"
}
development {
applicationId = "com.myapp.development"
resValue "string", "authority", "com.facebook.app.FacebookContentProvider2134564533421"
}
qa {
applicationId = "com.myapp.qa"
resValue "string", "authority", "com.facebook.app.FacebookContentProvider29831237981287319"
}
}
And use it like this
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="@string/authority"
android:exported="true" />

- 20,385
- 13
- 48
- 64
-
Thank so much. This is exactly my situation. I've tried to set a variable facebookProdiderId inside build.gradle then reused inside android manifest file like ${facebookProdiderId}, but it does not work – thanhnd Oct 23 '15 at 06:23
-
-
-
@TusharPandey to be honest not sure, I think it could work, give it a try. – Marko Oct 04 '16 at 16:04
-
I got solution , there is no need of content provider. it only requires when we pick image from gallery and share it in facebook. – Tushar Pandey Oct 05 '16 at 07:22
If you just want to use the application id set in gradle in your manifest, you can simply use:
${applicationId}
For instance:
<provider
android:authorities="${applicationId}.ShareFileProvider" ... >
...
</provider>
If you want the same behavior with custom variables, you can use manifestPlaceholders, like this:
android {
defaultConfig {
manifestPlaceholders = [hostName:"www.example.com"]
}
}
And in your manifest:
<intent-filter ... >
<data android:scheme="http" android:host="${hostName}" ... />
...
</intent-filter>
See https://developer.android.com/studio/build/manifest-build-variables.html for more information.

- 6,043
- 5
- 46
- 76
While Marko's answer seems to work, there's currently a better solution that doesn't require adding variables to the string resource files.
The manifest merger accepts placeholders:
For custom placeholders replacements, use the following DSL to configure the placeholders values :
android {
defaultConfig {
manifestPlaceholders = [ activityLabel:"defaultName"]
}
productFlavors {
free {
}
pro {
manifestPlaceholders = [ activityLabel:"proName" ]
}
}
will substitute the placeholder in the following declaration :
<activity android:name=".MainActivity" android:label="${activityLabel}" >
You can also manipulate those strings with groovy functions.

- 3,746
- 4
- 26
- 33
To use the string in Manifest
, you can directly make it in strings.xml
.
Like this,
<string name="variable_name">value</string>

- 2,446
- 4
- 36
- 68