What causes this Android APK Upload error: “Non-upgradable APK”

前端 未结 6 861
醉梦人生
醉梦人生 2020-12-31 00:31

I have an Android APK in the Google Play store with an Target SDK of 23.

I have released a new version (same target SDK) and Google shows me this error:

If I

相关标签:
6条回答
  • 2020-12-31 00:34

    I'm using VS-TACO and ran into this problem.

    To slightly clarify Sanny's answer which fixed the issue for me. Apparently, somewhere along the way the android-versionCode was calculated using this formula:

    MAJOR * 100000 + MINOR * 1000 + PATCH * 10
    

    but now it is getting calculated using the version Sanny shows:

    MAJOR * 10000 + MINOR * 100 + PATCH
    

    So for example if your version was 1.3.1 android-versionCode was calculated as "103010"

    now you change the version to 1.3.2 and it is calculated the new way so the version is "10302" which is less than "103010".

    So to work around this issue (I guess forever if the android version keeps getting calculated the new way) you can add the version tag to your config.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <widget android-versionCode="103020" ...
    

    or you can go into Visual Studio and use the visual editor for config.xml, go to the "Android" section and change the "Version Code:" value.

    0 讨论(0)
  • 2020-12-31 00:37

    I ran into this issue because in my cordova config.xml the previous version was 0.0.51 and the new version was 0.0.6. But in the playstore console, those numbers were converted to 51 and 6 for the APK number. One can't "upgrade" from 51 to 6. So I changed the xml to be 0.0.60, which made the APK number 60, and voila, I can update from 51 to 60.

    0 讨论(0)
  • 2020-12-31 00:38

    I ran into a similar problem but was able to solve it with the following Node script used as part of my continuous deployment pipeline.

    Note:

    This reads from a VERSION.md file that contains the current app version.

    It may also be run with the --version argument to only update the current version in config.xml without setting the build versions.

    #!/usr/bin/env node
    
    var fs = require('fs');
    var xml2js = require('xml2js');
    const cliArgs = require('command-line-args');
    const options = cliArgs([
        {name: 'version', type: Boolean}
    ]); 
    
    // Read config.xml
    var xml = fs.readFileSync('config.xml', 'utf8');
    
    // Parse XML to JS Obj
    xml2js.parseString(xml, function (err, result) {
        if(err) {
            return console.log(err);
        }
    
        // Get JS Obj
        var obj = result;
        const version = fs.readFileSync('VERSION.md', 'utf8');
    
        if (options.version){
            // Write current version
            obj['widget']['$']['version'] = version;
        } else {
            // Increment build numbers (separately for iOS and Android)
            obj['widget']['$']['ios-CFBundleVersion'] = version;
            // remove all periods to create an integer for Android
            const [major, minor, patch] = version.split('.')
            obj['widget']['$']['android-versionCode'] = major+pad_number(minor)+pad_number(patch);
        }
    
        // Build XML from JS Obj
        var builder = new xml2js.Builder();
        var xml = builder.buildObject(obj);
    
        // Write config.xml
        fs.writeFile('config.xml', xml, function(err) {
            if(err) {
                return console.log(err);
            }
            
            console.log('Build number successfully incremented');
        });
    
    });
    
    /**
     * Pad a number with prepending zeros if less than 10
     * @see [Javascript function to pad a string](https://stackoverflow.com/questions/2686855/is-there-a-javascript-function-that-can-pad-a-string-to-get-to-a-determined-leng)
     */
    function pad_number(orig) {
        return ("00"+orig).slice(-2);
    }
    
    0 讨论(0)
  • 2020-12-31 00:50

    I got able to resolve this issue:-

    The issue was with the versioncode - I am sure you have not defined any version code in your App and it is getting generated by this formula:

     versionCode = MAJOR * 10000 + MINOR * 100 + PATCH
    

    But sometimes auto generated versioncode value of the latest release becomes smaller than the previous release (in your case 10403 < 104028) and that's why it shows non-upgradable APK.

    What you need to do is:-

    In your config.xml in tag add versioncode like below:-

    android-versionCode="104280" 
    

    104280 will work for you as it is greater than older version.

    Now get it published without any error.

    Thanks Sanny

    0 讨论(0)
  • 2020-12-31 00:55

    I just had the same issue with the versions, as I upgraded react-native to 0.60.5 So I calculated the differences between missing versionCode version

    Version 1.9 = VersionCode => 4194313

    Version 1.10 = VersionCode = 3145739

    Difference : 194313 - 3145739 = 1048574

    Each APK per architecture will use that formula

    versionCodes.get(abi) * 1048576 + defaultConfig.versionCode

    I have modified a little bit my formula

    versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + 1048574

    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // https://developer.android.com/studio/build/configure-apk-splits.html
            def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + 1048575;
            }
    
        }
    
    0 讨论(0)
  • 2020-12-31 01:00

    For those of you using Android Studio, I had this problem after upgrading from Eclipse to Android Studio and not configuring the gradle files properly.

    Make sure the version code in your build.gradle in defaultConfig{} is correct.

    ...
    defaultConfig {
        ...
        versionCode 373
        versionName "3.73"
    
    0 讨论(0)
提交回复
热议问题