Does BuildConfig.VERSION_CODE not get changed if w

2019-06-23 17:03发布

问题:

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

回答1:

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();
}


回答2:

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



回答3:

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.