I would like to have a way to reference the project's manifest version number in the main part of the code. What I have been doing up until now is to link the version number in a String XML file to the manifest (@string/Version). What I would like to do is to do it the other way around, link a string XML variable to the version in the manifest. The reason? I'd like to only have to change the version number in one location, the manifest file. Is there any way to do this? Thanks!
-
1**If you're looking for how to do this *in Java or Kotlin code rather than in XML*, please see [this other question](https://stackoverflow.com/q/3637665).** – Ryan M Feb 25 '23 at 03:50
8 Answers
There is not a way to directly get the version out, but there are two work-arounds that could be done.
The version could be stored in a resource string, and placed into the manifest by:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somepackage" android:versionName="@string/version" android:versionCode="20">
One could create a custom view, and place it into the XML. The view would use this to assign the name:
context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
Either of these solutions would allow for placing the version name in XML. Unfortunately there isn't a nice simple solution, like android.R.string.version
or something like that.

- 38,970
- 17
- 111
- 142
-
16a little note to 1.: it's working but I think it's discouraged since I get a warning telling me `The android:versionName cannot be a resource url, it must be a literal string` – Gerrit-K Apr 23 '13 at 10:44
-
1What I did is leave the manifest version name untouched (but update it whenever a new release) and use the string.xml to store the value that I'll be using across the app. – numediaweb Sep 16 '13 at 23:39
-
1For `AndroidStudio`, the manifest `versionName` is override by the one set in `build.gradle` file – Adrian C. Mar 22 '16 at 11:32
You can use the versionName
in XML resources, such as activity layouts. First create a string resource in the app/build.gradle
with the following snippet in the android
node:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
So the whole build.gradle
file contents may look like this:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '24.0.0 rc3'
defaultConfig {
applicationId 'com.example.myapplication'
minSdkVersion 15
targetSdkVersion 23
versionCode 17
versionName '0.2.3'
jackOptions {
enabled true
}
}
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:support-v4:23.3.0'
}
Then you can use @string/versionName
in the XML. Android Studio will mark it red, but the app will compile without issues. For example, this may be used like this in app/src/main/res/xml/preferences.xml
:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="About"
android:key="pref_key_about">
<Preference
android:key="pref_about_build"
android:title="Build version"
android:summary="@string/versionName" />
</PreferenceCategory>
</PreferenceScreen>

- 6,289
- 2
- 51
- 38

- 2,603
- 2
- 26
- 36
-
1Could you explain the "magic" (or my Gradle ignorance ;-) behind these lines? – DenisGL May 06 '16 at 17:55
-
3@DenisGL http://michiganlabs.com/string-constants-generated-gradle-build-configurations/#.VtB0-px96Um – Arun Shankar May 06 '16 at 18:24
-
3
-
2
-
When I use this string in a layout, I get a warning from Android Studio: "Couldn't resolve resource @string/version_name". Any idea how to get rid of it? – DenisGL Nov 05 '16 at 17:20
-
@DenisGL have you add `variant.resValue "string", "versionName", variant.versionName` in `build.gradle` ? – Arun Shankar Nov 06 '16 at 06:26
-
1this seemed like a great answer when I read it but sadly it doesn't work, at least not in the latest Android Studio. – k2col Nov 23 '16 at 14:03
-
2I am using the latest and still works for me. I use this and several other variables like this. @k2col what error do u get while compiling? Pls post ur gradle code – Arun Shankar Nov 23 '16 at 15:49
-
4
-
1
-
@A_rmas what is the error showing when you hover on the red highlight? – Arun Shankar Apr 04 '17 at 09:10
-
2@ArunElectra it is cannot resolve symbol. but it allows run and generate apk. it is just the marking of error. – A_rmas Apr 13 '17 at 07:27
-
Didn't work for me. Tried to use it in my TextView but it says "No resource found that matches the given name (at 'text' with value '@string/versionName')." – Patrick Aug 25 '17 at 19:16
-
this is the best solution , with this solution we can show different versions for different variants – Koorosh Ghorbani Dec 21 '18 at 02:07
-
Wow, great solution!!! Only bad thing is that AndroidStudio thinks that string is not recognised, but apk generates as it should! – Andris Dec 05 '19 at 13:32
IF you are using Gradle you can use the build.gradle file to programmatically add value to the xml resources at compile time.
Example Code extracted from: https://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf
buildTypes {
debug {
versionNameSuffix ".debug"
resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
}
release {
resValue "string", "app_version", "${defaultConfig.versionName}"
}
}
now use @string/app_version
as needed in XML
It will add .debug
to the version name as describe in the linked article when in debug mode.

- 1,062
- 1
- 15
- 21

- 2,708
- 5
- 49
- 111
I solved this issue by extending the Preference class.
package com.example.android;
import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;
public class VersionPreference extends Preference {
public VersionPreference(Context context, AttributeSet attrs) {
super(context, attrs);
String versionName;
final PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
versionName = null;
}
setSummary(versionName);
}
}
}
Then in my preferences XML:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>

- 191
- 1
- 2
-
Oops. I must have been thinking Preference XML based on another comment. – seastland Nov 24 '13 at 18:44
-
I use BuildConfig.VERSION_NAME.toString();
. What's the difference between that and getting it from the packageManager?
No XML based solutions have worked for me, sorry.

- 507
- 5
- 15
-
8BuildConfig.VERSION_NAME is already a string, no need to call toString() on it. – Makotosan Apr 04 '16 at 19:52
-
-
There are cases when calling this in your project may get different result from what you would expect. For example if you use an android submodule in your project and you call it from the code of the submodule it will reference to build config of the submodule which may have different version. Or if you call it from the code of your project you may reference by mistake to build config of your submodule and get the same result. Just be careful and double check that you reference to a proper package of the build config. – MikeL Oct 05 '16 at 19:55
-
Try using this guide: https://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf – CrandellWS Aug 19 '18 at 02:30
-
difference is BuilConfig is provided by Gradle whereas getting it at runtime is by PackageManager (OS) – Ishaan Kumar Jan 24 '20 at 17:58
You can't use it from the XML.
You need to extend the widget you are using in the XML and add the logic to set the text using what's mentioned on Konstantin Burov's answer.

- 91,829
- 44
- 175
- 230
Easiest solution is to use BuildConfig
.
I use BuildConfig.VERSION_NAME
in my application.
You can also use BuildConfig.VERSION_CODE
to get version code.

- 111
- 1
- 5
Late to the game, but you can do it without @string/xyz
by using ?android:attr
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="?android:attr/versionName"
/>
<!-- or -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="?android:attr/versionCode"
/>

- 38,970
- 17
- 111
- 142

- 539
- 5
- 3
-
11
-
-
-
-
-
as noted and linked It is a Constant Value of 16843292 (0x0101021c) hence why @suge got that specific value – CrandellWS Aug 19 '18 at 02:23