导致此Android APK上传错误的原因:"不可升级的APK"

时间:2017-05-19 04:47:41

标签: android ionic2 google-play apk

我在Google Play商店中安装了Android APK,目标SDK为23。

我发布了一个新版本(相同的目标SDK),谷歌向我显示了这个错误:

如果我继续(我学到了很多困难),那么当前用户都无法升级到此版本。我不得不恢复代码,增加内部版本号并重建APK到" rollback"一个可用的版本。

然而,我无法解决为什么谷歌向我显示此错误。注意," 0支持的Android设备"是一个红鲱鱼 - 这是过去24小时内Google Play中的一个已知问题 - 如果您发布APK,则会显示实际数量的设备。

请告诉我一些关于差异是什么或导致此错误的原因:

不可升级的APK 警告 此APK的任何用户都无法升级到此版本中添加的任何新APK。 小费 确保将所有新APK添加到此版本中。 enter image description here enter image description here enter image description here

6 个答案:

答案 0 :(得分:41)

我能够解决这个问题: -

问题出在版本代码上 - 我确信你没有在你的应用程序中定义任何版本代码,它是由这个公式生成的:

 versionCode = MAJOR * 10000 + MINOR * 100 + PATCH

但有时自动生成的最新版本的版本代码值会比之前的版本(在您的情况下为10403< 104028)小,这就是为什么它显示不可升级的APK。

您需要做的是: -

在标签中的config.xml中添加如下所示的版本代码: -

android-versionCode="104280" 

104280适用于您,因为它比旧版本更强。

现在发布它没有任何错误。

谢谢Sanny

答案 1 :(得分:7)

我正在使用VS-TACO并遇到了这个问题。

略微澄清桑尼的答案,这个问题为我解决了问题。显然,在使用这个公式计算android-versionCode的过程中的某个地方:

MAJOR * 100000 + MINOR * 1000 + PATCH * 10

但现在使用Sanny显示的版本进行计算:

MAJOR * 10000 + MINOR * 100 + PATCH

例如,如果您的版本是1.3.1,则android-versionCode计算为“103010”

现在您将版本更改为1.3.2并以新方式计算,因此版本为“10302”,小于“103010”。

所以要解决这个问题(我想永远如果android版本继续以新的方式计算)你可以将版本标签添加到你的config.xml:

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

或者您可以进入Visual Studio并使用visual.xml的可视化编辑器,转到“Android”部分并更改“版本代码:”值。

答案 2 :(得分:1)

我遇到了类似的问题但是能够使用以下节点脚本来解决它,该脚本用作我的持续部署管道的一部分。

注意:

这是从包含当前应用版本的VERSION.md文件中读取的。

也可以使用--version参数运行,只更新config.xml中的当前版本而不设置构建版本。

#!/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);
}

答案 3 :(得分:0)

对于那些使用Android Studio的人来说,从Eclipse升级到Android Studio并且没有正确配置gradle文件之后我遇到了这个问题。

确保defaultConfig {}中build.gradle中的版本代码正确无误。

...
defaultConfig {
    ...
    versionCode 373
    versionName "3.73"

答案 4 :(得分:0)

我遇到了这个问题,因为在我的cordova config.xml中,以前的版本是0.0.51,新版本是0.0.6。但是在Playstore控制台中,这些数字被转换为51和6作为APK编号。人们无法升级&#34;从51到6.所以我将xml改为0.0.60,这使得APK数字为60,瞧,我可以从51更新到60.

答案 5 :(得分:0)

当我将react-native升级到0.60.5时,版本也有相同的问题 所以我计算了缺少的versionCode版本之间的差异

  

版本1.9 =版本代码=> 4194313

     

版本1.10 = VersionCode = 3145739

     

差异:194313-3145739 = 1048574

每个架构的每个APK都会使用该公式

  

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

我修改了一些公式

  

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

    }