I am creating multiple apk's for each ABI
, I did this to assign separate version code to each apk.
ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def baseAbiVersionCode =
project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (baseAbiVersionCode != null) {
output.versionCodeOverride =
baseAbiVersionCode * 1000 + variant.versionCode
}
}
}
This is my dafaultConfig
, and the following versionCode
is for universalApk
defaultConfig {
versionCode 74
versionName "1.0.2"
}
I append the versionCode
with each service request, I also display the versionCode
in one of the activity. So i need the correct versionCode
to perform these operations, I use this code to get versionCode
int versionCode = BuildConfig.VERSION_CODE;
Now the problem is that, it displays the versionCode
that is stated in defaultConfig
and not the one that actually represents the build.
I need to know that how can i get the versionCode
that is assigned to this build, that may be some number greater than 1000
, and not the one that is assigned in dafaultConfig
To check version code you can use PackageInfo and PackageManager
try {
PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName; //version name
int verCode = pInfo.versionCode; //version code
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
You should not read build config file, build config file will display the default configuration.
You should use PackageInfo
try {
PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
Log.e("name","name"+version);
Log.e("Code","code"+pInfo.versionCode);
}catch (Exception e){
e.printStackTrace();
}
Which will display 1001 for armeabi-v7a, 1002 for mips and 1003 for x86
I asked something similar here.
Since accessing BuildConfig.VERSION_CODE
seems to be less expensive than accessing the PackageInfo
, I thought in a workaround to keep using the BuildConfig.java to retrieve the versionCode
in these situations, it's not as good as we had before with mergedFlavor.versionCode
that overrides the BuildConfig.VERSION_CODE
but since this change was made to improve the build time I'm more than happy to live with it.
First you should set the versionCode
in each flavor instead of defaultConfig
, example:
flavorDimensions 'default'
productFlavors {
hellotest {
versionCode 20
}
hellotest1 {
versionCode 10
}
}
Then and updating your code from above:
ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
// Get the versionCode statically defined in each flavor.
def versionCode = variant.productFlavors.get(0).versionCode
// Create a custom buildConfigField with the versionCode
variant.buildConfigField('int', 'OVERRIDEN_VERSION_CODE', "${versionCode}")
variant.outputs.each { output ->
def baseAbiVersionCode =
project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (baseAbiVersionCode != null) {
output.versionCodeOverride =
baseAbiVersionCode * 1000 + variant.versionCode
// Update the BuildConfig.OVERRIDEN_VERSION_CODE with the new versionCode.
// OVERRIDEN_VERSION_CODE is just an example name, you can give the name you want.
variant.buildConfigField('int', 'OVERRIDEN_VERSION_CODE', "${output.versionCodeOverride}")
}
}
}
After this you will have the correct versionCode
accessible through BuildConfig.OVERRIDEN_VERSION_CODE
anywhere in the project.